ProxySQL 防火墙白名单

ProxySQL 2.0.9 引入了防火墙功能。

在从早期版本版本中,可以通过设置查询规则来创建要阻止的黑名单,或者定义通用规则,实现白名单功能。

但是,如果面对的系统有非常多而且操作内容也不同,这时使用 mysqlqueryrules 就显得笨拙不灵活。比如,对每个用户或 schema,或者针对具体的客户端地址来进行限制,那么使用 mysqlqueryrules 就会很复杂。

现在,这些将在 ProxySQL 2.0.9 中得以解决,因为它引入了专门为白名单设计的新算法。

当然这些实现是受到 MySQL 企业防火墙的启发。

表 historymysqlquery_digest

statshistory 库中引入新表 historymysqlquerydigest

Admin> SHOW TABLES FROM stats_history;
+----------------------------+
| tables                     |
+----------------------------+
| history_mysql_query_digest |
...

Admin> SHOW CREATE TABLE stats_history.history_mysql_query_digest\G
*************************** 1. row ***************************
       table: history_mysql_query_digest
Create Table: CREATE TABLE history_mysql_query_digest (
    dump_time INT,
    hostgroup INT,
    schemaname VARCHAR NOT NULL,
    username VARCHAR NOT NULL,
    client_address VARCHAR NOT NULL,
    digest VARCHAR NOT NULL,
    digest_text VARCHAR NOT NULL,
    count_star INTEGER NOT NULL,
    first_seen INTEGER NOT NULL,
    last_seen INTEGER NOT NULL,
    sum_time INTEGER NOT NULL,
    min_time INTEGER NOT NULL,
    max_time INTEGER NOT NULL,
    sum_rows_affected INTEGER NOT NULL,
    sum_rows_sent INTEGER NOT NULL)

数据表 historymysqlquerydigest 是对表 stats.statsmysqlquerydigest(内存中)的拓展,并拓展了一个列 dump_time。

该表可用于持久化保存 statsmysqlquerydigest 表的数据。尽管使用简单的 INSERT ... SELECT ...很容易就可以将数据保存到 historymysqlquerydigest,但是,ProxySQL 还提供了另外两种不同的方法:

    使用命令 SAVE MYSQL DIGEST TO DISK。它能自动的将 statsmysqlquerydigest 的所有数据复制到 historymysqlquerydigest,并重置 statsmysqlquery_digest 的内容
    设置变量 admin-statsmysqlquerydigesttodisk 。ProxySQL 将会自动将 statsmysqlquerydigest 的数据 dump 到 historymysqlquery_digest

以上是将数据持久的保存的首选方式,这样也是更有效,更快速的复制数据。

防火墙白名单表

ProxySQL 2.0.9 引入两个防火墙白名单算法表

Admin> SELECT name AS tables FROM main.sqlite_master WHERE type='table' AND 
 name IN ('mysql_firewall_whitelist_rules','mysql_firewall_whitelist_users')
 ORDER BY name;
+--------------------------------+
| tables                         |
+--------------------------------+
| mysql_firewall_whitelist_rules |
| mysql_firewall_whitelist_users |
+--------------------------------+
2 rows in set (0.00 sec)

防火墙白名单全局变量

引入了两个新的全局变量来配置防火墙白名单算法:

Admin> SHOW VARIABLES LIKE '%whitelist%';
+-----------------------------------+-----------------------------+
| Variable_name                     | Value                       |
+-----------------------------------+-----------------------------+
| mysql-firewall_whitelist_enabled  | 0                           |
| mysql-firewall_whitelist_errormsg | Firewall blocked this query |
+-----------------------------------+-----------------------------+
2 rows in set (0.00 sec)

    mysql-firewallwhitelistenabled :全局打开或关闭防火墙白名单算法
    mysql-firewallwhitelisterrormsg:除非 mysqlqueryrules.error_msg 已设置,否则将返回给客户端的错误消息。

防火墙白名单命令

ProxySQL 2.0.9 中引入了新命令来管理防火墙白名单:

LOAD MYSQL FIREWALL TO RUNTIME(或 LOAD MYSQL FIREWALL FROM MEMORY) SAVE MYSQL FIREWALL TO DISK(或 SAVE MYSQL FIREWALL FROM MEMORY LOAD MYSQL FIREWALL TO MEMORY(或 LOAD MYSQL FIREWALL FROM DISK) SAVE MYSQL FIREWALL TO MEMORY(或 SAVE MYSQL FIREWALL FROM RUNTIME)

请注意,这些命令也适用于 SQL 注入引擎

配置防火墙白名单

    尽可能多的收集流量,以便识别正常的流量。运行时的数据也会被保存在 statsmysqlquerydigest 中,也会长久的保存到 statshistory.historymysqlquerydigest,(比如:启用了 admin-statsmysqlquerydigesttodisk)
    启用白名单,并配置白名单用户表 mysqlfirewallwhitelist_users,例如:配置所有用户是 DETECTING 模式,执行下面语句:

INSERT INTO mysql_firewall_whitelist_users
(active, username, client_address, mode)
SELECT DISTINCT 1, username, '', 'DETECTING', '' FROM mysql_users;

    使用表 mysqlfirewallwhitelist_rules 配置所有需要白名单的用户和摘要。例如:将所有 ProxySQL 已知的查询列入白名单,使用下面语句:

INSERT INTO mysql_firewall_whitelist_rules
(active, username, client_address, schemaname, flagIN, digest, comment)
SELECT DISTINCT 1, username, client_address, schemaname, 0, digest, ''
FROM stats_history.history_mysql_query_digest;

    使用命令将配置加载生效 LOAD MYSQL FIREWALL TO RUNTIME
    使用命令将配置保存到磁盘 SAVE MYSQL FIREWALL TO DISK
    全局启用防火墙白名单,将变量设置 mysql-firewallwhitelistenabled 为 1

posted @ 2022-06-20 17:48  哈喽哈喽111111  阅读(194)  评论(0编辑  收藏  举报