6.4.5.7 审核日志过滤

Note

本节描述了自从 MySQL 5.7.13 起,如果安装了审计日志插件以及随附的审计 table 和 UDF,审计日志过滤的工作方式。如果安装了插件但未安装随附的审核 table 和 UDF,则该插件将以旧过滤模式运行,如第 6.4.5.9 节“旧模式审核日志过滤”所述。传统模式用于过滤行为,与 MySQL 5.7.13 之前的模式相同;也就是说,在引入基于规则的过滤之前。

审核日志插件具有通过过滤审核事件来控制其记录的功能:

  • 可以使用以下 Feature 来过滤审核的事件:

  • User account

    • 审核事件类别

    • 审核事件子类

    • 事件字段的值,例如指示操作状态或已执行的 SQL 语句的字段

  • 审核过滤基于规则:

  • 筛选器定义将创建一组审核规则。可以将定义配置为基于刚刚描述的 Feature 包括或排除事件以进行日志记录。

    • 从 MySQL 5.7.20 开始,过滤规则除了具有现有的事件记录功能外,还具有阻止(终止)合格事件执行的功能。

    • 可以定义多个过滤器,并且可以将任何给定的过滤器分配给任意数量的用户帐户。

    • 可以定义默认过滤器,以与没有明确分配过滤器的任何用户帐户一起使用。

  • 可以使用基于用户定义函数(UDF)的 SQL 接口定义,显示和修改审核筛选器。

  • 审核筛选器定义存储在mysql系统数据库的 table 中。

  • 在给定的会话中,只读audit_log_filter_id系统变量的值指示是否已将过滤器分配给该会话。

Note

默认情况下,基于规则的审核日志筛选不会记录任何用户的可审核事件。要记录所有用户的所有可审核事件,请使用以下语句,这些语句创建一个简单的过滤器以启用日志记录并将其分配给默认帐户:

SELECT audit_log_filter_set_filter('log_all', '{ "filter": { "log": true } }');
SELECT audit_log_filter_set_user('%', 'log_all');

分配给%的过滤器用于来自没有明确分配过滤器的帐户的连接(最初对所有帐户都是如此)。

以下列 table 简要总结了实现用于审计筛选控制的 SQL 接口的 UDF:

有关用法示例和有关过滤功能的完整详细信息,请参见使用审核日志过滤功能审核日志功能

审核日志过滤功能受以下约束:

  • 要使用任何过滤功能,必须启用audit_log插件,否则会发生错误。此外,审核 table 必须存在或发生错误。要安装audit_log插件及其随附的 UDF 和 table,请参阅第 6.4.5.2 节“安装或卸载 MySQL 企业审核”

  • 要使用任何过滤功能,用户必须拥有SUPER特权,否则会发生错误。要将SUPER特权授予用户帐户,请使用以下语句:

GRANT SUPER ON *.* TO user;

另外,如果您希望避免在授予SUPER特权的同时仍允许用户访问特定的过滤功能,则可以定义“包装器”存储的程序。在使用通用密钥环功能中的 UDF 密钥环的上下文中描述了此技术;它可以适用于过滤 UDF。

  • 如果安装了audit_log插件,则该插件将在旧版模式下运行,但未创建随附的审核 table 和功能。插件在服务器启动时将这些消息写入错误日志:

[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.'

在旧模式下,只能基于事件帐户或状态来进行过滤。有关详细信息,请参见第 6.4.5.9 节“旧模式审核日志过滤”

使用审核日志过滤功能

在使用审核日志用户定义功能(UDF)之前,请根据第 6.4.5.2 节“安装或卸载 MySQL 企业审核”中提供的说明进行安装。使用任何这些功能都需要SUPER特权。

审核日志过滤功能通过提供创建,修改和删除过滤器定义并将过滤器分配给用户帐户的界面来启用过滤控制。

过滤器定义是JSON个值。有关在 MySQL 中使用JSON数据的信息,请参见第 11.5 节“ JSON 数据类型”。本节显示一些简单的过滤器定义。有关过滤器定义的更多信息,请参见第 6.4.5.8 节“编写审核日志过滤器定义”

当连接到达时,审核日志插件通过在当前过滤器分配中搜索用户帐户名称来确定用于新会话的过滤器:

  • 如果为用户分配了过滤器,则审核日志将使用该过滤器。

  • 否则,如果不存在特定于用户的过滤器分配,但是有分配给默认帐户(%)的过滤器,则审核日志将使用默认过滤器。

  • 否则,审核日志不会从会话中选择任何审核事件进行处理。

如果在会话期间发生更改用户操作(请参阅第 27.7.6.3 节“ mysql_change_user()”),则将使用相同的规则(但针对新用户)更新会话的过滤器分配。

默认情况下,没有为帐户分配过滤器,因此任何帐户都不会处理可审核事件。

假设您希望默认设置是仅记录与连接有关的活动(例如,查看 connect,change-user 和断开连接事件,而不查看用户在连接时执行的 SQL 语句)。为此,请定义一个过滤器(在此处显示为log_conn_events),该过滤器仅记录connection类中的事件,并将该过滤器分配给默认帐户,该帐户由%帐户名 table 示:

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@localhostuser2@localhost启用了完整日志记录。continue 使用默认帐户过滤器过滤来自其他帐户的连接。

要取消用户帐户与其当前过滤器的关联,请取消分配过滤器或分配其他过滤器:

  • 要从用户帐户取消分配过滤器,请执行以下操作:
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系统数据库中存储筛选器和用户帐户的审核日志 table(请参阅审核日志 table)。也可以使用诸如INSERTUPDATEDELETE之类的语句直接修改审核日志 table,但此类更改不会立即影响过滤。要刷新您的更改并使它们可操作,请调用audit_log_filter_flush()

SELECT audit_log_filter_flush();

Warning

仅在直接修改审核 table 之后才能使用audit_log_filter_flush(),以强制重新加载所有过滤器。否则,应避免使用此功能。实际上,它是使用UNINSTALL PLUGININSTALL PLUGIN卸载和重新加载audit_log插件的简化版本。

audit_log_filter_flush()影响所有当前会话,并将它们与以前的过滤器分离。除非断开并重新连接或执行更改用户操作,否则将不再记录当前会话。

要确定是否已将过滤器分配给当前会话,请检查只读audit_log_filter_id系统变量的会话值。如果值为 0,则不分配过滤器。非零值 table 示分配的过滤器的内部维护 ID:

mysql> SELECT @@audit_log_filter_id;
+-----------------------+
| @@audit_log_filter_id |
+-----------------------+
|                     2 |
+-----------------------+