在使用MySQL企业防火墙之前,请按照《MySQL企业防火墙》中的说明进行安装第6.4.7.2节“安装或卸载MySQL企业防火墙”.
介绍如何使用SQL语句配置MySQL企业防火墙。另外,MySQL Workbench 6.3.4或更高版本为防火墙控制提供了图形界面。看到MySQL企业防火墙接口.
若要启用或禁用防火墙,请设置mysql_firewall_mode
系统变量。缺省情况下,安装防火墙时启用此变量。要显式地控制初始防火墙状态,可以在服务器启动时设置该变量。例如,要在选项文件中启用防火墙,使用以下行:
(mysqld) mysql_firewall_mode =
修改后my.cnf
,重新启动服务器使新设置生效。
或者,在运行时设置并保存防火墙设置:
SET PERSIST mysql_firewall_mode = OFF;SET PERSIST mysql_firewall_mode = ON;
设置保存
为正在运行的MySQL实例设置一个值。它还会保存该值,使其保留到后续服务器重新启动时。要更改正在运行的MySQL实例的值,而不将其保留到后续重启时,请使用全球
关键字,而不是坚持
.看到第13.7.6.1节“变量赋值的SET语法”.
安装了防火墙后,向MySQL帐户授予适当的特权,以便用于管理它。权限取决于一个帐户应该被允许执行哪些防火墙操作:
授予
FIREWALL_EXEMPT
特权(从MySQL 8.0.27可用)到任何应该免受防火墙限制的帐户。例如,对于配置防火墙的数据库管理员来说,这很有用,可以避免错误配置导致管理员被锁定而无法执行语句的可能性。授予
FIREWALL_ADMIN
应具有完全管理防火墙访问权限的任何帐户的特权。(某些管理防火墙功能可以由具有FIREWALL_ADMIN
或弃用的超级
特权,如个别功能描述所示。)授予
FIREWALL_USER
特权到应该只对其自己的防火墙规则具有管理访问权限的任何帐户。授予
执行
中的防火墙存储过程的权限mysql
系统数据库。它们可能调用管理函数,因此存储过程访问还需要前面指出的这些函数所需的特权。
的FIREWALL_EXEMPT
,FIREWALL_ADMIN
,FIREWALL_USER
只有在安装了防火墙的情况下才能授予权限MYSQL_FIREWALL
Plugin定义了这些特权。
MySQL服务器允许客户端连接并从客户端接收要执行的SQL语句。如果启用了防火墙,则服务器将不会立即出现语法错误而失败的每个传入语句传递给它。根据防火墙是否接受该语句,服务器执行它或向客户机返回一个错误。本节描述防火墙如何完成接受或拒绝语句的任务。
防火墙配置文件
防火墙使用配置文件的注册表来决定是否允许语句执行。概要文件具有以下属性:
一个allowlist。allowlist是一组规则,用于定义概要文件可以接受哪些语句。
当前的操作模式。该模式允许以不同的方式使用概要文件。例如:配置文件可以放在训练模式下建立allowlist;allowlist可以用于限制语句执行或入侵检测;可以完全禁用该概要文件。
适用范围。作用域表示配置文件适用于哪些客户端连接:
防火墙支持基于帐户的概要文件,每个概要文件都匹配特定的客户端帐户(客户端用户名和主机名组合)。例如,您可以注册一个帐户配置文件,其中allowlist应用于来自的连接
admin@localhost
以及allowlist应用于来自的连接的另一个帐户配置文件myapp@apphost.example.com
.从MySQL 8.0.23开始,防火墙支持可以有多个帐户作为成员的组配置文件,配置文件allowlist平等地应用于所有成员。对于需要对多个帐户应用给定的allowlist规则集的部署,组概要文件支持更容易的管理和更大的灵活性。
最初,没有配置文件存在,所以默认情况下,防火墙接受所有语句,对MySQL帐户可以执行哪些语句没有影响。要应用防火墙保护功能,需要明确的操作:
向防火墙注册一个或多个概要文件。
通过为每个配置文件建立allowlist来训练防火墙;也就是说,概要文件允许客户端执行的语句类型。
将经过训练的配置文件设置为保护模式,以加强MySQL对未经授权语句的执行:
MySQL将每个客户端会话与特定的用户名和主机名组合关联起来。这个组合就是会话帐户.
对于每个客户机连接,防火墙使用会话帐户来确定哪些配置文件适用于处理来自客户机的传入语句。
防火墙只接受应用配置文件allowlists允许的语句。
大多数防火墙原则同样适用于组配置文件和帐户配置文件。这两种类型的概要文件在以下方面有所不同:
帐户配置文件allowlist只适用于单个帐户。当会话帐户匹配该组成员的任何帐户时,应用组配置文件allowlist。
要使用帐户配置文件将allowlist应用到多个帐户,有必要为每个帐户注册一个配置文件,并在每个配置文件中复制allowlist。这需要单独训练每个帐户配置文件,因为每个帐户都必须使用它所应用的单一帐户进行训练。
组配置文件allowlist适用于多个帐户,不需要为每个帐户复制它。可以使用任何或所有组成员帐户来训练组配置文件,也可以将训练限制在任何单个成员。无论哪种方式,allowlist都适用于所有成员。
帐户配置文件名称基于特定的用户名和主机名组合,这取决于连接到MySQL服务器的客户机。组配置文件名称由防火墙管理员选择,除了长度必须在1到288个字符之间之外没有其他限制。
由于组配置文件优于帐户配置文件,并且由于具有单个成员帐户的组配置文件在逻辑上等同于该帐户的帐户配置文件,因此建议将所有新的防火墙配置文件创建为组配置文件。帐户配置文件从MySQL 8.0.26起已弃用,在未来的MySQL版本中将被删除。有关转换现有帐户概要文件的帮助,请参见将帐户概要文件迁移到组概要文件.
防火墙提供的基于配置文件的保护可以实现如下策略:
如果应用程序有独特的保护需求,请将其配置为使用一个不用于任何其他目的的帐户,并为该帐户设置组配置文件或帐户配置文件。
如果相关应用程序共享保护需求,则将每个应用程序与自己的帐户关联,然后将这些应用程序帐户添加为同一组概要文件的成员。或者,将所有应用程序配置为使用相同的帐户,并将它们与该帐户的帐户配置文件关联。
防火墙语句匹配
防火墙执行的语句匹配不使用从客户端接收到的SQL语句。相反,服务器将传入的语句转换为规范化摘要形式,防火墙操作使用这些摘要。语句规范化的好处在于,它允许使用单一模式对相似的语句进行分组和识别。例如,这些语句彼此不同:
SELECT first_name, last_name FROM customerSelect from customer_id = 99;SELECT first_name, last_name FROM customer_id = 143
但它们都有相同的标准化摘要形式:
SELECT ' first_name ', ' last_name ' FROM ' customer ' WHERE ' customer_id ' = ?
通过使用规范化,防火墙允许列表可以存储每个匹配从客户端收到的许多不同语句的摘要。有关规范化和摘要的更多信息,请参见第27.10节“性能模式语句摘要和抽样”.
设置max_digest_length
system变量为零将禁用摘要生成,这也将禁用需要摘要的服务器功能,例如MySQL企业防火墙。
配置文件操作模式
每个注册到防火墙的配置文件都有自己的操作模式,从以下值中选择:
从
:禁用配置文件。防火墙认为它是不活动的并忽略它。记录
:防火墙训练模式。从匹配概要文件的客户端接收的传入语句被认为是概要文件可接受的,并成为概要文件的一部分”指纹。”防火墙记录每个语句的规范化摘要形式,以了解概要文件可接受的语句模式。每个模式都是一条规则,规则的并集是概要文件allowlist。组配置文件和帐户配置文件之间的区别在于,组配置文件的报表记录可以限制为从单个组成员(培训成员)接收的报表。
保护
:在该模式下,配置文件允许或禁止语句执行。防火墙将传入的语句与配置文件allowlist进行匹配,只接受匹配的语句,拒绝不匹配的语句。训练后的一个侧面记录
模式,切换到保护
模式来加强MySQL对偏离allowlist语句的访问。如果mysql_firewall_trace
如果启用系统变量,则防火墙还会将拒绝的语句写入错误日志。检测
:该模式检测但不阻止入侵(由于与配置文件allowlist中任何内容都不匹配而可疑的语句)。在检测
模式下,防火墙将可疑语句写入错误日志,但不拒绝访问而接受它们。
当配置文件被配置为上述模式值时,防火墙将该模式保存在配置文件中。防火墙模式设置操作还允许模式值为重置
,但不存储此值:将配置文件设置为重置
Mode表示防火墙删除该配置文件的所有规则,并将其模式设置为从
.
写入错误登录的消息检测
模式或因为mysql_firewall_trace
被写入Notes,这是信息消息。要确保这些消息出现在错误日志中并且不会被丢弃,请确保错误日志的详细程度足以包括信息消息。例如,如果您正在使用基于优先级的日志过滤,如第5.4.2.5节“基于优先级的错误日志过滤(log_filter_internal)”,设置log_error_verbosity
系统变量的值为3。
应用多个概要文件时的防火墙语句处理
为了简单起见,后面描述如何设置概要文件的部分采用这样一种观点:防火墙仅根据单个概要文件(组概要文件或帐户概要文件)匹配来自客户机的传入语句。但是防火墙的操作可能更复杂:
一个组配置文件可以包含多个帐户作为成员。
一个帐户可以是多个组配置文件的成员。
多个概要文件可以匹配给定的客户机。
下面的描述将介绍当可能有多个概要文件应用于传入语句时,防火墙如何操作的一般情况。
如前所述,MySQL将每个客户机会话与特定的用户名和主机名组合相关联,称为会话帐户.防火墙将会话帐户与注册的配置文件进行匹配,以确定哪些配置文件适用于处理来自会话的传入语句:
防火墙忽略不活动的概要文件(模式为的概要文件)
从
).会话帐户匹配每个活动组配置文件,其中包含具有相同用户和主机的成员。可以有多个这样的组配置文件。
会话帐户与具有相同用户和主机(如果存在)的活动帐户配置文件相匹配。最多有一个这样的帐户配置文件。
换句话说,会话帐户可以匹配0个或多个活动组概要文件,以及0个或1个活动帐户概要文件。这意味着0、1或多个防火墙配置文件适用于给定的会话,对于这些会话,防火墙按以下方式处理每个传入语句:
如果没有适用的概要文件,防火墙将不施加任何限制并接受该语句。
如果有适用的概要文件,它们的模式决定语句处理:
防火墙在每个适用概要文件的allowlist中记录语句
记录
模式。中的每个适用概要文件的错误日志中写入该语句
检测
模式的语句是可疑的(不匹配配置文件allowlist)。如果至少包含一个适用的概要文件,则防火墙接受该语句
记录
或检测
模式(这些模式接受所有语句),或者该语句匹配中至少一个适用概要文件的allowlist保护
模式。否则,防火墙将拒绝该语句(并将其写入错误日志中mysql_firewall_trace
系统变量已启用)。
了解了上述描述后,下一节将回到应用单个组配置文件或单个帐户配置文件时的简单情况,并介绍如何设置每种类型的配置文件。
MySQL企业防火墙从MySQL 8.0.23开始支持组配置文件的注册。一个组配置文件可以有多个帐户作为其成员。要使用防火墙组配置文件来保护MySQL不受来自给定帐户的输入语句的影响,请遵循以下步骤:
注册群组配置文件并将其放入
记录
模式。在群组配置文件中添加成员帐户。
使用成员帐户连接MySQL服务器并执行要学习的语句。这将训练组概要文件并建立形成概要文件allowlist的规则。
将要成为组成员的任何其他帐户添加到组配置文件中。
将组配置文件切换为
保护
模式。当客户机使用组概要文件成员的任何帐户连接到服务器时,概要文件allowlist将限制语句的执行。是否需要额外的培训,将组配置文件切换到
记录
模式再次使用新的语句模式更新其allowlist,然后将其切换回保护
模式。
对于防火墙相关的帐户参考,请遵守以下指导方针:
注意帐户引用发生的上下文。要为防火墙操作命名帐户,请将其指定为单引号字符串(
'
).这与通常的MySQL语句约定不同,例如user_name
@host_name
'创建用户
而且格兰特
,为此,您分别引用帐户名的用户和主机部分('
).user_name
“@”host_name
'要求将帐户命名为用于防火墙操作的单引号字符串,这意味着您不能使用已嵌入的帐户
@
用户名中的字符。防火墙根据由服务器验证的实际用户名和主机名表示的帐户评估语句。在配置文件中注册帐户时,不要使用通配符或网络掩码:
假设一个名为
me@ % .example.org
存在,客户端使用它从主机连接到服务器abc.example.org
.帐户名中包含
%
通配符,但是服务器验证客户机具有的用户名我
的主机名。abc.example.com
,这就是防火墙所看到的。因此,用于防火墙操作的帐户名为
me@abc.example.org
而不是me@ % .example.org
.
下面的过程展示了如何向防火墙注册一个组配置文件,训练防火墙了解该配置文件的可接受语句(它的allowlist),使用该配置文件保护MySQL不执行不可接受的语句,以及添加和删除组成员。该示例使用组配置文件名称fwgrp
.中的表访问的应用程序的客户机将使用示例概要文件sakila
数据库(可以在https://dev.10bet靠谱mysql.com/doc/index-other.html).
使用管理MySQL帐户执行此过程中的步骤,但防火墙组概要文件的成员帐户指定执行的步骤除外。对于成员帐户执行的语句,默认数据库应为sakila
.(您可以通过调整相应的说明来使用不同的数据库。)
的成员创建帐户
fwgrp
分组配置文件并授予他们适当的访问权限。一个成员的语句显示在这里(选择一个适当的密码):创建用户“member1”@“localhost”密码”;全力支援萨基拉。*“member1”@“localhost”;
使用
sp_set_firewall_group_mode ()
向防火墙注册组配置文件并将配置文件放置其中的存储过程记录
(培训)模式:调用mysql.sp_set_firewall_group_mode ('fwgrp','记录');
使用
sp_firewall_group_enlist ()
添加初始成员帐户以用于训练组配置文件allowlist的存储过程:叫mysql。sp_firewall_group_enlist(“fwgrp”、“member1@localhost”);
若要使用初始成员帐户训练组配置文件,请以
member1中
的会话帐户,以便防火墙看到member1@localhost
.然后执行一些对概要文件来说是合法的语句。例如:SELECT title, release_year FROM film_id = 1;UPDATE actor SET last_update = NOW() WHERE actor_id = 1;SELECT store_id, COUNT(*) FROM
的语句接收
member1@localhost
帐户。因为那个账户是fwgrp
Profile,在记录
模式时,防火墙将这些语句解释为适用于fwgrp
并将语句的规范化摘要形式作为规则记录在fwgrp
allowlist。这些规则适用于会员的所有账户fwgrp
.请注意直到
fwgrp
中的组配置文件接收语句记录
模式,其allowlist为空,相当于”否认所有。”没有语句可以匹配空allowlist,这有以下含义:无法切换到组配置文件
保护
模式。它将拒绝每个语句,有效地禁止属于组成员的帐户执行任何语句。可以切换到组配置文件
检测
模式。在本例中,概要文件接受每个语句,但将其记录为可疑语句。
此时,将缓存组配置文件信息,包括其名称、成员和allowlist。要查看此信息,请查询Performance Schema防火墙表:
SELECT MODE FROM performance_schema。firewall_groups WHERE NAME = 'fwgrp';+-----------+ | 模式 | +-----------+ | 记录 | +-----------+ 从performance_schema mysql > SELECT *。WHERE GROUP_ID = 'fwgrp' ORDER BY MEMBER_ID;+----------+-------------------+ | GROUP_ID | MEMBER_ID | +----------+-------------------+ | fwgrp | member1@localhost | +----------+-------------------+ mysql >从performance_schema选择规则。firewall_group_allowlist WHERE NAME = 'fwgrp';+----------------------------------------------------------------------+ | 规则 | +----------------------------------------------------------------------+ | 选择@@ version_comment的限制?| | UPDATE ' actor ' SET ' last_update ' = NOW () WHERE ' actor ' = ?SELECT ' title ', ' release_year ' FROM ' film ' WHERE ' film_id ' = ?| |选择‘可以’,COUNT(*)”可以从“库存”组 ` | +----------------------------------------------------------------------+
请注意的
@@version_comment
的自动发送的语句mysql客户端连接到服务器。重要的在符合应用程序使用的条件下对防火墙进行培训。例如,为了确定服务器的特性和功能,给定的MySQL连接器可能在每个会话开始时向服务器发送语句。如果应用程序通常通过该连接器使用,那么也要使用该连接器训练防火墙。这使那些初始语句成为与应用程序相关联的组配置文件的allowlist的一部分。
调用
sp_set_firewall_group_mode ()
再次将组配置文件切换为保护
模式:调用mysql.sp_set_firewall_group_mode ('fwgrp','保护');
重要的切换出组配置文件
记录
模式将其缓存的数据同步到mysql
提供持久底层存储的系统数据库表。如果不切换正在记录的配置文件的模式,则缓存的数据不会写入持久存储,并且在服务器重新启动时丢失。向组配置文件中添加任何其他应成为成员的帐户:
叫mysql。sp_firewall_group_enlist(“fwgrp”、“member2@localhost”);叫mysql。sp_firewall_group_enlist(“fwgrp”、“member3@localhost”);叫mysql。sp_firewall_group_enlist(“fwgrp”、“member4@localhost”);
类训练的配置文件allowlist
member1@localhost
帐户现在也适用于附加帐户。如果需要验证更新后的组成员关系,请查询
firewall_membership
表:SELECT * FROM performance_schema。firewall_membershipWHERE GROUP_ID = 'fwgrp' ORDER BY MEMBER_ID; +----------+-------------------+ | GROUP_ID | MEMBER_ID | +----------+-------------------+ | fwgrp | member1@localhost | | fwgrp | member2@localhost | | fwgrp | member3@localhost | | fwgrp | member4@localhost | +----------+-------------------+
通过使用组中的任何帐户在防火墙上测试组概要文件,以执行一些可接受和不可接受的语句。防火墙将帐户中的每个语句与配置文件allowlist进行匹配,并接受或拒绝它:
该语句与训练语句不相同,但产生与其中一个训练语句相同的规范化语句,因此防火墙接受它:
mysql> SELECT title, WHERE film_id = 98;+-------------------+--------------+ | 标题| release_year | +-------------------+--------------+ | 明亮的遇到| 2006 | +-------------------+--------------+
这些语句在allowlist中没有匹配任何东西,所以防火墙会拒绝每个语句并返回一个错误:
mysql> SELECT title, WHERE film_id = 98 OR TRUE;错误1045 (28000):Statement was blocked by Firewall mysql> SHOW TABLES LIKE 'customer%';错误1045 (28000):Statement was blocked by Firewall mysql> TRUNCATE TABLE mysql.slow_log;错误1045(28000):语句被防火墙阻止
如果
mysql_firewall_trace
如果启用系统变量,则防火墙还会将拒绝的语句写入错误日志。例如:[注]Plugin MYSQL_FIREWALL报告:'ACCESS DENIED for 'member1@localhost'。原因:allowlist中没有匹配。语句:TRUNCATE TABLE ' mysql '。slow_log”
如果有必要,这些日志消息可能有助于识别攻击源。
是否需要从组配置文件中删除成员,请使用
sp_firewall_group_delist ()
存储过程而不是sp_firewall_group_enlist ()
:叫mysql。sp_firewall_group_delist(“fwgrp”、“member3@localhost”);
防火墙组配置文件现在为成员帐户进行了训练。当客户端使用组中的任何帐户连接并试图执行语句时,配置文件保护MySQL不受配置文件allowlist不匹配的语句的影响。
刚刚显示的过程在训练组配置文件的allowlist之前只向组配置文件添加了一个成员。这样做可以通过限制哪些帐户可以向allowlist添加新的可接受报表来更好地控制培训期间。如果需要额外的培训,您可以将概要文件切换回记录
模式:
调用mysql.sp_set_firewall_group_mode ('fwgrp','记录');
但是,这使得组的任何成员都可以执行语句并将它们添加到allowlist中。若要将额外的培训限制在单个组成员,请调用sp_set_firewall_group_mode_and_user ()
,这就像sp_set_firewall_group_mode ()
但是需要另外一个参数,指定允许在哪个帐户中训练概要文件记录
模式。例如,仅通过member4@localhost
这样做:
叫mysql。sp_set_firewall_group_mode_and_user(“fwgrp”、“记录”、“member4@localhost”);
这样就可以通过指定的帐户进行额外的培训,而不必删除其他组成员。它们可以执行语句,但语句不会被添加到allowlist中。(然而,请记住,在记录
模式,其他成员可以执行任何声明。)
为避免在将特定帐户指定为组配置文件的培训帐户时出现意外行为,请始终确保该帐户是组的成员。
在完成额外的培训后,将组配置文件设置回保护
模式:
调用mysql.sp_set_firewall_group_mode ('fwgrp','保护');
建立的培训帐户sp_set_firewall_group_mode_and_user ()
保存在组配置文件中,这样防火墙就会记住它,以防以后需要进行更多的训练。因此,如果你打电话sp_set_firewall_group_mode ()
(不接受培训帐户参数),当前配置文件培训帐户,member4@localhost
,保持不变。
清除培训帐户,如果确实需要使所有小组成员都能在记录
模式,调用sp_set_firewall_group_mode_and_user ()
,通过一个零
account参数的值:
叫mysql。sp_set_firewall_group_mode_and_user(“fwgrp”、“记录”,NULL);
通过将不匹配的语句记录为可疑而不拒绝访问,可以检测入侵。首先,输入组配置文件检测
模式:
调用mysql.sp_set_firewall_group_mode ('fwgrp','检测');
然后,使用成员帐户执行一条不匹配组配置文件allowlist的语句。在检测
模式下,防火墙允许执行非匹配语句:
mysql>显示“customer%”表;+------------------------------+ | Tables_in_sakila(客户 %) | +------------------------------+ | 客户| | customer_list | +------------------------------+
此外,防火墙会向错误日志中写入一条消息:
[注]Plugin MYSQL_FIREWALL报告:'可疑的语句来自'member1@localhost'。原因:allowlist中没有匹配。声明:SHOW TABLES LIKE ?'
当需要禁用组配置文件时,将组配置文件的模式更改为从
:
调用mysql.sp_set_firewall_group_mode (集团、“关闭”);
要忘记所有的训练配置文件并禁用它,重置它:
调用mysql.sp_set_firewall_group_mode (集团,“重置”);
该操作将导致防火墙删除该配置文件的所有规则,并将其模式设置为从
.
MySQL企业防火墙允许注册对应于个人帐户的配置文件。要使用防火墙帐户配置文件来保护MySQL不受来自给定帐户的输入语句的影响,请遵循以下步骤:
注册帐户配置文件并将其放入
记录
模式。使用该帐户连接到MySQL服务器,并执行要学习的语句。这将训练帐户概要文件并建立形成概要文件allowlist的规则。
将帐户配置文件切换为
保护
模式。当客户端使用帐户连接到服务器时,帐户配置文件allowlist限制语句的执行。是否需要额外的培训,将帐户配置文件切换到
记录
模式再次使用新的语句模式更新其allowlist,然后将其切换回保护
模式。
对于防火墙相关的帐户参考,请遵守以下指导方针:
注意帐户引用发生的上下文。要为防火墙操作命名帐户,请将其指定为单引号字符串(
'
).这与通常的MySQL语句约定不同,例如user_name
@host_name
'创建用户
而且格兰特
,为此,您分别引用帐户名的用户和主机部分('
).user_name
“@”host_name
'要求将帐户命名为用于防火墙操作的单引号字符串,这意味着您不能使用已嵌入的帐户
@
用户名中的字符。防火墙根据由服务器验证的实际用户名和主机名表示的帐户评估语句。在配置文件中注册帐户时,不要使用通配符或网络掩码:
假设一个名为
me@ % .example.org
存在,客户端使用它从主机连接到服务器abc.example.org
.帐户名中包含
%
通配符,但是服务器验证客户机具有的用户名我
的主机名。abc.example.com
,这就是防火墙所看到的。因此,用于防火墙操作的帐户名为
me@abc.example.org
而不是me@ % .example.org
.
下面的过程展示了如何向防火墙注册一个帐户配置文件,训练防火墙了解该配置文件的可接受语句(它的allowlist),并使用该配置文件保护MySQL不受帐户执行的不可接受语句的影响。账户的例子中,fwuser@localhost
中访问表的应用程序使用sakila
数据库(可以在https://dev.10bet靠谱mysql.com/doc/index-other.html).
使用管理MySQL帐户执行此过程中的步骤,但指定执行的步骤除外fwuser@localhost
在防火墙上注册的帐号配置文件对应的帐号。对于使用该帐户执行的语句,默认数据库应该是sakila
.(您可以通过调整相应的说明来使用不同的数据库。)
如有必要,创建用于执行语句的帐户(选择适当的密码),并为其授予
sakila
数据库:创建用户“fwuser”@“localhost”密码”;全力支援萨基拉。*“fwuser”@“localhost”;
使用
sp_set_firewall_mode ()
向防火墙注册帐户概要文件并将概要文件放置其中的存储过程记录
(培训)模式:调用mysql.sp_set_firewall_mode ('fwuser@localhost','记录');
要训练注册帐户配置文件,连接到服务器作为
fwuser
的会话帐户,以便防火墙看到fwuser@localhost
.然后使用该帐户执行一些对概要文件来说是合法的语句。例如:SELECT first_name, last_name FROM customerWHERE rental_id = 1;现在选择get_customer_balance (());
因为档案在里面
记录
模式下,防火墙将语句的规范化摘要形式记录为概要文件allowlist中的规则。请注意直到
fwuser@localhost
帐户概要文件中接收报表记录
模式,其allowlist为空,相当于”否认所有。”没有语句可以匹配空allowlist,这有以下含义:帐户配置文件无法切换到
保护
模式。它将拒绝每一条语句,有效地禁止帐户执行任何语句。帐户配置文件可以切换到
检测
模式。在本例中,概要文件接受每个语句,但将其记录为可疑语句。
此时,帐户概要信息被缓存。要查看此信息,请查询
INFORMATION_SCHEMA
防火墙表:mysql>从信息模式中选择模式。MYSQL_FIREWALL_USERSWHERE 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连接器可能在每个会话开始时向服务器发送语句。如果应用程序通常通过该连接器使用,那么也要使用该连接器训练防火墙。这使那些初始语句成为与应用程序相关联的帐户配置文件的allowlist的一部分。
调用
sp_set_firewall_mode ()
再次,这次将帐户概要文件切换为保护
模式:调用mysql.sp_set_firewall_mode ('fwuser@localhost','保护');
重要的退出帐户配置文件
记录
模式将其缓存的数据同步到mysql
提供持久底层存储的系统数据库表。如果不切换正在记录的配置文件的模式,则缓存的数据不会写入持久存储,并且在服务器重新启动时丢失。通过使用帐户执行一些可接受和不可接受的语句来测试帐户概要文件。防火墙将帐户中的每个语句与配置文件allowlist进行匹配,并接受或拒绝它:
该语句与训练语句不相同,但产生与其中一个训练语句相同的规范化语句,因此防火墙接受它:
mysql> SELECT first_name, last_name FROM customer WHERE customer_id = '48'+------------+-----------+ | first_name | last_name | +------------+-----------+ | 安|埃文斯 | +------------+-----------+
这些语句在allowlist中没有匹配任何东西,所以防火墙会拒绝每个语句并返回一个错误:
mysql> SELECT FROM customer WHERE customer_id = 1 OR TRUE;错误1045 (28000):Statement was blocked by Firewall mysql> SHOW TABLES LIKE 'customer%';错误1045 (28000):Statement was blocked by Firewall mysql> TRUNCATE TABLE mysql.slow_log;错误1045(28000):语句被防火墙阻止
如果
mysql_firewall_trace
如果启用系统变量,则防火墙还会将拒绝的语句写入错误日志。例如:[注]Plugin MYSQL_FIREWALL报告:'ACCESS DENIED for fwuser@localhost。原因:allowlist中没有匹配。语句:TRUNCATE TABLE ' mysql '。slow_log”
如果有必要,这些日志消息可能有助于识别攻击源。
防火墙帐户概要文件现在已为fwuser@localhost
帐户。当客户端使用该帐户连接并试图执行语句时,配置文件保护MySQL不受配置文件allowlist不匹配的语句的影响。
通过将不匹配的语句记录为可疑而不拒绝访问,可以检测入侵。首先,放入帐户概要文件检测
模式:
调用mysql.sp_set_firewall_mode ('fwuser@localhost','检测');
然后,使用该帐户执行一条不匹配帐户配置文件allowlist的语句。在检测
模式下,防火墙允许执行非匹配语句:
mysql>显示“customer%”表;+------------------------------+ | Tables_in_sakila(客户 %) | +------------------------------+ | 客户| | customer_list | +------------------------------+
此外,防火墙会向错误日志中写入一条消息:
[注]Plugin MYSQL_FIREWALL报告:'可疑的语句来自'fwuser@localhost'。原因:allowlist中没有匹配。声明:SHOW TABLES LIKE ?'
若要禁用帐户配置文件,请将其模式更改为从
:
调用mysql.sp_set_firewall_mode (用户、“关闭”);
要忘记所有的训练配置文件并禁用它,重置它:
调用mysql.sp_set_firewall_mode (用户,“重置”);
该操作将导致防火墙删除该配置文件的所有规则,并将其模式设置为从
.
要评估防火墙活动,请检查其状态变量。例如,在执行前面所示的程序来训练和保护fwgrp
组配置文件,变量如下所示:
显示全局状态为“防火墙%”;+----------------------------+-------+ | Variable_name |值 | +----------------------------+-------+ | Firewall_access_denied | 3 | | Firewall_access_granted | 4 | | Firewall_access_suspicious | 1 | | Firewall_cached_entries | 4 | +----------------------------+-------+
变量分别表示拒绝、接受、记录为可疑语句和添加到缓存中的语句的数量。的Firewall_access_granted
计数是4,因为@@version_comment
由mysql客户端使用注册帐户连接的三次,加上显示表
未被阻塞的语句检测
模式。
在MySQL 8.0.23之前,MySQL企业防火墙只支持帐户配置文件,每个帐户适用于单个帐户。从MySQL 8.0.23开始,防火墙还支持组配置文件,每个组配置文件可以应用到多个帐户。当相同的allowlist应用于多个帐户时,组配置文件支持更容易的管理:与其为每个帐户创建一个帐户配置文件并跨所有这些配置文件复制allowlist,不如创建单个组配置文件并使帐户成为其中的成员。然后,组allowlist应用于所有帐户。
具有单个成员帐户的组概要在逻辑上等同于该帐户的帐户概要,因此可以专门使用组概要来管理防火墙,而不是混合使用帐户和组概要。对于新的防火墙安装,这是通过统一创建新的概要文件作为组概要文件并避免帐户概要文件来实现的。
由于组配置文件提供了更大的灵活性,建议将所有新的防火墙配置文件创建为组配置文件。帐户配置文件从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
表格例如:SELECT USERHOST FROM INFORMATION_SCHEMA.MYSQL_FIREWALL_USERS;+-------------------------------+ | USERHOST | +-------------------------------+ | admin@localhost | | local_client@localhost | | remote_client@abc.example.com | +-------------------------------+
对于上一步识别的每个帐户配置文件,将其转换为组配置文件:
叫mysql。sp_migrate_firewall_user_to_group(“admin@localhost”、“管理员”);叫mysql。sp_migrate_firewall_user_to_group(“local_client@localhost”、“local_clients”);叫mysql。sp_migrate_firewall_user_to_group(“remote_client@localhost”、“remote_clients”);
在每种情况下,帐户概要文件必须存在,且当前不能在
记录
模式,且组配置文件必须不存在。最终的组配置文件将命名帐户作为其单个入伍成员,该成员也被设置为组训练帐户。组配置文件操作模式取自帐户配置文件操作模式。
有关有关sp_migrate_firewall_user_to_group ()
,请参阅防火墙杂项存储过程.