Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

8.4.5.7 审计日志过滤

Note

要使审计日志过滤如这里所述工作,审计日志插件 和伴随的审计表和函数 必须安装。如果插件安装没有伴随的审计表和函数来实现基于规则的过滤,则插件将在遗留模式下操作,描述在 第 8.4.5.10 节,“遗留模式审计日志过滤”。遗留模式(已弃用)是指 MySQL 5.7.13 之前的过滤行为,即在引入基于规则的过滤之前的行为。

审计日志过滤属性

审计日志插件具有控制审计事件的日志记录的能力,通过过滤它们:

  • 审计事件可以根据以下特征进行过滤:

    • 用户账户

    • 审计事件类

    • 审计事件子类

    • 审计事件字段,如操作状态或执行的 SQL 语句

  • 审计过滤基于规则:

    • 过滤定义创建了一组审计规则。定义可以根据上述特征配置以包括或排除事件的日志记录。

    • 过滤规则可以阻止(中止)符合条件的事件的执行,除了现有的事件日志记录能力。

    • 可以定义多个过滤器,每个过滤器可以分配给任意数量的用户账户。

    • 可以定义一个默认的过滤器,以便与没有明确分配过滤器的任何用户账户一起使用。

    审计日志过滤用于实现组件服务。要获取该版本可用的查询统计信息,请将其设置为使用服务组件,该组件实现了将统计信息写入审计日志的服务。有关设置该过滤器的说明,请参见 添加查询统计信息以检测异常

    有关编写过滤规则的信息,请参见 第 8.4.5.8 节,“编写审计日志过滤定义”

  • 审计过滤器可以使用基于 SQL 的接口定义和修改。要显示审计过滤器,请查询 mysql.audit_log_filter 表。

  • 审计过滤器定义存储在 mysql 系统数据库中的表中。

  • 在给定的会话中,读取 전용的 audit_log_filter_id 系统变量指示会话是否分配了过滤器。

Note

默认情况下,基于规则的审计日志过滤不记录任何用户的可审核事件。要记录所有用户的所有可审核事件,请使用以下语句,这些语句创建一个简单的过滤器以启用日志记录并将其分配给默认帐户:

SELECT audit_log_filter_set_filter('log_all', '{ "filter": { "log": true } }');
SELECT audit_log_filter_set_user('%', 'log_all');

分配给 % 的过滤器用于来自任何帐户的连接,该帐户没有明确分配的过滤器(初始情况下所有帐户都是如此)。

如前所述,SQL 接口的审计过滤控制基于函数。以下列表简要总结了这些函数:

有关使用示例和过滤函数的完整详细信息,请参阅 使用审计日志过滤函数审计日志函数

审计日志过滤函数约束

审计日志过滤函数受以下约束:

  • 要使用任何过滤函数,audit_log 插件必须启用,否则将出现错误。此外,审计表必须存在,否则将出现错误。要安装 audit_log 插件及其伴随的函数和表,请参阅 第 8.4.5.2 节,“安装或卸载 MySQL 企业审计”

  • 要使用任何过滤函数,用户必须拥有 AUDIT_ADMIN SUPER 权限,否则将出现错误。要授予用户帐户之一的权限,请使用以下语句:

    GRANT privilege ON *.* TO user;

    或者,如果您想避免授予AUDIT_ADMINSUPER权限,同时仍允许用户访问特定的过滤函数,可以定义“wrapper”存储程序。这项技术在使用通用密钥环函数中进行了描述;它可以被适用于过滤函数。

  • 如果audit_log插件安装了,但伴随的审核表和函数没有创建,那么它将以遗留模式运作。在服务器启动时,它将写入错误日志:

    [Warning] Plugin audit_log reported: 'Failed to open the audit log filter tables.'
    [Warning] Plugin audit_log reported: 'Audit Log plugin supports a filtering,
    which has not been installed yet. Audit Log plugin will run in the legacy
    mode, which will be disabled in the next release.'

    在遗留模式下,过滤只能基于事件帐户或状态进行。有关详细信息,请参阅第 8.4.5.10 节,“遗留模式审核日志过滤”

  • 理论上,具有足够权限的用户可能会错误地在审核日志过滤器中创建一个“abort”项,从而阻止自己和其他管理员访问系统。AUDIT_ABORT_EXEMPT权限可用于允许用户账户的查询始终被执行,即使“abort”项阻止它们。具有该权限的账户可以因此被用于在审核misconfiguration后恢复系统访问。查询仍将被记录在审核日志中,但由于权限的存在,它将被允许而不是被拒绝。

    使用SYSTEM_USER权限创建的账户将自动分配AUDIT_ABORT_EXEMPT权限。当您执行升级过程时,如果没有现有的账户分配该权限,那么现有的账户也将被分配该权限。

使用审核日志过滤函数

在使用审核日志函数之前,请按照第 8.4.5.2 节,“安装或卸载 MySQL Enterprise Audit”中的说明安装它们。AUDIT_ADMINSUPER权限是使用这些函数所需的。

审核日志过滤函数通过提供创建、修改和删除过滤器定义的接口,并将过滤器分配给用户账户,以控制过滤。

过滤器定义是 JSON 值。有关在 MySQL 中使用 JSON 数据的信息,请参阅 第 13.5 节,“JSON 数据类型”。本节显示了一些简单的过滤器定义。有关过滤器定义的更多信息,请参阅 第 8.4.5.8 节,“编写审计日志过滤器定义”

当连接到达时,审计日志插件通过在当前过滤器分配中搜索用户账户名称来确定要使用的过滤器:

  • 如果分配了用户的过滤器,审计日志将使用该过滤器。

  • 否则,如果没有用户特定的过滤器分配,但存在默认账户 (%) 的过滤器分配,审计日志将使用默认过滤器。

  • 否则,审计日志将不处理会话中的任何审核事件。

如果在会话期间发生更改用户操作(参阅 mysql_change_user()),则会话的过滤器分配将根据相同的规则更新,但针对新的用户。

默认情况下,任何账户都没有分配过滤器,因此不会对任何账户进行审核事件的处理。

假设您想将默认值更改为仅记录连接相关活动(例如,查看连接、更改用户和断开连接事件,但不包括用户执行的 SQL 语句)。为实现此目的,定义一个名为 log_conn_events 的过滤器,该过滤器仅启用连接类事件的记录,并将其分配给默认账户,表示为 % 账户名称:

SET @f = '{ "filter": { "class": { "name": "connection" } } }';
SELECT audit_log_filter_set_filter('log_conn_events', @f);
SELECT audit_log_filter_set_user('%', 'log_conn_events');

现在,审计日志将使用此默认账户过滤器来处理来自任何账户的连接,该账户没有明确定义的过滤器。

要将过滤器明确分配给特定用户账户或账户,请定义过滤器,然后将其分配给相关账户:

SELECT audit_log_filter_set_filter('log_all', '{ "filter": { "log": true } }');
SELECT audit_log_filter_set_user('user1@localhost', 'log_all');
SELECT audit_log_filter_set_user('user2@localhost', 'log_all');

现在,user1@localhostuser2@localhost 的完整日志记录已启用。来自其他账户的连接将继续使用默认账户过滤器。

要将用户账户与其当前过滤器分离,可以取消分配过滤器或分配不同的过滤器:

  • 要取消用户账户的过滤器分配:

    SELECT audit_log_filter_remove_user('user1@localhost');

    当前会话的过滤器分配保持不变。来自该账户的后续连接将使用默认账户过滤器,如果存在默认账户过滤器,否则不记录。

  • 要将不同的过滤器分配给用户账户:

    SELECT audit_log_filter_set_filter('log_nothing', '{ "filter": { "log": false } }');
    SELECT audit_log_filter_set_user('user1@localhost', 'log_nothing');

    当前会话的过滤器分配保持不变。来自该账户的后续连接将使用新的过滤器。对于这里显示的过滤器,这意味着 user1@localhost 的新连接将不记录。

对于审计日志过滤,用户名和主机名比较是区分大小写的。这与特权检查的比较不同,后者对主机名比较不区分大小写。

要删除过滤器,请执行以下操作:

SELECT audit_log_filter_remove_filter('log_nothing');

删除过滤器也将取消其对任何用户的分配,包括当前会话中的用户。

刚才描述的过滤函数会立即影响审核过滤并更新 mysql 系统数据库中的审核日志表(见 审核日志表),这些表存储过滤器和用户账户。也可以使用语句直接修改审核日志表,如 INSERTUPDATEDELETE,但这些更改不会立即影响过滤。要刷新更改并使其生效,请调用 audit_log_filter_flush()

SELECT audit_log_filter_flush();
Warning

audit_log_filter_flush() 只应该在直接修改审核表后使用,以强制重新加载所有过滤器。否则,这个函数应该避免使用。它实际上是卸载和重新加载 audit_log 插件的简化版本,使用 UNINSTALL PLUGININSTALL PLUGIN

audit_log_filter_flush() 会影响所有当前会话,并将它们从之前的过滤器中分离。当前会话将不再被记录,除非它们断开连接并重新连接,或者执行更改用户操作。

要确定当前会话是否分配了过滤器,可以检查只读系统变量 audit_log_filter_id 的会话值。如果值为 0,则没有分配过滤器。非零值表示分配的过滤器的内部维护 ID:

mysql> SELECT @@audit_log_filter_id;
+-----------------------+
| @@audit_log_filter_id |
+-----------------------+
|                     2 |
+-----------------------+