要像这里描述的那样进行审计日志过滤,请使用审计日志插件以及附带的审计表和函数必须安装。如果安装插件时没有附带基于规则的过滤所需的审计表和函数,则插件将在遗留过滤模式下运行,如章节6.4.5.9,“遗留模式审计日志过滤”.遗留模式是过滤行为,因为它是在MySQL 5.7.13之前;也就是说,在引入基于规则的过滤之前。
审计日志插件可以通过过滤来控制审计事件的日志记录:
审计事件可以使用以下特征进行过滤:
用户帐户
审计事件类
审计事件子类
审计事件字段,如指示操作状态或已执行SQL语句的事件字段
审计过滤基于规则:
筛选器定义创建一组审计规则。可以根据刚才描述的特征配置定义,以包括或排除用于日志记录的事件。
除了现有的事件记录功能外,筛选规则还具有阻止(中止)合格事件执行的功能。
可以定义多个过滤器,并且可以将任何给定的过滤器分配给任意数量的用户帐户。
可以定义一个默认筛选器,用于没有显式分配筛选器的任何用户帐户。
有关编写过滤规则的信息,请参见6.4.5.8节“编写审计日志过滤器定义”.
可以使用基于函数调用的SQL接口定义、显示和修改审计过滤器。
中的表中存储审计筛选器定义
mysql
系统数据库。在给定会话中,read-only的值
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 ()
:开始过滤用户账号。audit_log_filter_remove_user ()
:停止过滤用户账号。audit_log_filter_flush ()
:刷新对筛选表的手动更改,以影响正在进行的筛选。
有关过滤功能的使用示例和完整详细信息,请参见使用审计日志过滤功能,审计日志功能.
审计日志过滤功能受以下约束:
要使用任何过滤函数,请使用
audit_log
必须启用插件,否则将发生错误。此外,审计表必须存在,否则会发生错误。安装audit_log
插件及其附带的函数和表,参见章节6.4.5.2“安装或卸载MySQL企业审计”.要使用任何过滤功能,用户必须拥有
AUDIT_ADMIN
超级
特权或发生错误。要将这些特权之一授予用户帐户,请使用以下语句:格兰特特权*。*用户;
或者,您是否愿意避免授予
AUDIT_ADMIN
或超级
特权,同时仍然允许用户访问特定的过滤功能,”包装器”存储程序可以被定义。中keyring函数的上下文中描述了此技术使用通用密匙环功能;它可以与过滤功能一起使用。的
audit_log
如果安装了插件,但是没有创建相应的审计表和函数,则插件以遗留模式运行。插件在服务器启动时将这些消息写到错误日志中:[警告]Plugin audit_log报告:'未能打开审计日志过滤表。'[警告]插件audit_log报告:'审计日志插件支持过滤,尚未安装。审计日志插件将以传统模式运行,在下一个版本中将禁用。”
在遗留模式中,只能基于事件帐户或状态进行过滤。详细信息请参见章节6.4.5.9,“遗留模式审计日志过滤”.
在使用审计日志功能之前,请参考章节6.4.5.2“安装或卸载MySQL企业审计”.的AUDIT_ADMIN
或超级
使用这些函数都需要特权。
审计日志过滤功能通过提供一个接口来创建、修改和删除过滤器定义,并为用户帐户分配过滤器,从而支持过滤控制。
筛选器定义如下JSON
值。有关使用JSON
数据在MySQL,见第11.5节“JSON数据类型”.本节将展示一些简单的筛选器定义。有关筛选器定义的详细信息,请参见6.4.5.8节“编写审计日志过滤器定义”.
当连接到达时,审计日志插件通过在当前过滤器分配中搜索用户帐户名来确定为新会话使用哪个过滤器:
如果给用户分配了一个过滤器,审计日志就使用这个过滤器。
否则,如果不存在特定于用户的筛选器分配,但有分配给默认帐户的筛选器(
%
),审计日志使用默认过滤器。否则,审计日志不会从会话中选择审计事件进行处理。
如果在会话期间发生更改用户操作(请参阅mysql_change_user ()),会话的过滤器分配使用相同的规则更新,只是针对新用户。
默认情况下,没有帐户分配过滤器,因此任何帐户都不会发生可审计事件的处理。
假设您希望将默认值更改为仅记录与连接相关的活动(例如,查看连接、更改用户和断开连接事件,但不记录用户在连接时执行的SQL语句)。要实现这一点,定义一个名为log_conn_events
中事件的日志记录连接
类,并将该筛选器分配给默认帐户,该帐户由%
帐户名称:
设置@f = '{“过滤器”:{“类”:{“名称”:“连接”}}}';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
.继续使用默认帐户筛选器筛选来自其他帐户的连接。
要解除用户帐户与其当前筛选器的关联,要么取消分配筛选器,要么分配不同的筛选器:
从用户帐户中取消分配过滤器:
选择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
.
对于审计日志过滤,用户名和主机名比较区分大小写。这与特权检查的比较不同,后者的主机名比较不区分大小写。
要移除过滤器,请执行以下操作:
选择audit_log_filter_remove_filter(“log_nothing”);
删除筛选器还会将其从分配给其的任何用户中取消分配,包括这些用户的当前会话。
中描述的过滤函数会立即影响审计过滤并更新审计日志表mysql
存储过滤器和用户帐户的系统数据库(请参阅审计日志表).也可以直接使用语句修改审计日志表插入
,更新
,删除
,但这些变化不会立即影响过滤。若要刷新更改并使其可操作,请调用audit_log_filter_flush ()
:
选择audit_log_filter_flush ();
audit_log_filter_flush ()
应该仅在直接修改审计表后使用,以强制重新加载所有过滤器。否则,应该避免使用此函数。实际上,它是卸载和重新加载的简化版本audit_log
插件与卸载插件
+安装插件
.
audit_log_filter_flush ()
影响所有当前会话,并将它们从以前的筛选器中分离出来。当前会话不再被记录,除非它们断开连接并重新连接,或执行更改用户操作。
要确定是否为当前会话分配了过滤器,请检查read-only的会话值audit_log_filter_id
系统变量。如果值为0,表示没有分配过滤器。非零值表示分配过滤器的内部维护ID:
SELECT audit_log_filter_id;+-----------------------+ | @@ audit_log_filter_id | +-----------------------+ | 2 | +-----------------------+