#### 6.4.7.3 使用 MySQL 企业防火墙

[](<>)

在使用 MySQL Enterprise Firewall 之前，请按照中提供的说明进行安装[第 6.4.7.2 节，“安装或卸载 MySQL 企业防火墙”](firewall-installation.html).

本节介绍如何使用 SQL 语句配置 MySQL Enterprise Firewall。或者，MySQL Workbench 6.3.4 或更高版本提供了用于防火墙控制的图形界面。看[MySQL企业防火墙接口](https://dev.mysql.com/doc/workbench/en/wb-mysql-firewall.html).

-   [启用或禁用防火墙](firewall-usage.html#firewall-enabling-disabling)

-   [分配防火墙权限](firewall-usage.html#firewall-privileges)

-   [防火墙概念](firewall-usage.html#firewall-concepts)

-   [注册防火墙组配置文件](firewall-usage.html#firewall-group-profiles)

-   [注册防火墙帐户配置文件](firewall-usage.html#firewall-account-profiles)

-   [监控防火墙](firewall-usage.html#firewall-monitoring)

-   [将帐户配置文件迁移到组配置文件](firewall-usage.html#firewall-account-profile-migration)

##### 启用或禁用防火墙

要启用或禁用防火墙，请设置[`mysql_firewall_mode`](firewall-reference.html#sysvar_mysql_firewall_mode)系统变量。默认情况下，安装防火墙时启用此变量。要明确控制初始防火墙状态，您可以在服务器启动时设置该变量。例如，要在选项文件中启用防火墙，请使用以下行：

```
[mysqld]
mysql_firewall_mode=ON
```

修改后`我的.cnf`, 重启服务器使新设置生效。

或者，要在运行时设置并保留防火墙设置：

```
SET PERSIST mysql_firewall_mode = OFF;
SET PERSIST mysql_firewall_mode = ON;
```

[`设置坚持`](set-variable.html)为正在运行的 MySQL 实例设置一个值。它还保存该值，使其延续到后续服务器重新启动。要更改正在运行的 MySQL 实例的值而不使其延续到后续重新启动，请使用`全球的`关键字而不是`坚持`.看[第 13.7.6.1 节，“变量赋值的 SET 语法”](set-variable.html).

##### 分配防火墙权限

安装防火墙后，将适当的权限授予 MySQL 帐户或用于管理它的帐户。权限取决于应允许帐户执行哪些防火墙操作：

-   授予[`FIREWALL_EXEMPT`](privileges-provided.html#priv_firewall-exempt)特权（从 MySQL 8.0.27 开始可用）到任何应该不受防火墙限制的帐户。例如，对于配置防火墙的数据库管理员来说，这很有用，可以避免错误配置导致甚至管理员被锁定而无法执行语句的可能性。

-   授予[`FIREWALL_ADMIN`](privileges-provided.html#priv_firewall-admin)任何应具有完全管理防火墙访问权限的帐户的权限。（某些管理防火墙功能可以由拥有[`FIREWALL_ADMIN`](privileges-provided.html#priv_firewall-admin) *要么*已弃用的[`极好的`](privileges-provided.html#priv_super)特权，如各个功能描述中所示。）

-   授予[`FIREWALL_USER`](privileges-provided.html#priv_firewall-user)任何应仅对其自己的防火墙规则具有管理访问权限的帐户的特权。

-   授予[`执行`](privileges-provided.html#priv_execute)防火墙存储过程的权限`mysql`系统数据库。这些可能会调用管理功能，因此存储过程访问还需要前面指出的这些功能所需的特权。

笔记

这[`FIREWALL_EXEMPT`](privileges-provided.html#priv_firewall-exempt),[`FIREWALL_ADMIN`](privileges-provided.html#priv_firewall-admin)， 和[`FIREWALL_USER`](privileges-provided.html#priv_firewall-user)只有在安装防火墙时才能授予权限，因为`MYSQL_防火墙`插件定义了这些权限。

##### 防火墙概念

MySQL 服务器允许客户端连接并从它们接收要执行的 SQL 语句。如果启用了防火墙，服务器会将每个不会立即失败并出现语法错误的传入语句传递给它。根据防火墙是否接受该语句，服务器执行它或向客户端返回错误。本节介绍防火墙如何完成接受或拒绝语句的任务。

-   [防火墙配置文件](firewall-usage.html#firewall-profiles)

-   [防火墙语句匹配](firewall-usage.html#firewall-statement-matching)

-   [配置文件操作模式](firewall-usage.html#firewall-profile-modes)

-   [应用多个配置文件时的防火墙语句处理](firewall-usage.html#firewall-multiple-profiles)

###### 防火墙配置文件

防火墙使用配置文件注册表来确定是否允许执行语句。配置文件具有以下属性：

-   一个许可名单。允许列表是一组规则，用于定义配置文件可接受的语句。

-   当前的操作模式。该模式使配置文件能够以不同的方式使用。例如：可以将配置文件置于培训模式以建立白名单；允许列表可用于限制语句执行或入侵检测；该配置文件可以完全禁用。

-   适用范围。范围指示配置文件适用于哪些客户端连接：

    -   防火墙支持基于帐户的配置文件，这样每个配置文件都匹配特定的客户端帐户（客户端用户名和主机名组合）。例如，您可以注册一个帐户配置文件，其中允许列表适用于源自以下的连接`管理员@本地主机`和另一个帐户配置文件，其允许列表适用于源自以下的连接`myapp@apphost.example.com`.

    -   从 MySQL 8.0.23 开始，防火墙支持可以有多个帐户作为成员的组配置文件，配置文件允许列表同样适用于所有成员。组配置文件使需要将一组给定的允许列表规则应用于多个帐户的部署更易于管理和更大的灵活性。

    最初，不存在配置文件，因此默认情况下，防火墙接受所有语句，并且对 MySQL 帐户可以执行的语句没有影响。要应用防火墙保护功能，需要明确的操作：

-   向防火墙注册一个或多个配置文件。

-   通过为每个配置文件建立白名单来训练防火墙；也就是说，配置文件允许客户端执行的语句类型。

-   将经过训练的配置文件置于保护模式以强化 MySQL 以防止未经授权的语句执行：

    -   MySQL 将每个客户端会话与特定的用户名和主机名组合相关联。这种组合是*会话帐户*.

    -   对于每个客户端连接，防火墙使用会话帐户来确定哪些配置文件适用于处理来自客户端的传入语句。

        防火墙仅接受适用的配置文件允许列表允许的语句。

    大多数防火墙原则同样适用于组配置文件和帐户配置文件。这两种类型的配置文件在这些方面有所不同：

-   帐户配置文件许可名单仅适用于单个帐户。当会话帐户与作为组成员的任何帐户匹配时，将应用组配置文件白名单。

-   要使用帐户配置文件将允许列表应用于多个帐户，必须为每个帐户注册一个配置文件并在每个配置文件中复制允许列表。这需要单独培训每个帐户配置文件，因为每个帐户都必须使用其适用的单个帐户进行培训。

    组配置文件allowlist适用于多个帐户，无需为每个帐户复制。可以使用任何或所有集团成员帐户对集团档案进行培训，也可以将培训限于任何单个成员。无论如何，allowlist适用于所有成员。

-   帐户配置文件名称基于特定的用户名和主机名组合，这取决于连接到MySQL服务器的客户端。组配置文件名称由防火墙管理员选择，除了长度必须在1到288个字符之间之外，没有其他限制。

笔记

由于组配置文件优于帐户配置文件，并且由于具有单个成员帐户的组配置文件在逻辑上等同于该帐户的帐户配置文件，因此建议将所有新的防火墙配置文件创建为组配置文件。从MySQL 8.0.26开始，帐户配置文件已被弃用，在未来的MySQL版本中可能会被删除。有关转换现有帐户配置文件的帮助，请参阅[将帐户配置文件迁移到组配置文件](firewall-usage.html#firewall-account-profile-migration).

防火墙提供的基于配置文件的保护可以实现以下策略：

-   如果应用程序有独特的保护要求，请将其配置为使用未用于任何其他目的的帐户，并为该帐户设置组配置文件或帐户配置文件。

-   如果相关应用程序共享保护要求，请将每个应用程序与其自己的帐户关联，然后将这些应用程序帐户添加为同一组配置文件的成员。或者，将所有应用程序配置为使用同一帐户，并将其与该帐户的帐户配置文件相关联。

###### 防火墙语句匹配

防火墙执行的语句匹配不使用从客户端接收的SQL语句。相反，服务器将传入语句转换为规范化摘要形式，防火墙操作使用这些摘要。语句规范化的好处是，它允许使用单个模式对类似语句进行分组和识别。例如，这些语句彼此不同：

```
SELECT first_name, last_name FROM customer WHERE customer_id = 1;
select first_name, last_name from customer where customer_id = 99;
SELECT first_name, last_name FROM customer WHERE customer_id = 143;
```

但它们都有相同的标准化摘要形式：

```
SELECT `first_name` , `last_name` FROM `customer` WHERE `customer_id` = ?
```

通过使用规范化，防火墙允许列表可以存储摘要，每个摘要与从客户端接收到的许多不同语句相匹配。有关规范化和摘要的更多信息，请参阅[第27.10节，“绩效模式声明摘要和抽样”](performance-schema-statement-digests.html).

警告

设定[`最大长度`](server-system-variables.html#sysvar_max_digest_length)系统变量为零将禁用摘要生成，这也会禁用需要摘要的服务器功能，例如MySQL Enterprise Firewall。

###### 配置文件操作模式

在防火墙中注册的每个配置文件都有自己的操作模式，可从以下值中选择：

-   `关`：此模式禁用配置文件。防火墙认为它处于非活动状态并忽略它。

-   `记录`：这是防火墙培训模式。从与配置文件匹配的客户端接收的传入语句被认为是配置文件可接受的，并成为其“指纹”的一部分防火墙记录每个语句的规范化摘要形式，以了解概要文件可接受的语句模式。每个模式都是一条规则，规则的并集就是profile allowlist。

    集团和账户档案之间的区别在于，集团档案的对账单记录可以仅限于从单个集团成员（培训成员）收到的对账单。

-   `保护`：在此模式下，配置文件允许或阻止语句执行。防火墙将传入语句与profile allowlist进行匹配，只接受匹配的语句，拒绝不匹配的语句。在培训了一个个人资料之后`记录`模式，切换到`保护`模式，通过偏离allowlist的语句加强MySQL的访问。如果[`mysql_防火墙_跟踪`](firewall-reference.html#sysvar_mysql_firewall_trace)如果启用系统变量，防火墙还会将被拒绝的语句写入错误日志。

-   `探测`：此模式检测但不阻止入侵（可疑的语句，因为它们与配置文件allowlist中的任何内容都不匹配）。在里面`探测`模式下，防火墙将可疑语句写入错误日志，但在不拒绝访问的情况下接受它们。

    当配置文件被分配了上述任何模式值时，防火墙会将该模式存储在配置文件中。防火墙模式设置操作还允许模式值为`重置`，但不存储此值：将配置文件设置为`重置`模式使防火墙删除配置文件的所有规则，并将其模式设置为`关`.

笔记

写入错误日志的消息`探测`还是因为[`mysql_防火墙_跟踪`](firewall-reference.html#sysvar_mysql_firewall_trace)已启用，则以注释的形式写入，这些注释是信息消息。为确保此类消息出现在错误日志中且不会被丢弃，请确保错误日志详细程度足以包含信息消息。例如，如果使用基于优先级的日志筛选，如中所述[第5.4.2.5节，“基于优先级的错误日志过滤（日志\_滤器\_内部“](error-log-priority-based-filtering.html)，设置[`日志错误详细`](server-system-variables.html#sysvar_log_error_verbosity)将系统变量的值设置为3。

###### 应用多个配置文件时的防火墙语句处理

为了简单起见，后面描述如何设置配置文件的部分将从防火墙仅将来自客户端的传入语句与单个配置文件（组配置文件或帐户配置文件）相匹配的角度出发。但防火墙操作可能更复杂：

-   组配置文件可以包含多个帐户作为成员。

-   一个帐户可以是多个组配置文件的成员。

-   多个配置文件可以匹配给定的客户端。

    以下描述涵盖了防火墙如何运行的一般情况，其中可能有多个配置文件应用于传入语句。

    如前所述，MySQL将每个客户端会话与一个特定的用户名和主机名组合相关联，称为*会话帐户*。防火墙将会话帐户与注册的配置文件进行匹配，以确定哪些配置文件适用于处理来自会话的传入语句：

-   防火墙会忽略非活动配置文件（模式为`关`).

-   会话帐户匹配每个活动组配置文件，其中包括具有相同用户和主机的成员。可以有多个这样的组配置文件。

-   会话帐户与具有相同用户和主机（如果有）的活动帐户配置文件相匹配。最多有一个这样的账户档案。

    换句话说，会话帐户可以匹配0个或多个活动组配置文件，以及0个或1个活动帐户配置文件。这意味着0、1或多个防火墙配置文件适用于给定会话，对于该会话，防火墙按如下方式处理每个传入语句：

-   如果没有适用的配置文件，防火墙不会施加任何限制并接受该声明。

-   如果有适用的配置文件，它们的模式决定语句处理：

    -   防火墙会在中的每个适用配置文件的allowlist中记录该语句`记录`模式

    -   防火墙将语句写入中每个适用配置文件的错误日志`探测`语句可疑的模式（与配置文件allowlist不匹配）。

    -   如果至少存在一个适用的配置文件，防火墙将接受该声明`记录`或`探测`模式（这些模式接受所有语句），或者如果该语句与中至少一个适用配置文件的allowlist匹配`保护`模式否则，防火墙将拒绝该语句（如果[`mysql_防火墙_跟踪`](firewall-reference.html#sysvar_mysql_firewall_trace)系统变量已启用）。

    考虑到这一描述，接下来的部分将回到单一集团配置文件或单一账户配置文件应用时的简单情况，并介绍如何设置每种类型的配置文件。

##### 注册防火墙组配置文件

MySQL Enterprise Firewall支持从MySQL 8.0.23开始注册组配置文件。一个组配置文件可以有多个帐户作为其成员。要使用防火墙组配置文件保护MySQL免受来自给定帐户的传入语句的攻击，请执行以下步骤：

1.  注册组配置文件并将其放入`记录`模式

2.  将成员帐户添加到组配置文件中。

3.  使用成员帐户连接到MySQL服务器，并执行要学习的语句。这将训练组配置文件，并建立形成配置文件允许列表的规则。

4.  将要成为组成员的任何其他帐户添加到组配置文件中。

5.  将组配置文件切换到`保护`模式当客户端使用属于组配置文件的任何帐户连接到服务器时，配置文件允许列表会限制语句的执行。

6.  如果需要额外的培训，请将组配置文件切换到`记录`再次使用新的语句模式更新其allowlist，然后将其切换回`保护`模式

    有关防火墙相关的帐户参考，请遵守以下准则：

-   注意帐户引用发生的上下文。要命名防火墙操作的帐户，请将其指定为单引号字符串(`'*`用户名`*@*`主机名`*'`).这不同于MySQL对以下语句的常规约定：[`创建用户`](create-user.html)和[`授予`](grant.html)，分别引用帐户名的用户部分和主机部分(`'*`用户名`*'@'*`主机名`*'`).

    防火墙操作要求将帐户命名为单引号字符串，这意味着您不能使用已嵌入`@`用户名中的字符。

-   防火墙根据由服务器验证的实际用户名和主机名表示的帐户评估报表。在配置文件中注册帐户时，不要使用通配符或网络掩码：

    -   假设一个名为`我@%。实例组织`存在，客户端使用它从主机连接到服务器`abc。实例组织`.

    -   帐户名包含一个`%`通配符，但服务器会将客户端验证为具有`我`和主机名`abc。实例通用域名格式`，这就是防火墙所看到的。

    -   因此，用于防火墙操作的帐户名为`me@abc.example.org`而不是`我@%。实例组织`.

    以下过程显示了如何向防火墙注册组配置文件，培训防火墙了解该配置文件的可接受语句（其allowlist），使用该配置文件保护MySQL不受不可接受语句的执行，以及添加和删除组成员。该示例使用的组配置文件名为`fwgrp`。假定该示例配置文件供访问中的表的应用程序的客户端使用`萨基拉`数据库（可在<https://dev.mysql.com/doc/index-other.html>).

    使用管理MySQL帐户执行此过程中的步骤，但由防火墙组配置文件的成员帐户指定执行的步骤除外。对于由成员帐户执行的语句，默认数据库应为`萨基拉`（通过相应地调整说明，可以使用不同的数据库。）

1.  如有必要，创建将成为`fwgrp`组配置文件，并授予他们适当的访问权限。此处显示了一个成员的声明（请选择适当的密码）：

    ```
    CREATE USER 'member1'@'localhost' IDENTIFIED BY 'password';
    GRANT ALL ON sakila.* TO 'member1'@'localhost';
    ```

2.  使用`sp_设置_防火墙_组_模式（）`向防火墙注册组配置文件并将配置文件放入`记录`（培训）模式：

    ```
    CALL mysql.sp_set_firewall_group_mode('fwgrp', 'RECORDING');
    ```

3.  使用`sp_防火墙_组_登记（）`添加初始成员帐户以用于培训组配置文件allowlist的存储过程：

    ```
    CALL mysql.sp_firewall_group_enlist('fwgrp', 'member1@localhost');
    ```

4.  要使用初始成员帐户培训组配置文件，请按以下方式连接到服务器：`成员1`从服务器主机，以便防火墙看到`member1@localhost`。然后执行一些对配置文件合法的语句。例如：

    ```
    SELECT title, release_year FROM film WHERE film_id = 1;
    UPDATE actor SET last_update = NOW() WHERE actor_id = 1;
    SELECT store_id, COUNT(*) FROM inventory GROUP BY store_id;
    ```

    防火墙接收来自`member1@localhost`账户因为那个账户是`fwgrp`个人资料，在`记录`模式下，防火墙将这些语句解释为适用于`fwgrp`并将语句的规范化摘要形式作为规则记录在`fwgrp`allowlist。然后，这些规则适用于所有属于`fwgrp`.

    笔记

    直到`fwgrp`组配置文件在中接收语句`记录`模式下，其allowlist为空，相当于“拒绝所有”没有任何语句可以匹配空的allowlist，它具有以下含义：

    -   无法切换到组配置文件`保护`模式它将拒绝每一份声明，实际上禁止作为集团成员的账户执行任何声明。

    -   组配置文件可以切换到`探测`模式在本例中，配置文件接受每条语句，但将其记录为可疑。

5.  此时，将缓存组配置文件信息，包括其名称、成员资格和允许列表。要查看此信息，请查询性能模式防火墙表：

    ```
    mysql> SELECT MODE FROM performance_schema.firewall_groups
           WHERE NAME = 'fwgrp';
    +-----------+
    | MODE      |
    +-----------+
    | RECORDING |
    +-----------+
    mysql> SELECT * FROM performance_schema.firewall_membership
           WHERE GROUP_ID = 'fwgrp' ORDER BY MEMBER_ID;
    +----------+-------------------+
    | GROUP_ID | MEMBER_ID         |
    +----------+-------------------+
    | fwgrp    | member1@localhost |
    +----------+-------------------+
    mysql> SELECT RULE FROM performance_schema.firewall_group_allowlist
           WHERE NAME = 'fwgrp';
    +----------------------------------------------------------------------+
    | RULE                                                                 |
    +----------------------------------------------------------------------+
    | SELECT @@`version_comment` LIMIT ?                                   |
    | UPDATE `actor` SET `last_update` = NOW ( ) WHERE `actor_id` = ?      |
    | SELECT `title` , `release_year` FROM `film` WHERE `film_id` = ?      |
    | SELECT `store_id` , COUNT ( * ) FROM `inventory` GROUP BY `store_id` |
    +----------------------------------------------------------------------+
    ```

    笔记

    这个`@@版本注释`规则来自[**mysql**](mysql.html)当你连接到服务器时。

    重要的

    在与应用程序使用相匹配的条件下培训防火墙。例如，为了确定服务器特性和功能，给定的MySQL连接器可能会在每个会话开始时向服务器发送语句。如果应用程序通常通过该连接器使用，也可以使用该连接器训练防火墙。这使这些初始语句成为与应用程序关联的组配置文件的allowlist的一部分。

6.  援引`sp_设置_防火墙_组_模式（）`再次将组配置文件切换到`保护`模式：

    ```
    CALL mysql.sp_set_firewall_group_mode('fwgrp', 'PROTECTING');
    ```

    重要的

    将组配置文件从`记录`模式将其缓存的数据同步到`mysql`提供持久底层存储的系统数据库表。如果不切换正在记录的配置文件的模式，则缓存的数据不会写入永久性存储器，并且在服务器重新启动时会丢失。

7.  向组配置文件中添加任何其他应成为成员的帐户：

    ```
    CALL mysql.sp_firewall_group_enlist('fwgrp', 'member2@localhost');
    CALL mysql.sp_firewall_group_enlist('fwgrp', 'member3@localhost');
    CALL mysql.sp_firewall_group_enlist('fwgrp', 'member4@localhost');
    ```

    配置文件允许列表使用`member1@localhost`账户现在也适用于其他账户。

8.  要验证更新的组成员身份，请查询`防火墙联盟成员`请再说一遍：

    ```
    mysql> SELECT * FROM performance_schema.firewall_membership
           WHERE GROUP_ID = 'fwgrp' ORDER BY MEMBER_ID;
    +----------+-------------------+
    | GROUP_ID | MEMBER_ID         |
    +----------+-------------------+
    | fwgrp    | member1@localhost |
    | fwgrp    | member2@localhost |
    | fwgrp    | member3@localhost |
    | fwgrp    | member4@localhost |
    +----------+-------------------+
    ```

9.  通过使用组中的任何帐户执行一些可接受和不可接受的语句，针对防火墙测试组配置文件。防火墙将帐户中的每条语句与配置文件allowlist匹配，并接受或拒绝它：

    -   此语句与培训语句不同，但生成的规范化语句与其中一个语句相同，因此防火墙接受它：

        ```
        mysql> SELECT title, release_year FROM film WHERE film_id = 98;
        +-------------------+--------------+
        | title             | release_year |
        +-------------------+--------------+
        | BRIGHT ENCOUNTERS |         2006 |
        +-------------------+--------------+
        ```

    -   这些语句与allowlist中的任何语句都不匹配，因此防火墙会拒绝每一个语句，并显示一个错误：

        ```
        mysql> SELECT title, release_year FROM film WHERE film_id = 98 OR TRUE;
        ERROR 1045 (28000): Statement was blocked by Firewall
        mysql> SHOW TABLES LIKE 'customer%';
        ERROR 1045 (28000): Statement was blocked by Firewall
        mysql> TRUNCATE TABLE mysql.slow_log;
        ERROR 1045 (28000): Statement was blocked by Firewall
        ```

    -   如果[`mysql_防火墙_跟踪`](firewall-reference.html#sysvar_mysql_firewall_trace)如果启用系统变量，防火墙还会将被拒绝的语句写入错误日志。例如：

        ```
        [Note] Plugin MYSQL_FIREWALL reported:
        'ACCESS DENIED for 'member1@localhost'. Reason: No match in allowlist.
        Statement: TRUNCATE TABLE `mysql` . `slow_log`'
        ```

        如果有必要，这些日志消息可能有助于识别攻击源。

10. 如果需要从组配置文件中删除成员，请使用`sp_防火墙_集团_退市（）`存储过程而不是`sp_防火墙_组_登记（）`:

    ```
    CALL mysql.sp_firewall_group_delist('fwgrp', 'member3@localhost');
    ```

    防火墙组配置文件现在针对成员帐户进行了培训。当客户端使用组中的任何帐户连接并尝试执行语句时，配置文件会保护MySQL不受配置文件allowlist不匹配的语句的影响。

    刚才显示的程序在培训其允许列表之前只向组配置文件添加了一名成员。这样做可以通过限制哪些帐户可以在allowlist中添加新的可接受报表，从而更好地控制培训期。如果需要额外的培训，您可以将配置文件切换回`记录`模式：


```
CALL mysql.sp_set_firewall_group_mode('fwgrp', 'RECORDING');
```

但是，这使组中的任何成员都可以执行语句并将它们添加到allowlist中。若要将额外培训限制为单个小组成员，请致电`sp_设置_防火墙_组_模式_和_用户（）`，这就像`sp_设置_防火墙_组_模式（）`但还有一个参数指定允许哪个帐户在中训练配置文件`记录`模式例如，仅通过`member4@localhost`，这样做：

```
CALL mysql.sp_set_firewall_group_mode_and_user('fwgrp', 'RECORDING', 'member4@localhost');
```

这样就可以通过指定的帐户进行额外的培训，而无需删除其他组成员。它们可以执行语句，但这些语句不会添加到allowlist中。（然而，请记住，在`记录`其他成员可以执行的模式*任何*声明。）

笔记

为避免在将特定帐户指定为组配置文件的培训帐户时出现意外行为，请始终确保该帐户是组的成员。

额外培训后，将组配置文件设置回`保护`模式：

```
CALL mysql.sp_set_firewall_group_mode('fwgrp', 'PROTECTING');
```

培训账户由`sp_设置_防火墙_组_模式_和_用户（）`保存在组配置文件中，因此防火墙会记住它，以防以后需要更多培训。因此，如果你打电话`sp_设置_防火墙_组_模式（）`（不考虑培训帐户参数），当前配置文件培训帐户，`member4@localhost`，保持不变。

如果真的希望让所有团队成员都能在`记录`模式，呼叫`sp_设置_防火墙_组_模式_和_用户（）`并通过`无效的`account参数的值：

```
CALL mysql.sp_set_firewall_group_mode_and_user('fwgrp', 'RECORDING', NULL);
```

在不拒绝访问的情况下，可以通过将不匹配的语句记录为可疑语句来检测入侵。首先，将组配置文件放入`探测`模式：

```
CALL mysql.sp_set_firewall_group_mode('fwgrp', 'DETECTING');
```

然后，使用成员帐户执行与组配置文件allowlist不匹配的语句。在里面`探测`模式下，防火墙允许执行非匹配语句：

```
mysql> SHOW TABLES LIKE 'customer%';
+------------------------------+
| Tables_in_sakila (customer%) |
+------------------------------+
| customer                     |
| customer_list                |
+------------------------------+
```

此外，防火墙会将一条消息写入错误日志：

```
[Note] Plugin MYSQL_FIREWALL reported:
'SUSPICIOUS STATEMENT from 'member1@localhost'. Reason: No match in allowlist.
Statement: SHOW TABLES LIKE ?'
```

要禁用组配置文件，请将其模式更改为`关`:

```
CALL mysql.sp_set_firewall_group_mode(group, 'OFF');
```

要忘记某个配置文件的所有培训并将其禁用，请重置它：

```
CALL mysql.sp_set_firewall_group_mode(group, 'RESET');
```

重置操作会导致防火墙删除配置文件的所有规则，并将其模式设置为`关`.

##### 注册防火墙帐户配置文件

MySQL Enterprise Firewall允许注册与单个帐户对应的配置文件。要使用防火墙帐户配置文件保护MySQL免受来自给定帐户的传入语句的攻击，请执行以下步骤：

1.  注册帐户配置文件并将其放入`记录`模式

2.  使用帐户连接到MySQL服务器，并执行要学习的语句。这将训练帐户配置文件，并建立形成配置文件允许列表的规则。

3.  将帐户配置文件切换到`保护`模式当客户端使用帐户连接到服务器时，帐户配置文件allowlist会限制语句的执行。

4.  如果需要额外培训，请将客户档案切换到`记录`再次使用新的语句模式更新其allowlist，然后将其切换回`保护`模式

    有关防火墙相关的帐户参考，请遵守以下准则：

-   注意帐户引用发生的上下文。要命名防火墙操作的帐户，请将其指定为单引号字符串(`'*`用户名`*@*`主机名`*'`).这不同于MySQL对以下语句的常规约定：[`创建用户`](create-user.html)和[`授予`](grant.html)，分别引用帐户名的用户部分和主机部分(`'*`用户名`*'@'*`主机名`*'`).

    防火墙操作要求将帐户命名为单引号字符串，这意味着您不能使用已嵌入`@`用户名中的字符。

-   防火墙根据由服务器验证的实际用户名和主机名表示的帐户评估报表。在配置文件中注册帐户时，不要使用通配符或网络掩码：

    -   假设一个名为`我@%。实例组织`存在，客户端使用它从主机连接到服务器`abc。实例组织`.

    -   帐户名包含一个`%`通配符，但服务器会将客户端验证为具有`我`和主机名`abc。实例通用域名格式`，这就是防火墙所看到的。

    -   因此，用于防火墙操作的帐户名为`me@abc.example.org`而不是`我@%。实例组织`.

    下面的过程展示了如何向防火墙注册帐户配置文件，训练防火墙知道该配置文件的可接受语句（其allowlist），并使用该配置文件保护MySQL不被帐户执行不可接受的语句。示例帐户，`fwuser@localhost`，假定由访问中的表的应用程序使用`萨基拉`数据库（可在<https://dev.mysql.com/doc/index-other.html>).

    使用管理MySQL帐户执行此过程中的步骤，但由管理员指定执行的步骤除外`fwuser@localhost`与防火墙注册的帐户配置文件相对应的帐户。对于使用此帐户执行的语句，默认数据库应为`萨基拉`（通过相应地调整说明，可以使用不同的数据库。）

1.  如有必要，创建用于执行语句的帐户（选择适当的密码），并为其授予执行语句的权限`萨基拉`数据库：

    ```
    CREATE USER 'fwuser'@'localhost' IDENTIFIED BY 'password';
    GRANT ALL ON sakila.* TO 'fwuser'@'localhost';
    ```

2.  使用`sp_设置_防火墙_模式（）`存储过程，用于向防火墙注册帐户配置文件并将配置文件放入`记录`（培训）模式：

    ```
    CALL mysql.sp_set_firewall_mode('fwuser@localhost', 'RECORDING');
    ```

3.  要训练注册的帐户配置文件，请按以下方式连接到服务器：`fwuser`从服务器主机，以便防火墙看到`fwuser@localhost`。然后使用该帐户执行一些被认为对配置文件合法的语句。例如：

    ```
    SELECT first_name, last_name FROM customer WHERE customer_id = 1;
    UPDATE rental SET return_date = NOW() WHERE rental_id = 1;
    SELECT get_customer_balance(1, NOW());
    ```

    因为档案在`记录`模式下，防火墙将语句的规范化摘要形式作为规则记录在profile allowlist中。

    笔记

    直到`fwuser@localhost`帐户配置文件在中接收对账单`记录`模式下，其allowlist为空，相当于“拒绝所有”没有任何语句可以匹配空的allowlist，它具有以下含义：

    -   无法切换到帐户配置文件`保护`模式它将拒绝每一份声明，实际上禁止该账户执行任何声明。

    -   帐户配置文件可以切换到`探测`模式在本例中，配置文件接受每条语句，但将其记录为可疑。

4.  此时，将缓存帐户配置文件信息。要查看此信息，请查询`信息模式`防火墙表：

    ```
    mysql> SELECT MODE FROM INFORMATION_SCHEMA.MYSQL_FIREWALL_USERS
           WHERE USERHOST = 'fwuser@localhost';
    +-----------+
    | MODE      |
    +-----------+
    | RECORDING |
    +-----------+
    mysql> SELECT RULE FROM INFORMATION_SCHEMA.MYSQL_FIREWALL_WHITELIST
           WHERE USERHOST = 'fwuser@localhost';
    +----------------------------------------------------------------------------+
    | RULE                                                                       |
    +----------------------------------------------------------------------------+
    | SELECT `first_name` , `last_name` FROM `customer` WHERE `customer_id` = ?  |
    | SELECT `get_customer_balance` ( ? , NOW ( ) )                              |
    | UPDATE `rental` SET `return_date` = NOW ( ) WHERE `rental_id` = ?          |
    | SELECT @@`version_comment` LIMIT ?                                         |
    +----------------------------------------------------------------------------+
    ```

    笔记

    这个`@@版本注释`规则来自[**mysql**](mysql.html)当你连接到服务器时。

    重要的

    在与应用程序使用相匹配的条件下培训防火墙。例如，为了确定服务器特性和功能，给定的MySQL连接器可能会在每个会话开始时向服务器发送语句。如果应用程序通常通过该连接器使用，也可以使用该连接器训练防火墙。这使这些初始语句成为与应用程序关联的帐户配置文件的allowlist的一部分。

5.  援引`sp_设置_防火墙_模式（）`同样，这次将帐户配置文件切换为`保护`模式：

    ```
    CALL mysql.sp_set_firewall_mode('fwuser@localhost', 'PROTECTING');
    ```

    重要的

    将帐户配置文件从`记录`模式将其缓存的数据同步到`mysql`提供持久底层存储的系统数据库表。如果不切换正在记录的配置文件的模式，则缓存的数据不会写入永久性存储器，并且在服务器重新启动时会丢失。

6.  通过使用帐户执行一些可接受和不可接受的语句来测试帐户配置文件。防火墙将帐户中的每条语句与配置文件allowlist匹配，并接受或拒绝它：

    -   此语句与培训语句不同，但生成的规范化语句与其中一个语句相同，因此防火墙接受它：

        ```
        mysql> SELECT first_name, last_name FROM customer WHERE customer_id = '48';
        +------------+-----------+
        | first_name | last_name |
        +------------+-----------+
        | ANN        | EVANS     |
        +------------+-----------+
        ```

    -   这些语句与allowlist中的任何语句都不匹配，因此防火墙会拒绝每一个语句，并显示一个错误：

        ```
        mysql> SELECT first_name, last_name FROM customer WHERE customer_id = 1 OR TRUE;
        ERROR 1045 (28000): Statement was blocked by Firewall
        mysql> SHOW TABLES LIKE 'customer%';
        ERROR 1045 (28000): Statement was blocked by Firewall
        mysql> TRUNCATE TABLE mysql.slow_log;
        ERROR 1045 (28000): Statement was blocked by Firewall
        ```

    -   如果[`mysql_防火墙_跟踪`](firewall-reference.html#sysvar_mysql_firewall_trace)如果启用系统变量，防火墙还会将被拒绝的语句写入错误日志。例如：

        ```
        [Note] Plugin MYSQL_FIREWALL reported:
        'ACCESS DENIED for fwuser@localhost. Reason: No match in allowlist.
        Statement: TRUNCATE TABLE `mysql` . `slow_log`'
        ```

        如果有必要，这些日志消息可能有助于识别攻击源。

    防火墙帐户配置文件现在已针对`fwuser@localhost`账户当客户端使用该帐户连接并尝试执行语句时，配置文件会保护MySQL不受配置文件allowlist不匹配的语句的影响。

    在不拒绝访问的情况下，可以通过将不匹配的语句记录为可疑语句来检测入侵。首先，将帐户配置文件放入`探测`模式：


```
CALL mysql.sp_set_firewall_mode('fwuser@localhost', 'DETECTING');
```

然后，使用account执行与account profile allowlist不匹配的语句。在里面`探测`模式下，防火墙允许执行非匹配语句：

```
mysql> SHOW TABLES LIKE 'customer%';
+------------------------------+
| Tables_in_sakila (customer%) |
+------------------------------+
| customer                     |
| customer_list                |
+------------------------------+
```

此外，防火墙会将一条消息写入错误日志：

```
[Note] Plugin MYSQL_FIREWALL reported:
'SUSPICIOUS STATEMENT from 'fwuser@localhost'. Reason: No match in allowlist.
Statement: SHOW TABLES LIKE ?'
```

要禁用帐户配置文件，请将其模式更改为`关`:

```
CALL mysql.sp_set_firewall_mode(user, 'OFF');
```

要忘记某个配置文件的所有培训并将其禁用，请重置它：

```
CALL mysql.sp_set_firewall_mode(user, 'RESET');
```

重置操作会导致防火墙删除配置文件的所有规则，并将其模式设置为`关`.

##### 监控防火墙

要评估防火墙活动，请检查其状态变量。例如，在执行前面所示的程序以培训和保护`fwgrp`组配置文件，变量如下所示：

```
mysql> SHOW GLOBAL STATUS LIKE 'Firewall%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Firewall_access_denied     | 3     |
| Firewall_access_granted    | 4     |
| Firewall_access_suspicious | 1     |
| Firewall_cached_entries    | 4     |
+----------------------------+-------+
```

这些变量分别表示拒绝、接受、记录为可疑和添加到缓存中的语句数。这个[`防火墙_访问_授权`](firewall-reference.html#statvar_Firewall_access_granted)计数是4，因为`@@版本注释`政府发出的声明[**mysql**](mysql.html)使用注册帐户连接的三次客户端中的每一次，以及[`展示桌子`](show-tables.html)未被阻止的声明`探测`模式

##### 将帐户配置文件迁移到组配置文件

在MySQL 8.0.23之前，MySQL Enterprise Firewall只支持应用于单个帐户的帐户配置文件。从MySQL 8.0.23开始，防火墙还支持组配置文件，每个配置文件可以应用于多个帐户。当同一个allowlist应用于多个帐户时，组配置文件可以简化管理：与其为每个帐户创建一个帐户配置文件并在所有这些配置文件中复制allowlist，不如创建一个组配置文件并使帐户成为其中的成员。然后，group allowlist应用于所有帐户。

具有单个成员帐户的组配置文件在逻辑上等同于该帐户的帐户配置文件，因此可以仅使用组配置文件而不是帐户和组配置文件的组合来管理防火墙。对于新的防火墙安装，这是通过统一创建新的配置文件作为组配置文件并避免使用帐户配置文件来实现的。

由于组配置文件提供了更大的灵活性，建议将所有新的防火墙配置文件创建为组配置文件。从MySQL 8.0.26开始，帐户配置文件已被弃用，在未来的MySQL版本中可能会被删除。对于已经包含帐户配置文件的防火墙安装的升级，MySQL 8.0.26及更高版本中的MySQL Enterprise firewall包含一个名为`sp_迁移_防火墙_用户_到_组（）`帮助您将帐户配置文件转换为组配置文件。要使用它，请以拥有[`防火墙管理`](privileges-provided.html#priv_firewall-admin)特权：

1.  通过查询[`信息模式。MYSQL_防火墙_用户`](information-schema-mysql-firewall-users-table.html)桌子例如：

    ```
    mysql> SELECT USERHOST FROM INFORMATION_SCHEMA.MYSQL_FIREWALL_USERS;
    +-------------------------------+
    | USERHOST                      |
    +-------------------------------+
    | admin@localhost               |
    | local_client@localhost        |
    | remote_client@abc.example.com |
    +-------------------------------+
    ```

2.  对于上一步识别的每个帐户配置文件，将其转换为组配置文件：

    ```
    CALL mysql.sp_migrate_firewall_user_to_group('admin@localhost', 'admins');
    CALL mysql.sp_migrate_firewall_user_to_group('local_client@localhost', 'local_clients');
    CALL mysql.sp_migrate_firewall_user_to_group('remote_client@localhost', 'remote_clients');
    ```

    在每种情况下，帐户配置文件都必须存在，并且当前不能处于`记录`模式，并且组配置文件必须不存在。生成的组配置文件将命名帐户作为其单个登记成员，该成员也被设置为组培训帐户。组配置文件操作模式取自帐户配置文件操作模式。

    有关的更多详细信息`sp_迁移_防火墙_用户_到_组（）`看见[防火墙杂项存储过程](firewall-reference.html#firewall-stored-routines-miscellaneous).
