#### 6.4.5.7 审核日志过滤

[](<>)

笔记

要使审核日志过滤按此处所述工作，审核日志插件*以及随附的审计表和函数*必须安装。如果安装插件时没有附带基于规则过滤所需的审计表和函数，则插件以旧过滤模式运行，如中所述[第 6.4.5.10 节，“传统模式审核日志过滤”](audit-log-legacy-filtering.html).Legacy 模式是 MySQL 5.7.13 之前的过滤行为；也就是说，在引入基于规则的过滤之前。

-   [审核日志过滤的属性](audit-log-filtering.html#audit-log-filtering-properties)

-   [审计日志过滤功能的限制](audit-log-filtering.html#audit-log-filtering-function-constraints)

-   [使用审核日志过滤功能](audit-log-filtering.html#audit-log-filtering-function-usage)

##### 审核日志过滤的属性

审计日志插件能够通过过滤来控制审计事件的日志记录：

-   可以使用以下特征过滤已审核的事件：

    -   用户帐号

    -   审计事件类

    -   审计事件子类

    -   审计事件字段，例如指示操作状态或执行的 SQL 语句的字段

-   审核过滤是基于规则的：

    -   过滤器定义创建一组审计规则。可以将定义配置为包括或排除基于刚刚描述的特征进行记录的事件。

    -   除了现有的事件记录功能外，过滤器规则还具有阻止（中止）执行合格事件的能力。

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

    -   可以定义一个默认过滤器以用于任何没有明确分配过滤器的用户帐户。

        有关编写过滤规则的信息，请参阅[第 6.4.5.8 节，“编写审计日志过滤器定义”](audit-log-filter-definitions.html).

-   可以使用基于函数调用的 SQL 接口定义、显示和修改审计过滤器。

-   审核过滤器定义存储在`mysql`系统数据库。

-   在给定的会话中，只读的值[`audit_log_filter_id`](audit-log-reference.html#sysvar_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-reference.html#function_audit-log-filter-set-filter)：定义过滤器。

-   [`audit_log_filter_remove_filter()`](audit-log-reference.html#function_audit-log-filter-remove-filter)：删除过滤器。

-   [`audit_log_filter_set_user()`](audit-log-reference.html#function_audit-log-filter-set-user)：开始过滤用户帐户。

-   [`audit_log_filter_remove_user()`](audit-log-reference.html#function_audit-log-filter-remove-user)：停止过滤用户帐户。

-   [`audit_log_filter_flush()`](audit-log-reference.html#function_audit-log-filter-flush)：刷新过滤表的手动更改以影响正在进行的过滤。

    有关过滤功能的使用示例和完整详细信息，请参阅[使用审核日志过滤功能](audit-log-filtering.html#audit-log-filtering-function-usage)， 和[审计日志功能](audit-log-reference.html#audit-log-routines).

##### 审计日志过滤功能的限制

审计日志过滤功能受以下约束：

-   要使用任何过滤功能，`审计日志`必须启用插件，否则会发生错误。此外，审计表必须存在，否则会发生错误。安装`审计日志`插件及其随附的功能和表格，请参阅[第 6.4.5.2 节，“安装或卸载 MySQL Enterprise Audit”](audit-log-installation.html).

-   要使用任何过滤功能，用户必须具备[`AUDIT_ADMIN`](privileges-provided.html#priv_audit-admin) [`极好的`](privileges-provided.html#priv_super)特权或发生错误。要将这些权限之一授予用户帐户，请使用以下语句：

    ```
    GRANT privilege ON *.* TO user;
    ```

    或者，您是否希望避免授予[`AUDIT_ADMIN`](privileges-provided.html#priv_audit-admin)要么[`极好的`](privileges-provided.html#priv_super)在允许用户访问特定过滤功能的同时，还可以定义“包装”存储程序。该技术在 keyring 函数的上下文中描述[使用通用密钥环函数](keyring-functions-general-purpose.html#keyring-function-usage);它可以适用于过滤功能。

-   这`审计日志`如果安装了插件但未创建随附的审计表和函数，则插件在传统模式下运行。该插件在服务器启动时将这些消息写入错误日志：

    [](<>)

    ```
    [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.10 节，“传统模式审核日志过滤”](audit-log-legacy-filtering.html).

-   理论上，具有足够权限的用户可能会在审核日志过滤器中错误地创建“中止”项，从而阻止他们自己和其他管理员访问系统。从 MySQL 8.0.28 开始，[`AUDIT_ABORT_EXEMPT`](privileges-provided.html#priv_audit-abort-exempt)特权可允许始终执行用户帐户的查询，即使“中止”项会阻止它们。因此，具有此权限的帐户可用于在审核错误配置后重新获得对系统的访问权限。该查询仍会记录在审核日志中，但不会被拒绝，而是由于特权而被允许。

    在 MySQL 8.0.28 或更高版本中创建的帐户[`SYSTEM_USER`](privileges-provided.html#priv_system-user)特权有[`AUDIT_ABORT_EXEMPT`](privileges-provided.html#priv_audit-abort-exempt)创建时自动分配的权限。这[`AUDIT_ABORT_EXEMPT`](privileges-provided.html#priv_audit-abort-exempt)权限也分配给现有帐户[`SYSTEM_USER`](privileges-provided.html#priv_system-user)使用 MySQL 8.0.28 或更高版本执行升级过程时的权限，如果现有帐户没有分配该权限。

##### 使用审核日志过滤功能

在使用审计日志功能之前，请根据提供的说明安装它们[第 6.4.5.2 节，“安装或卸载 MySQL Enterprise Audit”](audit-log-installation.html).这[`AUDIT_ADMIN`](privileges-provided.html#priv_audit-admin)要么[`极好的`](privileges-provided.html#priv_super)使用这些功能中的任何一个都需要特权。

审计日志过滤功能通过提供一个界面来创建、修改和删除过滤器定义并将过滤器分配给用户帐户，从而实现过滤控制。

过滤器定义是[`JSON`](json.html)价值观。有关使用的信息[`JSON`](json.html)MySQL 中的数据，请参阅[第 11.5 节，“JSON 数据类型”](json.html).本节展示了一些简单的过滤器定义。有关过滤器定义的更多信息，请参阅[第 6.4.5.8 节，“编写审计日志过滤器定义”](audit-log-filter-definitions.html).

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

-   如果为用户分配了过滤器，审核日志将使用该过滤器。

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

-   否则，审核日志不会从会话中选择审核事件进行处理。

    如果在会话期间发生更改用户操作（请参阅[mysql\_改变\_用户（）](https://dev.mysql.com/doc/c-api/8.0/en/mysql-change-user.html))，会话的过滤器分配使用相同的规则更新，但针对新用户。

    默认情况下，没有为任何帐户分配过滤器，因此不会对任何帐户进行可审计事件的处理。

    假设您希望将默认值更改为仅记录与连接相关的活动（例如，查看连接、更改用户和断开连接事件，但不查看用户在连接时执行的 SQL 语句）。为此，请定义一个过滤器（此处显示名为`log_conn_events`) 启用仅记录`联系`类，并将该过滤器分配给默认帐户，由`%`帐户名称：


```
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`存储过滤器和用户帐户的系统数据库（请参阅[审核日志表](audit-log-reference.html#audit-log-tables)）。也可以使用语句直接修改审计日志表，例如[`插入`](insert.html),[`更新`](update.html)， 和[`删除`](delete.html)，但此类更改不会立即影响过滤。要刷新您的更改并使其可操作，请致电[`audit_log_filter_flush()`](audit-log-reference.html#function_audit-log-filter-flush)：

```
SELECT audit_log_filter_flush();
```

警告

[`audit_log_filter_flush()`](audit-log-reference.html#function_audit-log-filter-flush)仅应在直接修改审计表后使用，以强制重新加载所有过滤器。否则，应避免使用此功能。实际上，它是卸载和重新加载`审计日志`插件与[`卸载插件`](uninstall-plugin.html)加[`安装插件`](install-plugin.html).

[`audit_log_filter_flush()`](audit-log-reference.html#function_audit-log-filter-flush)影响所有当前会话并将它们与之前的过滤器分离。当前会话不再被记录，除非它们断开连接并重新连接，或执行更改用户操作。

要确定过滤器是否分配给当前会话，请检查只读的会话值[`audit_log_filter_id`](audit-log-reference.html#sysvar_audit_log_filter_id)系统变量。如果值为 0，则不分配过滤器。非零值表示已分配过滤器的内部维护 ID：

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