在使用 MySQL Enterprise Firewall 之前,请按照第 6.4.7.2 节“安装或卸载 MySQL Enterprise Firewall”中提供的说明进行安装。
本节介绍如何使用 SQL 语句配置 MySQL Enterprise Firewall。或者,MySQL Workbench 6.3.4 或更高版本提供用于防火墙控制的图形界面。请参阅 MySQL 企业防火墙接口。
要启用或禁用防火墙,请设置
mysql_firewall_mode
系统变量。默认情况下,安装防火墙时会启用此变量。要显式控制初始防火墙状态,您可以在服务器启动时设置变量。例如,要在选项文件中启用防火墙,请使用以下行:
[mysqld]
mysql_firewall_mode=ON
修改my.cnf
后重启服务器使新设置生效。
或者,在运行时设置并保留防火墙设置:
SET PERSIST mysql_firewall_mode = OFF;
SET PERSIST mysql_firewall_mode = ON;
SET
PERSIST
为正在运行的 MySQL 实例设置一个值。它还会保存该值,使其在随后的服务器重新启动时继续使用。要更改正在运行的 MySQL 实例的值而不使其延续到后续重新启动,请使用GLOBAL
关键字而不是PERSIST
. 请参阅
第 13.7.6.1 节,“变量赋值的 SET 语法”。
安装防火墙后,将适当的权限授予 MySQL 帐户或用于管理它的帐户。权限取决于应允许帐户执行哪些防火墙操作:
将
FIREWALL_EXEMPT
特权(自 MySQL 8.0.27 起可用)授予应免于防火墙限制的任何帐户。例如,对于配置防火墙的数据库管理员来说,这很有用,可以避免配置错误导致管理员被锁定而无法执行语句的可能性。将权限授予
FIREWALL_ADMIN
应具有完全管理防火墙访问权限的任何帐户。(某些管理防火墙功能可以由具有 或已弃用 权限的帐户调用,如各个功能描述中所示。)FIREWALL_ADMIN
SUPER
将
FIREWALL_USER
权限授予任何只对其自己的防火墙规则具有管理访问权限的帐户。授予系统数据库
EXECUTE
中防火墙存储过程的权限 。mysql
这些可能会调用管理功能,因此存储过程访问也需要前面指出的这些功能所需的特权。
、和
权限只能在安装防火墙时授予,因为
FIREWALL_EXEMPT
插件
定义了这些权限。
FIREWALL_ADMIN
FIREWALL_USER
MYSQL_FIREWALL
MySQL 服务器允许客户端连接并从它们接收要执行的 SQL 语句。如果启用了防火墙,服务器会将每个不会立即因语法错误而失败的传入语句传递给它。根据防火墙是否接受该语句,服务器执行它或向客户端返回错误。本节描述防火墙如何完成接受或拒绝声明的任务。
防火墙配置文件
防火墙使用配置文件注册表来确定是否允许语句执行。配置文件具有以下属性:
一个许可名单。白名单是一组规则,用于定义配置文件可接受的语句。
当前的操作模式。该模式使配置文件能够以不同的方式使用。例如:可以将配置文件置于训练模式以建立白名单;白名单可用于限制语句执行或入侵检测;该配置文件可以完全禁用。
适用范围。范围指示配置文件适用于哪些客户端连接:
防火墙支持基于帐户的配置文件,这样每个配置文件都与特定的客户端帐户(客户端用户名和主机名组合)相匹配。例如,您可以注册一个帐户配置文件,其白名单适用于来自 的连接,
admin@localhost
并注册另一个帐户配置文件,其白名单适用于来自 的连接myapp@apphost.example.com
。从 MySQL 8.0.23 开始,防火墙支持可以有多个帐户作为成员的组配置文件,配置文件白名单同样适用于所有成员。对于需要将一组给定的允许列表规则应用于多个帐户的部署,组配置文件可以实现更轻松的管理和更大的灵活性。
最初,不存在配置文件,因此默认情况下,防火墙接受所有语句,并且对 MySQL 帐户可以执行的语句没有影响。要应用防火墙保护功能,需要明确的操作:
向防火墙注册一个或多个配置文件。
通过为每个配置文件建立白名单来训练防火墙;也就是说,配置文件允许客户端执行的语句类型。
将经过训练的配置文件置于保护模式以加强 MySQL 以防止未经授权的语句执行:
MySQL 将每个客户端会话与特定的用户名和主机名组合相关联。这种组合就是会话帐户。
对于每个客户端连接,防火墙使用会话帐户来确定哪些配置文件适用于处理来自客户端的传入语句。
防火墙只接受适用的配置文件白名单允许的语句。
大多数防火墙原则同样适用于组配置文件和帐户配置文件。两种类型的配置文件在以下方面有所不同:
帐户配置文件白名单仅适用于单个帐户。当会话帐户与作为该组成员的任何帐户匹配时,将应用组配置文件白名单。
要使用帐户配置文件将白名单应用到多个帐户,必须为每个帐户注册一个配置文件,并在每个配置文件中复制白名单。这需要单独训练每个帐户配置文件,因为每个帐户配置文件都必须使用它适用的单个帐户进行培训。
群组配置文件许可名单适用于多个账户,无需为每个账户复制。可以使用任何或所有组成员帐户来训练组配置文件,或者可以将训练限制为任何单个成员。无论哪种方式,白名单都适用于所有成员。
帐户配置文件名称基于特定的用户名和主机名组合,这些组合取决于哪些客户端连接到 MySQL 服务器。组配置文件名称由防火墙管理员选择,除了长度必须在 1 到 288 个字符之间外没有其他限制。
由于组配置文件优于帐户配置文件,并且由于具有单个成员帐户的组配置文件在逻辑上等同于该帐户的帐户配置文件,因此建议将所有新的防火墙配置文件创建为组配置文件。从 MySQL 8.0.26 开始,帐户配置文件已弃用,并可能在未来的 MySQL 版本中删除。如需转换现有帐户配置文件的帮助,请参阅将帐户配置文件 迁移到组配置文件。
防火墙提供的基于配置文件的保护可以实现以下策略:
如果应用程序具有独特的保护要求,请将其配置为使用不用于任何其他目的的帐户,并为该帐户设置组配置文件或帐户配置文件。
如果相关应用程序共享保护要求,请将每个应用程序与其自己的帐户相关联,然后将这些应用程序帐户添加为同一组配置文件的成员。或者,将所有应用程序配置为使用同一帐户并将它们与该帐户的帐户配置文件相关联。
防火墙语句匹配
防火墙执行的语句匹配不使用从客户端收到的 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 节,“性能模式语句摘要和采样”。
将
max_digest_length
系统变量设置为零会禁用摘要生成,这也会禁用需要摘要的服务器功能,例如 MySQL Enterprise Firewall。
配置文件操作模式
向防火墙注册的每个配置文件都有自己的操作模式,可从以下值中选择:
OFF
:此模式禁用配置文件。防火墙认为它处于非活动状态并忽略它。RECORDING
:这是防火墙训练模式。从与配置文件匹配的客户端收到的传入语句被认为是配置文件可接受的,并成为其“指纹”的一部分。” 防火墙记录每个语句的规范化摘要形式,以了解配置文件可接受的语句模式。每个模式都是一个规则,规则的并集就是配置文件白名单。组和帐户配置文件之间的区别在于,组配置文件的报表记录可以仅限于从单个组成员(培训成员)收到的报表。
PROTECTING
:在此模式下,配置文件允许或阻止语句执行。防火墙将传入的语句与配置文件白名单进行匹配,仅接受匹配的语句并拒绝不匹配的语句。在RECORDING
mode 中训练配置文件后,将其切换到PROTECTING
mode 以强化 MySQL 以防止偏离白名单的语句进行访问。如果mysql_firewall_trace
启用系统变量,防火墙还会将拒绝的语句写入错误日志。DETECTING
:此模式检测但不阻止入侵(可疑的语句,因为它们与配置文件白名单中的任何内容都不匹配)。在DETECTING
模式下,防火墙将可疑语句写入错误日志,但在不拒绝访问的情况下接受它们。
当为配置文件分配任何上述模式值时,防火墙会将模式存储在配置文件中。防火墙模式设置操作也允许模式值为
RESET
,但不会存储此值:将配置文件设置为RESET
模式会导致防火墙删除配置文件的所有规则并将其模式设置为OFF
。
DETECTING
在mode 或因为
启用时写入
错误日志的消息
mysql_firewall_trace
被写为 Notes,它们是信息消息。为确保此类消息出现在错误日志中并且不被丢弃,请确保错误日志记录的详细程度足以包含信息消息。例如,如果您正在使用基于优先级的日志过滤,如
第 5.4.2.5 节“基于优先级的错误日志过滤 (log_filter_internal)”中所述,请将log_error_verbosity
系统变量的值设置为 3。
应用多个配置文件时的防火墙语句处理
为简单起见,后面描述如何设置配置文件的部分采用防火墙将来自客户端的传入语句仅与单个配置文件(组配置文件或帐户配置文件)匹配的观点。但防火墙操作可能更复杂:
组配置文件可以包含多个帐户作为成员。
一个帐户可以是多个组配置文件的成员。
多个配置文件可以匹配给定的客户端。
以下描述涵盖了当可能有多个配置文件应用于传入语句时防火墙如何运行的一般情况。
如前所述,MySQL 将每个客户端会话与特定的用户名和主机名组合相关联,称为会话帐户。防火墙将会话帐户与注册的配置文件进行匹配,以确定哪些配置文件适用于处理来自会话的传入语句:
防火墙会忽略非活动配置文件(模式为 的配置文件
OFF
)。会话帐户与包含具有相同用户和主机的成员的每个活动组配置文件相匹配。可以有不止一个这样的组配置文件。
会话帐户与具有相同用户和主机的活动帐户配置文件匹配(如果有的话)。最多有一个这样的帐户资料。
换句话说,会话帐户可以匹配 0 个或多个活动组配置文件,以及 0 或 1 个活动帐户配置文件。这意味着 0、1 或多个防火墙配置文件适用于给定会话,防火墙按如下方式处理每个传入语句:
如果没有适用的配置文件,则防火墙不施加任何限制并接受该声明。
如果有适用的配置文件,它们的模式决定语句处理:
防火墙将语句记录在每个处于
RECORDING
模式的适用配置文件的白名单中。防火墙将语句写入每个适用配置文件的错误日志中
DETECTING
,该语句处于可疑的模式(与配置文件白名单不匹配)。如果至少一个适用的配置文件处于
RECORDING
或DETECTING
模式(这些模式接受所有语句),或者如果该语句与至少一个适用的配置文件的白名单相匹配,则 防火墙接受该语句PROTECTING
模式。mysql_firewall_trace
否则,防火墙拒绝该语句(如果启用了系统变量, 则将其写入错误日志 )。
考虑到该描述,接下来的部分将回到应用单个组配置文件或单个帐户配置文件时的简单情况,并介绍如何设置每种类型的配置文件。
从 MySQL 8.0.23 开始,MySQL Enterprise Firewall 支持组配置文件的注册。组配置文件可以有多个帐户作为其成员。要使用防火墙组配置文件保护 MySQL 免受来自给定帐户的传入语句,请执行以下步骤:
注册组配置文件并将其置于
RECORDING
模式。将成员帐户添加到组配置文件。
使用会员账号连接MySQL服务器,执行要学习的语句。这会训练组配置文件并建立构成配置文件许可名单的规则。
将要成为组成员的任何其他帐户添加到组配置文件。
将组配置文件切换到
PROTECTING
模式。当客户端使用作为组配置文件成员的任何帐户连接到服务器时,配置文件白名单会限制语句的执行。如果需要额外的培训,再次将组配置文件切换到
RECORDING
模式,使用新的语句模式更新其白名单,然后将其切换回PROTECTING
模式。
请遵守这些与防火墙相关的帐户参考指南:
注意帐户引用发生的上下文。要为防火墙操作命名帐户,请将其指定为单引号字符串 ( )。这与 和 等语句的常用 MySQL 约定不同,对于后者,您分别引用帐户名的用户和主机部分 ( )。
'
user_name
@host_name
'CREATE USER
GRANT
'
user_name
'@'host_name
'将帐户命名为防火墙操作的单引号字符串的要求意味着您不能使用
@
在用户名中嵌入字符的帐户。防火墙根据由服务器验证的实际用户和主机名表示的帐户评估语句。在配置文件中注册帐户时,请勿使用通配符或网络掩码:
假设
me@%.example.org
存在一个名为 的帐户,并且客户端使用它从主机连接到服务器abc.example.org
。帐户名包含
%
通配符,但服务器将客户端验证为具有用户名me
和主机名abc.example.com
,这就是防火墙所看到的。因此,用于防火墙操作的帐户名称
me@abc.example.org
不是me@%.example.org
.
以下过程显示如何向防火墙注册组配置文件,训练防火墙了解该配置文件(其白名单)可接受的语句,使用配置文件保护 MySQL 免受不可接受的语句的执行,以及添加和删除组成员。该示例使用组配置文件名称fwgrp
。该示例配置文件假定供访问数据库中表的应用程序的客户端使用sakila
(可从
https://mysql.net.cn/doc/index-other.html获得)。
使用管理 MySQL 帐户执行此过程中的步骤,但指定由防火墙组配置文件的成员帐户执行的步骤除外。对于成员账户执行的语句,默认数据库应该是
sakila
. (您可以通过相应地调整指令来使用不同的数据库。)
如有必要,创建将成为组配置文件成员的帐户
fwgrp
并授予他们适当的访问权限。此处显示一位成员的声明(选择合适的密码):CREATE USER 'member1'@'localhost' IDENTIFIED BY 'password'; GRANT ALL ON sakila.* TO 'member1'@'localhost';
使用
sp_set_firewall_group_mode()
存储过程向防火墙注册组配置文件并将配置文件置于RECORDING
(训练)模式:CALL mysql.sp_set_firewall_group_mode('fwgrp', 'RECORDING');
使用
sp_firewall_group_enlist()
存储过程添加初始成员帐户以用于培训组配置文件许可名单:CALL mysql.sp_firewall_group_enlist('fwgrp', 'member1@localhost');
要使用初始成员帐户训练组配置文件,请
member1
从服务器主机连接到服务器,以便防火墙看到会话帐户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
处于模式中的配置文件的成员RECORDING
,所以防火墙将语句解释为适用于fwgrp
并将语句的规范化摘要形式记录为允许列表中的规则fwgrp
。然后,这些规则适用于属于 的所有帐户fwgrp
。笔记直到
fwgrp
组配置文件在模式中收到语句RECORDING
,其白名单为空,相当于 “全部拒绝”。”没有语句可以匹配一个空的白名单,这具有以下含义:组配置文件无法切换到
PROTECTING
模式。它会拒绝每一条语句,有效地禁止作为组成员的帐户执行任何语句。组配置文件可以切换到
DETECTING
模式。在这种情况下,配置文件接受每条语句,但将其记录为可疑。
此时,组配置文件信息被缓存,包括其名称、成员资格和白名单。要查看此信息,请查询 Performance Schema 防火墙表:
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` | +----------------------------------------------------------------------+
笔记该
@@version_comment
规则来自 连接到服务器时 mysql客户端自动发送的语句。重要的在与应用程序使用相匹配的条件下训练防火墙。例如,为了确定服务器的特性和功能,给定的 MySQL 连接器可能会在每个会话开始时向服务器发送语句。如果通常通过该连接器使用应用程序,则也使用该连接器训练防火墙。这使得这些初始语句成为与应用程序关联的组配置文件的允许列表的一部分。
再次调用
sp_set_firewall_group_mode()
以将组配置文件切换到PROTECTING
模式:CALL mysql.sp_set_firewall_group_mode('fwgrp', 'PROTECTING');
重要的将组配置文件切换出
RECORDING
模式会将其缓存数据同步到mysql
提供持久底层存储的系统数据库表。如果您不为正在记录的配置文件切换模式,则缓存的数据不会写入持久存储,并且会在服务器重新启动时丢失。将任何其他应成为成员的帐户添加到组配置文件中:
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
帐户训练的配置文件白名单现在也适用于其他帐户。要验证更新后的组成员身份,请
firewall_membership
再次查询该表: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 | +----------+-------------------+
通过使用组中的任何帐户执行一些可接受和不可接受的语句来针对防火墙测试组配置文件。防火墙将帐户中的每个语句与配置文件白名单进行匹配,并接受或拒绝它:
此语句与训练语句不同,但会生成与其中一个语句相同的规范化语句,因此防火墙接受它:
mysql> SELECT title, release_year FROM film WHERE film_id = 98; +-------------------+--------------+ | title | release_year | +-------------------+--------------+ | BRIGHT ENCOUNTERS | 2006 | +-------------------+--------------+
这些语句与白名单中的任何内容都不匹配,因此防火墙会拒绝每个语句并显示错误:
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_trace
启用系统变量,防火墙还会将拒绝的语句写入错误日志。例如:[Note] Plugin MYSQL_FIREWALL reported: 'ACCESS DENIED for 'member1@localhost'. Reason: No match in allowlist. Statement: TRUNCATE TABLE `mysql` . `slow_log`'
如果有必要,这些日志消息可能有助于识别攻击源。
如果需要从组配置文件中删除成员,请使用
sp_firewall_group_delist()
存储过程而不是sp_firewall_group_enlist()
:CALL mysql.sp_firewall_group_delist('fwgrp', 'member3@localhost');
防火墙组配置文件现在已针对成员帐户进行了培训。当客户端使用组中的任何帐户连接并尝试执行语句时,配置文件会保护 MySQL 免受与配置文件白名单不匹配的语句的影响。
刚刚显示的过程在训练许可名单之前仅将一名成员添加到组配置文件中。这样做可以通过限制哪些帐户可以将新的可接受语句添加到允许列表来更好地控制培训期。如果需要额外培训,您可以将配置文件切换回RECORDING
模式:
CALL mysql.sp_set_firewall_group_mode('fwgrp', 'RECORDING');
但是,这使该组的任何成员都可以执行语句并将它们添加到白名单中。要将额外训练限制为单个组成员,请调用
sp_set_firewall_group_mode_and_user()
,这类似于sp_set_firewall_group_mode()
但需要一个参数来指定允许哪个帐户在RECORDING
mode 中训练配置文件。例如,要仅通过 启用培训
member4@localhost
,请执行以下操作:
CALL mysql.sp_set_firewall_group_mode_and_user('fwgrp', 'RECORDING', 'member4@localhost');
这使得指定帐户可以进行额外的培训,而无需删除其他组成员。他们可以执行语句,但语句不会添加到白名单中。(但是请记住,在
RECORDING
模式下,其他成员可以执行任何语句。)
当特定帐户被指定为组配置文件的培训帐户时,为避免意外行为,请始终确保该帐户是该组的成员。
额外训练后,将组配置文件设置回
PROTECTING
模式:
CALL mysql.sp_set_firewall_group_mode('fwgrp', 'PROTECTING');
建立的培训帐户
sp_set_firewall_group_mode_and_user()
保存在组配置文件中,因此防火墙会记住它,以备日后需要更多培训时使用。因此,如果您调用
sp_set_firewall_group_mode()
(不带培训帐户参数),则当前配置文件培训帐户member4@localhost
保持不变。
如果确实需要让所有组成员以
RECORDING
模式执行训练,要清除训练帐户,请调用
sp_set_firewall_group_mode_and_user()
并传递NULL
帐户参数的值:
CALL mysql.sp_set_firewall_group_mode_and_user('fwgrp', 'RECORDING', NULL);
可以通过将不匹配的语句记录为可疑而不拒绝访问来检测入侵。首先,将组配置文件置于DETECTING
模式中:
CALL mysql.sp_set_firewall_group_mode('fwgrp', 'DETECTING');
然后,使用成员帐户执行与组配置文件白名单不匹配的语句。在
DETECTING
模式下,防火墙允许不匹配的语句执行:
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 ?'
要禁用组配置文件,请将其模式更改为
OFF
:
CALL mysql.sp_set_firewall_group_mode(group, 'OFF');
要忘记配置文件的所有训练并禁用它,请重置它:
CALL mysql.sp_set_firewall_group_mode(group, 'RESET');
重置操作会导致防火墙删除配置文件的所有规则并将其模式设置为OFF
。
MySQL Enterprise Firewall 允许注册与个人帐户相对应的配置文件。要使用防火墙帐户配置文件保护 MySQL 免受来自给定帐户的传入语句,请执行以下步骤:
注册帐户资料并将其置于
RECORDING
模式。使用账号连接MySQL服务器,执行学习语句。这会训练帐户配置文件并建立构成配置文件白名单的规则。
将帐户配置文件切换到
PROTECTING
模式。当客户端使用该帐户连接到服务器时,帐户配置文件白名单会限制语句的执行。如果需要额外的培训,请再次将帐户配置文件切换到
RECORDING
模式,使用新的语句模式更新其白名单,然后将其切换回PROTECTING
模式。
请遵守这些与防火墙相关的帐户参考指南:
注意帐户引用发生的上下文。要为防火墙操作命名帐户,请将其指定为单引号字符串 ( )。这与 和 等语句的常用 MySQL 约定不同,对于后者,您分别引用帐户名的用户和主机部分 ( )。
'
user_name
@host_name
'CREATE USER
GRANT
'
user_name
'@'host_name
'将帐户命名为防火墙操作的单引号字符串的要求意味着您不能使用
@
在用户名中嵌入字符的帐户。防火墙根据由服务器验证的实际用户和主机名表示的帐户评估语句。在配置文件中注册帐户时,请勿使用通配符或网络掩码:
假设
me@%.example.org
存在一个名为 的帐户,并且客户端使用它从主机连接到服务器abc.example.org
。帐户名包含
%
通配符,但服务器将客户端验证为具有用户名me
和主机名abc.example.com
,这就是防火墙所看到的。因此,用于防火墙操作的帐户名称
me@abc.example.org
不是me@%.example.org
.
以下过程显示如何向防火墙注册帐户配置文件,训练防火墙了解该配置文件(其白名单)可接受的语句,并使用配置文件保护 MySQL 免受帐户执行不可接受的语句。假设示例帐户
fwuser@localhost
供访问数据库中表的应用程序使用
sakila
(可从
https://mysql.net.cn/doc/index-other.html获得)。
使用管理 MySQL 帐户执行此过程中的步骤,但指定由fwuser@localhost
与在防火墙中注册的帐户配置文件相对应的帐户执行的步骤除外。对于使用此帐户执行的语句,默认数据库应为sakila
. (您可以通过相应地调整指令来使用不同的数据库。)
如有必要,创建用于执行语句的帐户(选择适当的密码)并授予其
sakila
数据库权限:CREATE USER 'fwuser'@'localhost' IDENTIFIED BY 'password'; GRANT ALL ON sakila.* TO 'fwuser'@'localhost';
使用
sp_set_firewall_mode()
存储过程向防火墙注册帐户配置文件并将配置文件置于RECORDING
(训练)模式:CALL mysql.sp_set_firewall_mode('fwuser@localhost', 'RECORDING');
要训练注册的帐户配置文件,请
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());
由于配置文件处于
RECORDING
模式中,防火墙将语句的规范化摘要形式记录为配置文件白名单中的规则。笔记直到
fwuser@localhost
帐户配置文件在RECORDING
模式中收到语句,其白名单为空,相当于“全部拒绝”。” 没有语句可以匹配一个空的白名单,这具有以下含义:帐户配置文件无法切换到
PROTECTING
模式。它会拒绝每一条语句,有效地禁止帐户执行任何语句。帐户配置文件可以切换到
DETECTING
模式。在这种情况下,配置文件接受每条语句,但将其记录为可疑。
此时,帐户配置文件信息被缓存。要查看此信息,请查询
INFORMATION_SCHEMA
防火墙表: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 ? | +----------------------------------------------------------------------------+
笔记该
@@version_comment
规则来自 连接到服务器时 mysql客户端自动发送的语句。重要的在与应用程序使用相匹配的条件下训练防火墙。例如,为了确定服务器的特性和功能,给定的 MySQL 连接器可能会在每个会话开始时向服务器发送语句。如果通常通过该连接器使用应用程序,则也使用该连接器训练防火墙。这使这些初始报表成为与应用程序关联的帐户配置文件的许可列表的一部分。
再次调用
sp_set_firewall_mode()
,这次将帐户配置文件切换到PROTECTING
模式:CALL mysql.sp_set_firewall_mode('fwuser@localhost', 'PROTECTING');
重要的将帐户配置文件退出
RECORDING
模式会将其缓存数据同步到mysql
提供持久底层存储的系统数据库表。如果您不为正在记录的配置文件切换模式,则缓存的数据不会写入持久存储,并且会在服务器重新启动时丢失。通过使用帐户执行一些可接受和不可接受的语句来测试帐户配置文件。防火墙将帐户中的每个语句与配置文件白名单进行匹配,并接受或拒绝它:
此语句与训练语句不同,但会生成与其中一个语句相同的规范化语句,因此防火墙接受它:
mysql> SELECT first_name, last_name FROM customer WHERE customer_id = '48'; +------------+-----------+ | first_name | last_name | +------------+-----------+ | ANN | EVANS | +------------+-----------+
这些语句与白名单中的任何内容都不匹配,因此防火墙会拒绝每个语句并显示错误:
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_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 免受配置文件白名单不匹配的语句的影响。
可以通过将不匹配的语句记录为可疑而不拒绝访问来检测入侵。首先,将帐户配置文件置于DETECTING
模式中:
CALL mysql.sp_set_firewall_mode('fwuser@localhost', 'DETECTING');
然后,使用该帐户执行与帐户配置文件白名单不匹配的语句。在
DETECTING
模式下,防火墙允许不匹配的语句执行:
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 ?'
要禁用帐户配置文件,请将其模式更改为
OFF
:
CALL mysql.sp_set_firewall_mode(user, 'OFF');
要忘记配置文件的所有训练并禁用它,请重置它:
CALL mysql.sp_set_firewall_mode(user, 'RESET');
重置操作会导致防火墙删除配置文件的所有规则并将其模式设置为OFF
。
要评估防火墙活动,请检查其状态变量。例如,在执行前面显示的过程来训练和保护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_access_granted
计数为 4 是因为mysql客户端每次使用注册帐户连接 3 次时@@version_comment
发送的
语句,加上未在模式中阻塞的语句。
SHOW TABLES
DETECTING
在 MySQL 8.0.23 之前,MySQL Enterprise Firewall 仅支持每个应用到单个帐户的帐户配置文件。从 MySQL 8.0.23 开始,防火墙还支持组配置文件,每个配置文件可以应用于多个帐户。当将同一个白名单应用于多个账户时,群组配置文件可以更轻松地管理:不是为每个账户创建一个账户配置文件并在所有这些配置文件中复制许可名单,而是创建一个群组配置文件并使账户成为其中的成员。然后,组许可名单将应用于所有帐户。
具有单个成员帐户的组配置文件在逻辑上等同于该帐户的帐户配置文件,因此可以专门使用组配置文件来管理防火墙,而不是混合使用帐户和组配置文件。对于新的防火墙安装,这是通过统一创建新配置文件作为组配置文件并避免帐户配置文件来实现的。
由于组配置文件提供了更大的灵活性,建议将所有新的防火墙配置文件创建为组配置文件。从 MySQL 8.0.26 开始,帐户配置文件已弃用,并可能在未来的 MySQL 版本中删除。对于已包含帐户配置文件的防火墙安装的升级,MySQL 8.0.26 及更高版本中的 MySQL Enterprise Firewall 包含一个名为
sp_migrate_firewall_user_to_group()
帮助您将帐户配置文件转换为组配置文件的存储过程。要使用它,请以具有权限的用户身份执行以下过程
FIREWALL_ADMIN
:
INFORMATION_SCHEMA.MYSQL_FIREWALL_USERS
通过查询表 来确定存在哪些帐户配置文件 。例如:mysql> SELECT USERHOST FROM INFORMATION_SCHEMA.MYSQL_FIREWALL_USERS; +-------------------------------+ | USERHOST | +-------------------------------+ | admin@localhost | | local_client@localhost | | remote_client@abc.example.com | +-------------------------------+
对于上一步识别的每个帐户配置文件,将其转换为组配置文件:
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');
在每种情况下,帐户配置文件必须存在且当前不得处于
RECORDING
模式中,并且组配置文件不得已存在。生成的组配置文件将命名帐户作为其单个入伍成员,该帐户也设置为组培训帐户。组配置文件操作模式取自帐户配置文件操作模式。
有关更多详细信息
sp_migrate_firewall_user_to_group()
,请参阅
防火墙杂项存储过程。