MySQL防火墙应该使用专用_mysql8 参考手册--使用MySQL企业防火墙

在使用MySQL企业防火墙之前,请按照第6.4.7.2节“安装或卸载MySQL企业防火墙”中的说明进行安装。另外,MySQL Enterprise Firewall不能与查询缓存一起使用。禁用查询缓存(如果已启用)(请参阅 查询缓存配置)。

本节介绍如何使用SQL语句配置MySQL企业防火墙。另外,MySQL Workbench 6.3.4或更高版本提供了用于防火墙控制的图形界面。参见 MySQL企业防火墙接口。

要启用或禁用防火墙,请设置 mysql_firewall_mode系统变量。默认情况下,在安装防火墙时启用此变量。要显式控制防火墙的初始状态,可以在服务器启动时设置变量。例如,要在选项文件中启用防火墙,请使用以下几行:

[mysqld]

mysql_firewall_mode=ON

也可以在运行时禁用或启用防火墙:

mysql> SET GLOBAL mysql_firewall_mode = OFF;

mysql> SET GLOBAL mysql_firewall_mode = ON;

除了全局打开/关闭防火墙模式之外,在防火墙中注册的每个帐户都有其自己的操作模式。对于处于记录模式的帐户,防火墙学习应用程序的“ 指纹 ”,即可接受的语句模式,这些语句模式一起构成白名单。经过培训后,将防火墙切换到保护模式,以使MySQL能够防止偏离指纹的语句对MySQL的访问。要进行其他培训,请根据需要将防火墙切换回记录模式,以使用新的语句模式更新白名单。可以使用入侵检测模式,将可疑语句写入错误日志,但不拒绝访问。

防火墙按帐户维护白名单规则,从而可以实施以下保护策略:

对于具有独特保护要求的应用程序,请将其配置为使用未用于任何其他目的的帐户。

对于相关且共享保护要求的应用程序,请将它们配置为一组以使用同一帐户。

防火墙操作基于将SQL语句转换为规范化摘要形式。防火墙摘要类似于性能模式使用的语句摘要(请参见 第26.10节“性能模式语句摘要和采样”)。但是,与性能架构不同,与摘要相关的相关系统变量为 max_digest_length。

对于来自注册帐户的连接,防火墙会将每个传入的语句转换为规范化形式,并根据帐户模式进行处理:

在记录模式下,防火墙将规范化的语句添加到帐户白名单规则中。

在保护模式下,防火墙将规范化的语句与帐户白名单规则进行比较。如果存在匹配项,该语句将通过,服务器将继续对其进行处理。否则,服务器将拒绝该语句,并向客户端返回错误。如果mysql_firewall_trace启用了系统变量,则防火墙还将拒绝的语句写入错误日志 。

在检测模式下,防火墙像在保护模式下一样匹配语句,但是在不拒绝访问的情况下将不匹配的语句写入错误日志。

具有OFF或不向防火墙注册模式的帐户将被其忽略。

要使用MySQL企业防火墙保护帐户,请按照以下步骤操作:

注册该帐户并将其置于记录模式。

使用注册的帐户连接到MySQL服务器并执行要学习的语句。这将建立该帐户的已接受对帐单白名单。

将注册帐户切换为保护模式。

以下示例显示了如何在防火墙中注册帐户,如何使用防火墙来学习该帐户的可接受语句,以及如何防止执行不可接受的语句。示例帐户, 'fwuser'@'localhost'供访问sakila数据库中表的应用程序使用 。(该数据库位于https://dev.mysql.com/doc/index-other.html。)

注意

帐户名称的用户和主机部分分别用引号括起来,例如CREATE USER和GRANT,而要指定用于防火墙组件的帐户,请将其命名为单引号字符串 'fwuser@localhost'。

将帐户命名为防火墙组件的单引号字符串的约定意味着您不能使用@在用户名中包含嵌入式字符的帐户。

使用管理的MySQL帐户执行以下过程中的步骤,但指定给由防火墙注册的帐户执行的帐户除外。默认数据库应该是sakila使用注册帐户执行的语句的数据库。

如有必要,请创建要保护的帐户(选择适当的密码)并授予其sakila数据库特权 :

mysql> CREATE USER 'fwuser'@'localhost' IDENTIFIED BY 'fWp@3sw0rd';

mysql> GRANT ALL ON sakila.* TO 'fwuser'@'localhost';

使用sp_set_firewall_mode()存储过程在防火墙中注册帐户并将其置于记录模式(如果该过程位于之外的数据库中mysql,请相应地调整语句):

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

在执行过程中,存储过程将调用防火墙用户定义的函数,这些函数可能会产生自己的输出。

使用注册的帐户,连接到服务器,然后执行一些对其合法的语句:

mysql> SELECT first_name, last_name FROM customer WHERE customer_id = 1;

mysql> UPDATE rental SET return_date = NOW() WHERE rental_id = 1;

mysql> SELECT get_customer_balance(1, NOW());

防火墙将这些语句转换为摘要形式,并将其记录在帐户白名单中。

注意

在帐户以记录模式执行报表之前,其白名单为空,这等同于“ 全部拒绝 ” 。”如果切换到保护模式,该账户将被有效地执行语句禁止。

此时,用户和白名单信息已缓存,可以在防火墙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连接器可能会在连接开始时向服务器发送语句,以确定服务器的特性和功能。如果通常通过该连接器使用应用程序,则也应采用这种方式来训练防火墙。这使这些初始报表成为与该应用程序关联的帐户的白名单的一部分。

使用存储过程将注册用户切换到保护模式:

mysql> 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 whitelist.

Statement: TRUNCATE TABLE mysql . slow_log '

您可以使用这些日志消息来确定攻击源。

您可以将不匹配的语句记录为可疑,而不会拒绝访问。为此,将帐户置于入侵检测模式:

mysql> CALL mysql.sp_set_firewall_mode('fwuser@localhost', '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 whitelist.

Statement: SHOW TABLES LIKE ? '

注意

检测模式将消息写为Notes,这是信息消息。为确保此类消息出现在错误日志中并且不会被丢弃,请确保将 log_error_verbosity 系统变量设置为值3。

要评估防火墙活动,请检查其状态变量:

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都由mysql客户端发送的 语句 ,加上SHOW TABLES在DETECTING模式下未被阻塞的 语句。

如果需要对帐户进行其他培训,请再次将其切换到记录模式,然后在执行要添加到白名单的语句后,再回到保护模式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值