为了使审计日志过滤按此处所述的方式工作,必须安装审计日志插件以及随附的审计表和函数。如果在没有安装用于基于规则过滤的随附审计表和函数的情况下安装了插件,则插件将以传统过滤模式运行,如第 8.4.5.10 节,“传统模式审计日志过滤”中所述。传统模式(已弃用)是在 MySQL 5.7.13 之前(即在引入基于规则过滤之前)的过滤行为;也就是说,它是在基于规则过滤出现之前,审计日志插件过滤事件的方式。
审计日志插件能够通过过滤审计事件来控制审计事件的日志记录
审计事件可以使用以下特征进行过滤
用户帐户
审计事件类别
审计事件子类别
审计事件字段,例如指示操作状态或执行的 SQL 语句的字段
审计过滤是基于规则的
过滤器定义创建一组审计规则。可以配置定义以根据上述特征包含或排除要日志记录的事件。
过滤器规则除了现有的事件日志记录功能外,还可以阻止(中止)符合条件的事件的执行。
可以定义多个过滤器,并且任何给定的过滤器可以分配给任意数量的用户帐户。
可以定义一个默认过滤器,用于与任何没有显式分配过滤器的用户帐户一起使用。
审计日志过滤用于实现组件服务。要获得该版本中提供的可选查询统计信息,请使用服务组件将它们设置为过滤器,该组件实现了将统计信息写入审计日志的服务。有关设置此过滤器的说明,请参见添加查询统计信息以进行异常值检测。
有关编写过滤规则的信息,请参见第 8.4.5.8 节,“编写审计日志过滤器定义”。
可以使用基于函数调用的 SQL 接口定义和修改审计过滤器。要显示审计过滤器,请查询
mysql.audit_log_filter
表。审计过滤器定义存储在
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_filter()
: 定义过滤器。audit_log_filter_remove_filter()
: 删除过滤器。audit_log_filter_set_user()
: 开始过滤用户帐户。audit_log_filter_remove_user()
: 停止过滤用户帐户。audit_log_filter_flush()
: 将手动更改刷新到过滤器表,以影响正在进行的过滤。
有关过滤功能的使用示例和完整详细信息,请参见 使用审计日志过滤功能 和 审计日志函数。
审计日志过滤功能受以下限制
要使用任何过滤功能,必须启用
audit_log
插件,否则会发生错误。此外,审计表必须存在,否则会发生错误。要安装audit_log
插件及其附带的功能和表,请参见 第 8.4.5.2 节,“安装或卸载 MySQL 企业审计”。要使用任何过滤功能,用户必须拥有
AUDIT_ADMIN
SUPER
权限,否则会发生错误。要将这些权限之一授予用户帐户,请使用以下语句GRANT privilege ON *.* TO user;
或者,如果您希望避免授予
AUDIT_ADMIN
或SUPER
权限,同时仍允许用户访问特定过滤功能,可以定义 “包装器” 存储程序。此技术在 使用通用密钥环功能 中的密钥环功能的上下文中进行了描述;它可以适用于过滤功能。如果安装了
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 节,“旧模式审计日志过滤”。
理论上,拥有足够权限的用户可能会错误地在审计日志过滤器中创建 “中止” 项目,从而阻止自己和其他管理员访问系统。提供
AUDIT_ABORT_EXEMPT
权限是为了允许用户帐户的查询始终执行,即使 “中止” 项目会阻止它们。因此,可以将拥有此权限的帐户用于在审计配置错误后重新访问系统。该查询仍将记录在审计日志中,但不会被拒绝,而是由于权限而被允许。使用
SYSTEM_USER
权限创建的帐户在创建时会自动分配AUDIT_ABORT_EXEMPT
权限。如果您执行升级过程,如果现有帐户未分配该权限,则也会将AUDIT_ABORT_EXEMPT
权限分配给拥有SYSTEM_USER
权限的现有帐户。
在使用审计日志功能之前,请按照 第 8.4.5.2 节,“安装或卸载 MySQL 企业审计” 中提供的说明进行安装。使用任何这些功能都需要 AUDIT_ADMIN
或 SUPER
权限。
审计日志过滤功能通过提供创建、修改和删除过滤器定义以及将过滤器分配给用户帐户的接口来启用过滤控制。
过滤器定义是 JSON
值。有关在 MySQL 中使用 JSON
数据的信息,请参见 第 13.5 节,“JSON 数据类型”。本节展示了一些简单的过滤器定义。有关过滤器定义的更多信息,请参见 第 8.4.5.8 节,“编写审计日志过滤器定义”。
当连接到达时,审计日志插件通过在当前过滤器分配中搜索用户帐户名称来确定对新会话使用哪个过滤器
如果将过滤器分配给用户,则审计日志将使用该过滤器。
否则,如果不存在特定于用户的过滤器分配,但有一个过滤器分配给默认帐户 (
%
),则审计日志将使用默认过滤器。否则,审计日志将不从会话中选择任何审计事件进行处理。
如果在会话期间发生更改用户操作(请参见 mysql_change_user()),则使用相同的规则更新会话的过滤器分配,但针对新用户。
默认情况下,没有帐户分配过滤器,因此不会对任何帐户进行可审计事件的处理。
假设您要更改默认值,以仅记录与连接相关的活动(例如,要查看连接、更改用户和断开连接事件,但不查看用户在连接时执行的 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');
对帐户的当前会话的过滤保持不变。来自帐户的后续连接将使用默认帐户过滤器进行过滤(如果有),否则不会记录。
要将不同的过滤器分配给用户帐户
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
系统数据库中的审计日志表(请参见 审计日志表)。也可以使用诸如 INSERT
、UPDATE
和 DELETE
之类的语句直接修改审计日志表,但此类更改不会立即影响过滤。要刷新更改并使其生效,请调用 audit_log_filter_flush()
SELECT audit_log_filter_flush();
audit_log_filter_flush()
仅应在直接修改审计表后使用,以强制重新加载所有过滤器。否则,应避免使用此函数。实际上,它只是使用 UNINSTALL PLUGIN
加 INSTALL PLUGIN
卸载和重新加载 audit_log
插件的简化版本。
audit_log_filter_flush()
会影响所有当前会话并将其从其先前的过滤器中分离。当前会话将不再记录,除非它们断开连接并重新连接,或执行更改用户操作。
要确定是否将过滤器分配给当前会话,请检查只读 audit_log_filter_id
系统变量的会话值。如果值为 0,则未分配过滤器。非零值表示分配的过滤器的内部维护 ID
mysql> SELECT @@audit_log_filter_id;
+-----------------------+
| @@audit_log_filter_id |
+-----------------------+
| 2 |
+-----------------------+