MySQL审核日志过滤
注意本节介绍了在安装了审计日志插件以及随附的审计表和UDF的情况下审计日志过滤的工作方式。如果已安装插件,但未安装随附的审核表和UDF,则该插件将在旧版筛选模式下运行,如“旧版模式审核日志筛选”所述。传统模式用于过滤行为,与MySQL 5.7.13之前的模式相同;也就是说,在引入基于规则的过滤之前。
审核日志插件具有通过过滤审核事件来控制其记录的功能:
可以使用以下特征来过滤审核的事件:
- 用户帐号
- 审核事件类别
- 审核事件子类
- 事件字段的值,例如指示操作状态或已执行的SQL语句的字段
审核过滤基于规则:
- 过滤器定义将创建一组审核规则。可以将定义配置为基于刚刚描述的特征包括或排除事件以进行日志记录。
- 除现有的事件记录功能外,过滤器规则还具有阻止(中断)合格事件执行的功能。
- 可以定义多个过滤器,并且可以将任何给定的过滤器分配给任意数量的用户帐户。
- 可以定义默认过滤器,以与没有明确分配过滤器的任何用户帐户一起使用。
- 可以使用基于用户定义函数(UDF)的SQL接口定义,显示和修改审核筛选器。
- 审核筛选器定义存储在
mysql
系统数据库的表中。 - 在给定的会话中,只读
udit_log_filter_id
系统变量的值指示是否已将过滤器分配给该会话。
注意默认情况下,基于规则的审核日志筛选不会记录任何用户的可审核事件。要记录所有用户的所有可审核事件,请使用以下语句,这些语句创建一个简单的过滤器以启用日志记录并将其分配给默认帐户:
SELECT audit_log_filter_set_filter('log_all', '{ "filter": { "log": true } }');SELECT audit_log_filter_set_user('%', 'log_all');
分配给的过滤器%
用于来自没有明确分配过滤器的任何帐户的连接(最初对所有帐户都是如此)。
以下列表简要总结了实现用于审计筛选控制的SQL接口的UDF:
udit_log_filter_set_filter()
:定义一个过滤器udit_log_filter_remove_filter()
:删除过滤器udit_log_filter_set_user()
:开始过滤用户帐户udit_log_filter_remove_user()
:停止过滤用户帐户udit_log_filter_flush()
:刷新对过滤器表的手动更改以影响正在进行的过滤
有关用法示例和有关筛选功能的完整详细信息,请参阅使用审核日志筛选功能和审核日志功能。
审核日志过滤功能受以下约束:
- 要使用任何过滤功能,
udit_log
必须启用插件或发生错误。此外,审核表必须存在或发生错误。要安装udit_log
插件及其随附的UDF和表,请参见“MySQL企业防火墙”。 要使用任何过滤功能,用户必须拥有
SUPER
特权或发生错误。要将SUPER
特权授予用户帐户,请使用以下语句:GRANT SUPER ON *.*TO user;另外,如果您希望避免在授予许可的
SUPER
同时仍允许用户访问特定的过滤功能,则可以定义“包装”存储的程序。在使用通用密钥环函数中的密钥环UDF的上下文中描述了此技术;它可以适用于过滤UDF。udit_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.'
在旧模式下,只能基于事件帐户或状态来进行过滤。有关详细信息,请参见“传统模式审核日志过滤”。
- 使用审核日志过滤功能
使用审核日志过滤功能
在使用审核日志用户定义函数(UDF)之前,请根据“安装或卸载MySQL企业审核”中提供的说明进行安装。该SUPER
权限才能使用任何的这些功能。
审核日志过滤功能通过提供创建,修改和删除过滤器定义并将过滤器分配给用户帐户的界面来启用过滤控制。
过滤器定义是JSON
值。有关JSON
在MySQL中使用数据的信息,请参见“ JSON数据类型”。本节显示一些简单的过滤器定义。有关过滤器定义的更多信息,请参见“编写审核日志过滤器定义”。
当连接到达时,审核日志插件通过在当前过滤器分配中搜索用户帐户名称来确定用于新会话的过滤器:
- 如果为用户分配了过滤器,则审核日志将使用该过滤器。
- 否则,如果不存在特定于用户的过滤器分配,但是有分配给默认帐户(
%
)的过滤器,则审核日志将使用默认过滤器。 - 否则,审核日志不会从会话中选择任何审核事件进行处理。
如果在会话期间发生更改用户操作(请参见“ mysql_change_user()”),则使用相同的规则(但对于新用户)更新会话的过滤器分配。
默认情况下,没有为帐户分配过滤器,因此任何帐户都不会处理可审核事件。
假设您希望默认设置为仅记录与连接有关的活动(例如,参见connect,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');
删除过滤器还会从已分配过滤器的所有用户中取消分配该过滤器,包括这些用户的当前会话。
刚刚描述的过滤UDF立即影响审计过滤,并更新mysql
系统数据库中存储过滤器和用户帐户的审计日志表(请参阅审计日志表)。也可以直接使用语句,如修改审计日志表INSERT
,UPDATE
和DELETE
,但这样的变化不影响立即过滤。要刷新您的更改并使它们可操作,请致电 udit_log_filter_flush()
:
SELECT audit_log_filter_flush();
警告
udit_log_filter_flush()
仅应在直接修改审核表后才使用,以强制重新加载所有过滤器。否则,应避免使用此功能。实际上,它是udit_log
使用UNINSTALL PLUGIN
plus 卸载和重新加载插件的简化版本INSTALL PLUGIN
。
udit_log_filter_flush()
影响所有当前会话,并将它们与以前的过滤器分离。除非断开并重新连接或执行更改用户操作,否则将不再记录当前会话。
要确定是否已将过滤器分配给当前会话,请检查只读 udit_log_filter_id
系统变量的会话值。如果值为0,则不分配过滤器。非零值表示分配的过滤器的内部维护ID:
mysql>SELECT @@audit_log_filter_id; +----------------------- + | @@audit_log_filter_id | +----------------------- + | 2 | +----------------------- +