10bet网址
MySQL的安全性
相关的文档10bet官方网站 下载此节选
PDF(美国高级主任)- 2.3 mb
PDF (A4)- 2.3 mb
HTML下载(TGZ)- 469.0 kb
HTML下载(Zip)- 476.8 kb


6.7.3使用MySQL企业防火墙

在使用MySQL企业防火墙之前,请按照中提供的说明进行安装第6.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实例的值,而不将其携带到后续重新启动时,请使用全球关键字而不是坚持.看到SET变量赋值语法

分配防火墙权限

安装防火墙后,将适当的特权授予MySQL帐户,以便用于管理它。特权取决于一个帐户应该被允许执行哪些防火墙操作:

  • 授予FIREWALL_EXEMPT特权(MySQL 8.0.27可用)到任何应该免受防火墙限制的帐户。例如,对于配置防火墙的数据库管理员来说,这很有用,可以避免错误配置导致管理员被锁定,无法执行语句的可能性。

  • 授予FIREWALL_ADMIN应该具有完全管理防火墙访问权限的任何帐户的特权。某些管理防火墙功能可以由具有FIREWALL_ADMIN弃用的超级特权,如个别功能描述中所示。)

  • 授予FIREWALL_USER对应该仅对其自己的防火墙规则具有管理访问权限的任何帐户的特权。

  • 授予执行中的防火墙存储过程的权限mysql系统数据库。它们可能调用管理函数,因此存储过程访问还需要前面指出的那些函数所需的特权。

请注意

FIREWALL_EXEMPTFIREWALL_ADMIN,FIREWALL_USER只有在安装防火墙时才能授予特权,因为MYSQL_FIREWALLPlugin定义了这些特权。

防火墙的概念

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

防火墙配置文件

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

  • 一个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 customer WHERE customer_id = 1;Select first_name, last_name from customer where customer_id = 99SELECT first_name, last_name FROM customer WHERE customer_id = 143;

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

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

通过使用标准化,防火墙允许列表可以存储每个匹配从客户端接收到的许多不同语句的摘要。有关规范化和摘要的更多信息,请参见性能模式语句摘要和抽样

警告

设置max_digest_length将system变量设置为0将禁用摘要生成,这也将禁用需要摘要的服务器功能,例如MySQL Enterprise Firewall。

操作模式

注册到防火墙的每个配置文件都有自己的操作模式,从以下值中选择:

  • :禁用该配置文件。防火墙认为它是非活动的并忽略它。

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

    组概要文件和帐户概要文件之间的区别在于,组概要文件的语句记录可以限制为从单个组成员(培训成员)接收的语句。

  • 保护:在此模式下,配置文件允许或阻止语句执行。防火墙将传入语句与概要文件allowlist进行匹配,只接受匹配的语句,拒绝不匹配的语句。训练后的配置文件记录模式,切换到保护模式,以加强MySQL的访问语句偏离allowlist。如果mysql_firewall_trace当系统变量被启用时,防火墙也会将被拒绝的语句写入错误日志。

  • 检测:该模式检测但不阻止入侵(因为在配置文件allowlist中没有匹配任何内容而可疑的语句)。在检测模式下,防火墙将可疑语句写入错误日志,但接受它们而不拒绝访问。

当配置文件被分配到上述任何一个模式值时,防火墙将该模式保存在配置文件中。防火墙模式设置操作还允许模式值为重置,但不存储此值:将配置文件设置为重置Mode使防火墙删除该配置文件的所有规则,并将其模式设置为

请注意

写入错误登录的消息检测模式还是因为mysql_firewall_trace被写入Notes, Notes是信息消息。为了确保这样的消息出现在错误日志中并且没有被丢弃,请确保错误日志的详细程度足以包含信息消息。例如,如果您正在使用基于优先级的日志过滤,如优先级错误日志过滤(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不受来自给定帐户的传入语句的影响,请遵循以下步骤:

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

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

  3. 使用成员帐号连接MySQL服务器,执行学习的语句。这将训练组概要文件并建立形成概要文件allowlist的规则。

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

  5. 将组配置文件切换为保护模式。当客户端使用组概要文件成员的任何帐户连接到服务器时,概要文件allowlist限制语句执行。

  6. 是否需要额外的培训,切换到组配置文件记录模式,用新的语句模式更新它的allowlist,然后切换回保护模式。

对于防火墙相关的帐户引用,请遵守以下指南:

  • 注意出现帐户引用的上下文。若要为防火墙操作命名帐户,请将其指定为单引号字符串(user_name@host_name).这与通常的MySQL语句约定不同,例如创建用户而且格兰特,您可以分别引用帐户名称的用户部分和主机部分(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.(您可以通过相应调整说明来使用不同的数据库。)

  1. 的成员创建帐户(如有必要)fwgrp组配置文件,并授予他们适当的访问权限。一个成员的语句显示在这里(选择合适的密码):

    创建用户member1 @ localhost密码”;同意一切在萨基拉。*“member1”@“localhost”;
  2. 使用sp_set_firewall_group_mode ()将组概要文件注册到防火墙并将概要文件放入其中的存储过程记录(培训)模式:

    调用mysql.sp_set_firewall_group_mode ('fwgrp','记录');
  3. 使用sp_firewall_group_enlist ()添加用于训练组配置文件allowlist的初始成员帐户的存储过程:

    叫mysql。sp_firewall_group_enlist(“fwgrp”、“member1@localhost”);
  4. 若要使用初始成员帐户训练组概要,请连接到服务器为member1中从服务器主机,以便防火墙看到会话帐户member1@localhost.然后执行一些被认为对概要文件合法的语句。例如:

    SELECT title, WHERE film_id = 1;SET last_update = NOW() WHERE actor = 1;SELECT store_id, COUNT(*) FROM库存组

    防火墙接收来自member1@localhost帐户。因为那个账户是fwgrp配置文件,在记录模式时,防火墙将语句解释为适用于fwgrp的规则中记录语句的规范化摘要形式fwgrpallowlist。然后,这些规则适用于会员的所有帐户fwgrp

    请注意

    直到fwgrp组概要文件中接收语句记录模式时,它的allowlist为空,这相当于否认所有。没有语句可以匹配空的allowlist,这意味着:

    • 无法切换到组概要文件保护模式。它将拒绝每个语句,有效地禁止作为组成员的帐户执行任何语句。

    • 可以切换到组配置文件检测模式。在这种情况下,概要文件接受每个语句,但将其记录为可疑的。

  5. 此时,将缓存组配置文件信息,包括其名称、成员资格和allowlist。要查看这些信息,请查询Performance Schema防火墙表:

    SELECT MODE FROM performance_schemaWHERE NAME = 'fwgrp';+-----------+ | 模式  | +-----------+ | 记录  | +-----------+ 从performance_schema mysql > SELECT *。WHERE GROUP_ID = 'fwgrp' ORDER BY MEMBER_ID;+----------+-------------------+ | GROUP_ID | MEMBER_ID  | +----------+-------------------+ | fwgrp | member1@localhost  | +----------+-------------------+ mysql >从performance_schema选择规则。WHERE NAME = 'fwgrp';+----------------------------------------------------------------------+ | 规则  | +----------------------------------------------------------------------+ | 选择@@ version_comment的限制?| | UPDATE ' actor ' SET ' last_update ' = NOW () WHERE ' act_id ' = ?| | SELECT ' title ', ' release_year ' FROM ' film ' WHERE ' film_id ' = ?| |选择‘可以’,COUNT(*)”可以从“库存”组 ` | +----------------------------------------------------------------------+
    请注意

    @@version_comment方法自动发送的语句mysql客户端连接到服务器时。

    重要的

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

  6. 调用sp_set_firewall_group_mode ()再次将组配置文件切换到保护模式:

    调用mysql.sp_set_firewall_group_mode ('fwgrp','保护');
    重要的

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

  7. 向组配置文件添加任何其他应该是成员的帐户:

    叫mysql。sp_firewall_group_enlist(“fwgrp”、“member2@localhost”);叫mysql。sp_firewall_group_enlist(“fwgrp”、“member3@localhost”);叫mysql。sp_firewall_group_enlist(“fwgrp”、“member4@localhost”);

    属性训练的配置文件允许列表member1@localhost帐户现在也适用于额外的帐户。

  8. 若要验证更新后的组成员关系,可查询firewall_membership表:

    mysql> SELECT * FROM performance_schemafirewall_membershipWHERE 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, WHERE film_id = 98;+-------------------+--------------+ | 标题| release_year  | +-------------------+--------------+ | 明亮的遇到| 2006  | +-------------------+--------------+
    • 这些语句在allow列表中没有匹配任何内容,因此防火墙拒绝每一个语句并报错:

      mysql> SELECT title, WHERE film_id = 98 OR TRUE错误1045(28000):语句被防火墙阻塞mysql>显示表像'客户%';错误1045 (28000):Statement was blocked by Firewall mysql> TRUNCATE TABLE mysql.slow_log;错误1045(28000):语句被防火墙阻塞
    • 如果mysql_firewall_trace当系统变量被启用时,防火墙也会将被拒绝的语句写入错误日志。例如:

      插件MYSQL_FIREWALL报告:'ACCESS DENIED for 'member1@localhost'。原因:在allowlist中没有匹配。语句:TRUNCATE TABLE ' mysql '。slow_log”

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

  10. 是否需要从组配置文件中删除成员,请使用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', 'RECORDING', 'member4@localhost');

这样就可以由指定的帐户进行额外的培训,而不必删除其他组成员。它们可以执行语句,但语句不会被添加到allow列表中。(记住,然而,在记录其他成员可以执行的模式任何声明。)

请注意

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

后续培训结束后,将组配置文件设置为保护模式:

调用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', 'RECORDING', NULL);

可以通过将不匹配的语句记录为可疑而不拒绝访问来检测入侵。首先,放入组配置文件检测模式:

调用mysql.sp_set_firewall_group_mode ('fwgrp','检测');

然后,使用成员帐户执行与组概要allowlist不匹配的语句。在检测模式下,防火墙允许执行不匹配的语句:

mysql>显示像'customer%'这样的表+------------------------------+ | Tables_in_sakila(客户 %) | +------------------------------+ | 客户| | customer_list  | +------------------------------+

此外,防火墙会向错误日志中写入一条消息:

插件MYSQL_FIREWALL报告:'可疑的声明来自'member1@localhost'。原因:在allowlist中没有匹配。声明:SHOW TABLES LIKE ?

若要禁用组配置文件,请将组配置文件的模式更改为

调用mysql.sp_set_firewall_group_mode (集团、“关闭”);

要忘记一个配置文件的所有训练并禁用它,请重置它:

调用mysql.sp_set_firewall_group_mode (集团,“重置”);

该操作将导致防火墙删除该配置文件的所有规则,并将其模式设置为

注册防火墙帐户配置文件

MySQL企业防火墙允许注册与个人帐户对应的概要文件。要使用防火墙帐户配置文件来保护MySQL不受来自给定帐户的传入语句的影响,请遵循以下步骤:

  1. 注册帐户概要文件并将其放入记录模式。

  2. 使用该帐号连接MySQL服务器,执行要学习的语句。这将训练帐户概要文件并建立形成概要文件allowlist的规则。

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

  4. 是否需要额外的培训,切换到帐户配置文件记录模式,用新的语句模式更新它的allowlist,然后切换回保护模式。

对于防火墙相关的帐户引用,请遵守以下指南:

  • 注意出现帐户引用的上下文。若要为防火墙操作命名帐户,请将其指定为单引号字符串(user_name@host_name).这与通常的MySQL语句约定不同,例如创建用户而且格兰特,您可以分别引用帐户名称的用户部分和主机部分(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.(您可以通过相应调整说明来使用不同的数据库。)

  1. 如有必要,创建用于执行语句的帐户(选择适当的密码),并为其授予sakila数据库:

    创建用户fwuser @ localhost密码”;同意一切在萨基拉。* TO 'fwuser'@'localhost';
  2. 使用sp_set_firewall_mode ()将帐户概要文件注册到防火墙并将概要文件放在其中的存储过程记录(培训)模式:

    调用mysql.sp_set_firewall_mode ('fwuser@localhost','记录');
  3. 要训练已注册帐户配置文件,连接到服务器为fwuser从服务器主机,以便防火墙看到会话帐户fwuser@localhost.然后使用该帐户执行一些被认为对概要文件合法的语句。例如:

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

    因为配置文件已导入记录模式下,防火墙将语句的规范化摘要形式记录为概要文件allowlist中的规则。

    请注意

    直到fwuser@localhost帐户概要文件接收语句记录模式时,它的allowlist为空,这相当于否认所有。没有语句可以匹配空的allowlist,这意味着:

    • 帐户配置文件不能切换到保护模式。它将拒绝每一个报表,有效地禁止帐户执行任何报表。

    • 帐户配置文件可以切换到检测模式。在这种情况下,概要文件接受每个语句,但将其记录为可疑的。

  4. 此时,将缓存帐户概要信息。要查看此信息,请查询INFORMATION_SCHEMA防火墙表:

    从INFORMATION_SCHEMA中选择模式。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的一部分。

  5. 调用sp_set_firewall_mode ()同样,这次将帐户配置文件切换为保护模式:

    调用mysql.sp_set_firewall_mode ('fwuser@localhost','保护');
    重要的

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

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

    • 这个语句与训练语句不相同,但是生成了与训练语句相同的规范化语句,所以防火墙接受它:

      mysql> SELECT first_name, last_name FROM customer WHERE customer_id = '48';+------------+-----------+ | first_name | last_name  | +------------+-----------+ | 安|埃文斯  | +------------+-----------+
    • 这些语句在allow列表中没有匹配任何内容,因此防火墙拒绝每一个语句并报错:

      mysql> SELECT first_name, last_name FROM customer WHERE customer_id = 1 OR TRUE错误1045(28000):语句被防火墙阻塞mysql>显示表像'客户%';错误1045 (28000):Statement was blocked by Firewall mysql> TRUNCATE TABLE mysql.slow_log;错误1045(28000):语句被防火墙阻塞
    • 如果mysql_firewall_trace当系统变量被启用时,防火墙也会将被拒绝的语句写入错误日志。例如:

      插件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  | +------------------------------+

此外,防火墙会向错误日志中写入一条消息:

插件MYSQL_FIREWALL报告:'可疑的声明来自'fwuser@localhost'。原因:在allowlist中没有匹配。声明:SHOW TABLES LIKE ?

若要禁用帐户配置文件,请将其模式更改为

调用mysql.sp_set_firewall_mode (用户、“关闭”);

要忘记一个配置文件的所有训练并禁用它,请重置它:

调用mysql.sp_set_firewall_mode (用户,“重置”);

该操作将导致防火墙删除该配置文件的所有规则,并将其模式设置为

监控防火墙

要评估防火墙活动,请检查其状态变量。例如,在执行前面所示的程序来训练和保护fwgrp组配置文件,变量看起来像这样:

mysql>显示防火墙的全局状态+----------------------------+-------+ | Variable_name |值  | +----------------------------+-------+ | Firewall_access_denied | 3 | | Firewall_access_granted | 4 | | Firewall_access_suspicious | 1 | | Firewall_cached_entries | 4  | +----------------------------+-------+

变量分别表示拒绝、接受、记录为可疑和添加到缓存的语句的数量。的Firewall_access_grantedCount是4,因为@@version_commentmysql客户端每三次连接使用注册帐户,加上显示表未被阻塞的语句检测模式。

将帐户概要文件迁移到组概要文件

在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特权:

  1. 方法确定存在哪些帐户概要文件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  | +-------------------------------+
  2. 对于上一步识别的每个帐户配置文件,将其转换为组配置文件:

    叫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 (),请参阅防火墙其他存储过程