MySQL 企业级安全工具:Firewall 防火墙

MySQL 企业级安全工具:Firewall 防火墙

ShawnYan Lv.6

MySQL Enterprise Firewall 是一款功能强大的企业级数据库安全工具,它能够实时监控、检测和阻止对数据库的未授权访问和恶意活动,为 MySQL 数据库提供强大的安全保障。

它通过创建允许列表来定义可接受的 SQL 语句模式,根据这些模式匹配 SQL 语句来决定是否允许其执行,从而有效防范 SQL 注入攻击等安全威胁,且支持基于账户和组的配置文件,可针对不同用户或用户组制定特定的允许列表。此外,它还具备透明保护、高性能、高可用性和易于使用等特点。

MySQL Enterprise Firewall 核心要素

MySQL Enterprise Firewall 以插件库为基础构建,其核心要素如下。

服务器端名为 MYSQL FIREWALL 的插件会在 SQL 语句执行前对其进行审查,并依据已注册的防火墙配置文件来判定是执行还是拒绝每条语句。与之协同的还有名为 MYSQL FIREWALL USERS 和 MYSQL FIREWALL WHITELIST 的服务器端插件,它们借助性能架构及信息架构表,为查看已注册配置文件提供窗口。

为确保性能,配置文件会被缓存在内存中。防火墙数据库中的表则为防火墙数据提供支持存储,使配置文件能在服务器重启后依然保持有效,此防火墙数据库既可为 mysql 系统数据库,也可为自定义架构。存储过程负责执行诸多任务,像注册防火墙配置文件、设定其运行模式,以及管理防火墙数据在缓存与持久存储间的传输。

管理函数则为同步缓存与持久存储这类低层级任务,提供应用程序接口。系统变量用于防火墙的配置,而状态变量能给出运行时的操作信息。FIREWALL ADMIN 和 FIREWALL USER 权限,分别允许用户管理任意用户的防火墙规则,以及自身的防火墙规则。FIREWALL EXEMPT 权限则是让用户免受防火墙限制,例如数据库管理员配置防火墙时,开启此权限可防止因误操作把自己也锁在外,导致无法执行语句。

1.png

安装与配置

在 Linux 系统上,可运行位于 /usr/share/mysql-8.4/linux_install_firewall.sql 目录中的脚本进行安装。

1
2
mysql> \. /usr/share/mysql-8.4/linux_install_firewall.sql
Query OK, 0 rows affected (0.00 sec)

该文件包含 5 张表和 7 个存储过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
bash-5.1# grep 'CREATE TABLE' linux_install_firewall.sql -A1
CREATE TABLE IF NOT EXISTS
firewall_whitelist(
--
CREATE TABLE IF NOT EXISTS
firewall_group_allowlist(
--
CREATE TABLE IF NOT EXISTS
firewall_users(
--
CREATE TABLE IF NOT EXISTS
firewall_groups(
--
CREATE TABLE IF NOT EXISTS
firewall_membership(
bash-5.1# grep 'CREATE PROCEDURE' linux_install_firewall.sql
CREATE PROCEDURE sp_set_firewall_mode (IN arg_userhost VARCHAR(288), IN arg_mode varchar(12))
CREATE PROCEDURE sp_reload_firewall_rules(IN arg_userhost VARCHAR(288))
CREATE PROCEDURE sp_set_firewall_group_mode (IN arg_group_name VARCHAR(288), IN arg_mode varchar(12))
CREATE PROCEDURE sp_set_firewall_group_mode_and_user (IN arg_group_name VARCHAR(288), IN arg_mode varchar(12), IN arg_userhost VARCHAR(288))
CREATE PROCEDURE sp_reload_firewall_group_rules(IN arg_group_name VARCHAR(288))
CREATE PROCEDURE sp_firewall_group_enlist(IN arg_group_name VARCHAR(288), IN arg_userhost VARCHAR(288))
CREATE PROCEDURE sp_firewall_group_delist(IN arg_group_name VARCHAR(288), IN arg_userhost VARCHAR(288))

启用或禁用防火墙

可通过设置 mysql_firewall_mode 系统变量来启用或禁用防火墙。例如,在选项文件中添加

1
2
[mysqld]
mysql_firewall_mode=ON

然后重启服务器使设置生效。

也可在运行时使用 SET PERSIST mysql_firewall_mode = ON;SET PERSIST mysql_firewall_mode = OFF; 来设置并持久化防火墙状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SET PERSIST mysql_firewall_mode = ON;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%firewall%';
+----------------------------------------+-------+
| Variable_name | Value |
+----------------------------------------+-------+
| mysql_firewall_database | mysql |
| mysql_firewall_mode | ON |
| mysql_firewall_reload_interval_seconds | 0 |
| mysql_firewall_trace | OFF |
+----------------------------------------+-------+
4 rows in set (0.00 sec)

使用方法及具体例子

  1. 注册账户配置文件 :

先注册账户并将其置于 RECORDING 模式,

1
2
3
4
5
6
7
8
9
10
11
12
mysql> CALL mysql.sp_set_firewall_mode('mytest@localhost', 'RECORDING');
+-----------------------------------------------+
| read_firewall_whitelist(arg_userhost,FW.rule) |
+-----------------------------------------------+
| Imported users: 0
Imported rules: 0
|
+-----------------------------------------------+
1 row in set (0.01 sec)

Query OK, 0 rows affected, 1 warning (0.01 sec)

然后使用该账户连接到 MySQL 服务器并执行一些合法的 SQL 语句,以训练账户配置文件并建立允许列表。

例如,使用 mytest@localhost 账户执行 select * from information_schema.tables limit 1; 等语句,这些语句会被记录并用于构建允许列表。

  1. 切换到保护模式 :

当账户配置文件建立好后,将其切换到 PROTECTING 模式,

1
2
mysql> CALL mysql.sp_set_firewall_mode('mytest@localhost', 'PROTECTING');
Query OK, 0 rows affected, 1 warning (0.00 sec)

此时,只有符合允许列表的 SQL 语句才能被执行,其他语句将被阻止。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> select * from information_schema.tables limit 1;
+---------------+--------------------+-----------------------------------+-------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | ENGINE | VERSION | ROW_FORMAT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | AUTO_INCREMENT | CREATE_TIME | UPDATE_TIME | CHECK_TIME | TABLE_COLLATION | CHECKSUM | CREATE_OPTIONS | TABLE_COMMENT |
+---------------+--------------------+-----------------------------------+-------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
| def | information_schema | ADMINISTRABLE_ROLE_AUTHORIZATIONS | SYSTEM VIEW | NULL | 10 | NULL | 0 | 0 | 0 | 0 | 0 | 0 | NULL | 2025-05-09 05:27:15 | NULL | NULL | NULL | NULL | | |
+---------------+--------------------+-----------------------------------+-------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
1 row in set (0.00 sec)

mysql> select * from information_schema.tables limit 2;
+---------------+--------------------+-----------------------------------+-------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | ENGINE | VERSION | ROW_FORMAT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | AUTO_INCREMENT | CREATE_TIME | UPDATE_TIME | CHECK_TIME | TABLE_COLLATION | CHECKSUM | CREATE_OPTIONS | TABLE_COMMENT |
+---------------+--------------------+-----------------------------------+-------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
| def | information_schema | ADMINISTRABLE_ROLE_AUTHORIZATIONS | SYSTEM VIEW | NULL | 10 | NULL | 0 | 0 | 0 | 0 | 0 | 0 | NULL | 2025-05-09 05:27:15 | NULL | NULL | NULL | NULL | | |
| def | information_schema | APPLICABLE_ROLES | SYSTEM VIEW | NULL | 10 | NULL | 0 | 0 | 0 | 0 | 0 | 0 | NULL | 2025-05-09 05:27:15 | NULL | NULL | NULL | NULL | | |
+---------------+--------------------+-----------------------------------+-------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
2 rows in set (0.00 sec)

mysql> select * from information_schema.tables where TABLE_SCHEMA = 'information_schema';
ERROR 1045 (28000): Statement was blocked by Firewall
mysql>
  1. 监控与管理 :

通过查询 Performance Schema 防火墙表,可查看防火墙成员资格和白名单等信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> SELECT * FROM INFORMATION_SCHEMA.MYSQL_FIREWALL_USERS;
+------------------+------------+
| USERHOST | MODE |
+------------------+------------+
| mytest@localhost | PROTECTING |
| fwuser@localhost | RECORDING |
+------------------+------------+
2 rows in set (0.00 sec)

mysql> SELECT RULE FROM INFORMATION_SCHEMA.MYSQL_FIREWALL_WHITELIST WHERE USERHOST = 'mytest@localhost';
+-------------------------------------------------------+
| RULE |
+-------------------------------------------------------+
| SELECT * FROM `information_schema` . `tables` |
| SELECT * FROM `information_schema` . `tables` LIMIT ? |
| SELECT @@`version_comment` LIMIT ? |
+-------------------------------------------------------+
3 rows in set (0.00 sec)

总结

MySQL Enterprise Firewall 作为一款企业级的数据库防火墙产品,通过其强大的功能和灵活的配置方式,能够有效保护 MySQL 数据库免受各种安全威胁,保障数据库的安全性和稳定性。本文对 MySQL Enterprise Firewall 进行了介绍和使用演示,希望对你有所帮助。

Have a nice day ~

– / END / –

  • Title: MySQL 企业级安全工具:Firewall 防火墙
  • Author: ShawnYan
  • Created at: 2025-03-21 23:00:00
  • Updated at: 2025-03-21 23:00:00
  • Link: https://shawnyan.cn/2025/mysql/mysql-ee-firewall/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments