8.4.5.7 审计日志过滤
为了使审计日志过滤按照这里描述的方式工作,必须安装审计日志插件和伴随的审计表和函数。如果插件没有安装伴随的审计表和函数,用于基于规则的过滤,插件将在遗留模式下运行,见第8.4.5.10节,“遗留模式审计日志过滤”。遗留模式(已弃用)是MySQL 5.7.13之前的过滤行为,即在规则基于过滤之前。
审计日志过滤属性
审计日志插件可以控制审核事件的记录,通过过滤它们:
-
可以使用以下特征来过滤审核事件:
-
用户账户
-
审计事件类别
-
审计事件子类别
-
审计事件字段,如表示操作状态或执行的SQL语句
-
-
审计过滤是基于规则的:
-
过滤定义创建了 auditing 规则。可以根据前述特征配置规则,包括或排除事件以供日志记录。
-
过滤规则具有阻止(中断)符合条件的事件执行的能力,除了现有的事件日志记录能力外。
-
可以定义多个过滤器,并将任何给定的过滤器分配给任意数量的用户账户。
-
可以为没有明确分配过滤器的用户账户指定默认过滤器。
Audit日志过滤用于实现组件服务。要获取该版本中的可选查询统计信息,您需要将其设置为过滤器,使用服务组件,该组件实现了写入 Audit 日志的统计信息。关于如何设置这个过滤器,请见添加查询统计信息以检测异常。
关于编写过滤规则的信息,请见第8.4.5.8节,“编写 Audit 日志过滤定义”。
-
-
可以使用基于函数调用接口来定义和修改 audit 过滤器。要显示 audit 过滤器,请查询
mysql.audit_log_filter
表。 -
audit 过滤器定义存储在
mysql
系统数据库中的表中。 -
在一个会话中,只读
audit_log_filter_id
系统变量的值指示是否将过滤器分配给该会话。
默认情况下,基于规则的审核日志过滤不记录任何用户的可审计事件。要记录所有用户的可审计事件,请使用以下语句,创建一个简单的过滤器来启用记录,并将其分配给默认账户:
SELECT audit_log_filter_set_filter('log_all', '{ "filter": { "log": true } }');
SELECT audit_log_filter_set_user('%', 'log_all');
将%
分配到的过滤器用于来自没有明确分配过滤器的所有账户(初始情况下都是真的)。
如前所述,审核过滤控制的 SQL 接口是基于函数的。以下列表简要总结这些函数:
-
audit_log_filter_set_user()
:开始 filtering 用户账户。 -
audit_log_filter_remove_user()
:停止 filtering 用户账户。 -
audit_log_filter_flush()
:将手动更改的过滤器表中的更改刷新到影响 ongoing filtering 中。
关于过滤函数的使用示例和完整信息,请见使用审核日志过滤函数,和审核日志函数。
审核日志过滤函数约束
审核日志过滤函数受以下约束:
-
要使用任何过滤函数,必须启用
audit_log
插件或发生错误。另外,审核表必须存在或发生错误。要安装audit_log
插件及其伴随函数和表,请参阅第8.4.5.2节,“MySQL企业审核安装”。 -
要使用任何过滤函数,用户必须拥有
AUDIT_ADMIN
和SUPER
特权或发生错误。要将这些特权授予用户账户,使用以下语句:GRANT privilege ON *.* TO user;
或者,如果您想避免授予
AUDIT_ADMIN
或SUPER
特权,同时仍然允许用户访问特定的过滤函数,可以定义““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”项阻止它们。拥有这个特权的账户可以用来在审核配置错误后重新访问系统。该查询仍然被记录到审核日志,但是由于特权而不是被拒绝。使用
SYSTEM_USER
权限创建的账户,自动分配AUDIT_ABORT_EXEMPT
权限。同时,在升级过程中,如果没有已有账户拥有该权限,也会将SYSTEM_USER
权限分配给已有账户。
使用审计日志过滤函数
在使用审计日志函数前,按照第8.4.5.2节,“安装或卸载 MySQL Enterprise Audit”中的说明进行安装。使用这些函数需要AUDIT_ADMIN
或SUPER
权限。
审计日志过滤函数可以控制过滤,提供创建、修改和删除过滤定义的接口,并将过滤器分配给用户账户。
JSON
值是过滤定义。关于在 MySQL 中使用 JSON
数据的信息,见第13.5节,“JSON 数据类型”。该节展示了一些简单的过滤定义。关于过滤定义的更多信息,见第8.4.5.8节,“编写审计日志过滤定义”。
当连接到来时,审计日志插件确定新会话使用哪个过滤器:
-
如果将过滤器分配给用户,审计日志就使用该过滤器。
-
否则,如果没有用户专属的过滤器分配,但存在默认账户(
%
)的过滤器,审计日志就使用默认过滤器。 -
否则,审计日志不对会话中的事件进行处理。
如果会话中发生更改用户操作(见mysql_change_user()),会话的过滤器分配将根据同样的规则更新为新用户。
默认情况下,没有账户拥有过滤器,所以对任何账户都不会处理可审计事件。
假设你想将默认设置改为只记录连接相关活动(例如,查看connect、change-user和disconnect事件,但不记录用户在连接时执行的SQL语句)。要实现这个目标,定义一个过滤器(如这里命名为log_conn_events
),使其仅对connection
类别的事件进行日志记录,然后将该过滤器分配给默认账户,使用%
表示默认账户名称:
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@localhost
和user2@localhost
启用了全量日志记录。来自其他账户的连接继续使用默认账户过滤器。
要取消用户账户当前的过滤器,或者分配不同的过滤器:
-
取消账户当前会话的过滤效果不受影响。该账户的后续连接将使用默认账户过滤器,如果没有默认账户过滤器,则不记录日志。
SELECT audit_log_filter_remove_user('user1@localhost');
要分配不同的过滤器到用户账户:
-
To assign a different filter to the user account:
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');
删除过滤器也会将其从已分配给用户的任何会话中解除绑定,包括当前会话。
前面描述的过滤函数立即影响审核 filtering,并更新存储过滤器和用户账户的审核日志表,位于 mysql
系统数据库中。也可以使用语句,如INSERT
、UPDATE
和DELETE
,修改审核日志表,但这些更改不立即生效。要使更改生效,调用audit_log_filter_flush()
:
SELECT audit_log_filter_flush();
audit_log_filter_flush()
应该在直接修改审核表后使用,强制重新加载所有过滤器。否则,这个函数应该避免使用。它实际上是UNINSTALL PLUGIN
和INSTALL PLUGIN
的简化版本。
audit_log_filter_flush()
对当前所有会话产生影响,断开它们与之前的过滤器连接。当前会话除非断开重新连接或执行更改用户操作,不再被记录。
要确定当前会话是否分配了过滤器,可以检查只读系统变量audit_log_filter_id
的值。如果值为0,表示没有分配过滤器;非零值表示已分配过滤器的内部维护ID:
mysql> SELECT @@audit_log_filter_id;
+-----------------------+
| @@audit_log_filter_id |
+-----------------------+
| 2 |
+-----------------------+