为了使审计日志过滤按此处所述工作,必须安装审计日志插件 以及附带的审计表和函数。如果插件安装时没有附带规则型过滤所需的审计表和函数,则插件将以传统过滤模式运行,如 第 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 Enterprise Audit”.要使用任何过滤功能,用户必须拥有
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 Enterprise Audit”中提供的说明进行安装。使用这些功能需要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()
,以强制重新加载所有过滤器。否则,应避免使用此函数。实际上,它是一个简化的卸载和重新加载audit_log
插件的版本,使用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 |
+-----------------------+