这部分的内容拖了很长时间了, 其实很早就想研究一下proxysql,主要是想通过这个产品来实现对数据库层面的防火墙功能。其实类似的产品有很多不过都是针对mysql产品的。比如美团的DBproxy,还有360的Atlas. 我之前也大致看了一下关于DBProxy的产品, 功能上类似, 不过配置起来可能比proxysql要简单一些。既然是类似的产品, 那我就从这个洋货开始入手。我们可以通过proxysql的官方网站来了解安装以及配置细节。
https://proxysql.com/
从proxysql的官方网站上我们可以了解到它提供下面几个功能。目前有很多人在使用这类数据库的proxy产品在做读写分离,至于为啥要做读写分离, 其实我不太关心,因为读写分离这块更多是这对应用或者数据库的性能来说的。我们干啥说啥,我最关注的就是下面6个功能中的第三和第四个功能。
说到防火墙,我们做网络的大侠可能很容易理解,就是配置各种过滤,阻断各种阴沟暗渠。我们今天介绍的proxysql属于一种应用层的防火墙,和waf属于同一层面,但是功能和防护的对象上是完全不一样的,数据库防火墙重点是为了保护数据库资源。我在这里准备着重介绍一下proxysql的过滤和log记录功能。
1, application layer proxy
2, zero-downtime changes
3, database Firewall
4, Advanced query qules
5, sharding& rewrite
6, Failover detection
下面的截图是从proxysql的官方网站上截取出来的,也算作是一种非常常见的官方配置模式,就是保护各种连接数据库的请求流量。无论是内部威胁还是外部威胁都会被监控和过滤。很多时候应用在进行数据库操作的动作都采用存储过程或者预定义语句,这些可以从一定程度上防范数据库注入之类的风险。反而是内部的数据泄露风险难以防范,比如开发人员或者DBA。因此我建议采用第二张图的设计思路。

在下面的图中,内部PC不能直接访问DB数据库, 只能通过proxysql来访问身后的数据库。当内部人员访问proxysql的时候, 相应的查询会被记录下来,查询结果中的敏感信息可以通过proxysql的规则过滤掉。

1, 数据库查询语句:
select * from sys_user;
2,经过proxysql过滤之后,实际在数据库执行的语句:
select id,uid,nickname,insert(usr_mobile, 4, 4, ‘xxxxx’) as usr_mobile from sys_user
连接proxysql管理端
- #安装完成之后, 我们需要访问proxysql 的管理平台。访问方法和对mysql的管理比较类似, 不过是需要指定端口等信息
$ mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt 'ProxySQL Admin> '
添加mysql server
insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘192.168.80.12’,3306);
insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘192.168.80.13’,3306);
insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(100,‘192.168.80.10’,3306,1,1000,10,‘testdb’);
load mysql servers to runtime;
save mysql servers to disk;
查看一下创建的mysql数据库信息是否正确:
MySQL [(none)]> select hostgroup_id,hostname,port,status,weight from mysql_servers;
±-------------±--------------±-----±-------±-------+
| hostgroup_id | hostname | port | status | weight |
±-------------±--------------±-----±-------±-------+
| 10 | 192.168.80.12 | 3306 | ONLINE | 1 |
| 20 | 192.168.80.13 | 3306 | ONLINE | 1 |
±-------------±--------------±-----±-------±-------+
添加访问mysql账号
insert into mysql_users(username,password,default_hostgroup) values(‘sqluser’,‘password’,10);
insert into mysql_users(username,password,active,default_hostgroup,transaction_persistent) values(‘dba’,‘dba’,1,100,1);
load mysql users to runtime;
save mysql users to disk;
添加规则
下面是三个例子, 我们可以参考这个格式来编辑规则。
insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply) VALUES(1,1,'^SELECT.*FOR UPDATE$',10,1),(2,1,'^SELECT',20,1);
load mysql query rules to runtime;
save mysql query rules to disk;
在编辑规则的时候需要注意各个参数之间需要采用逗号的方式隔离开来,我们可以参考下面的列表来编辑规则。
| rule_id | active | username | schemaname | flagIN | client_addr | proxy_addr | proxy_port | digest | match_digest | match_pattern |
negate_match_pattern | re_modifiers | flagOUT | replace_pattern |
destination_hostgroup | cache_ttl | cache_empty_result | cache_timeout
| reconnect | timeout | retries | delay | next_query_flagIN |
mirror_flagOUT | mirror_hostgroup | error_msg | OK_msg | sticky_conn |
multiplex | gtid_from_hostgroup | log | apply | attributes | comment
|
下面是两个例子,大家可以参考一下,我们重点关注的就是replace_pattern。目的就是想把一些包含敏感信息的查询语句做修改,比如下面这样,其中match_pattern采用正则的方式来抓取原始的sql查询语句,并采用replace_pattern进行替代。
insert into mysql_query_rules
(rule_id,active,apply,log,destination_hostgroup,match_pattern,replace_pattern)
values
(1,1,1,1,100,"^(select.*?from) t_user (.*)$",“select usr_id,usr_nick,insert(usr_password, 6, 8, ‘xxxxxxxx’) as usr_password,usr_email,insert(usr_mobile, 4, 4, ‘xxxxx’) as usr_mobile from sys_user \2 ;”);
insert into mysql_query_rules
(rule_id,active,apply,log,destination_hostgroup,match_pattern,replace_pattern)
values
(2,1,1,1,100,"^(select.?from) t_user (.)$",“select usr_id,usr_nick,insert(usr_password, 6, 8, ‘xxxxxxxx’) as usr_password,usr_email,insert(usr_mobile, 4, 4, ‘xxxxx’) as usr_mobile from sys_user \2 ;”);
insert into mysql_query_rules
(rule_id,active,apply,log,destination_hostgroup,match_pattern,replace_pattern)
values
(3,1,1,1,100,"^(select.?from) testdb.t_user (.)$",“select usr_id,usr_nick,insert(usr_password, 6, 8, ‘xxxxxxxx’) as usr_password,usr_email,insert(usr_mobile, 4, 4, ‘xxxxx’) as usr_mobile from testdb.sys_user \2 ;”);
这几个规则的内容基本上是一样的, 只是ruleID和对应的数据表不一样,有的时候还要考虑输入字符的格式,只有你的规则匹配上了输入的内容, 才能触发相应的动作。
开启审计日志
set mysql-eventslog_filename = ‘/var/lib/proxysql/audit.log’ ; – 会生成 audit.log.0000xx这种命名格式的文件
INSERT INTO mysql_query_rules (rule_id, active, match_digest,destination_hostgroup,log,apply) VALUES (4,1,’^select’,100,1,0);
INSERT INTO mysql_query_rules (rule_id, active, match_digest,destination_hostgroup,log,apply) VALUES (5,1,’^SELECT’,100,1,0);
其中满足match_digest的查询语句,就会触发Log动作。
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
检查一下我们配置的规则列表:
select rule_id,active,match_digest,match_pattern,destination_hostgroup,apply,log from mysql_query_rules ;
±--------±-------±-------------±-------------------------------------------±----------------------±------±----+
| rule_id | active | match_digest | match_pattern | destination_hostgroup | apply | log |
±--------±-------±-------------±-------------------------------------------±----------------------±------±----+
| 1 | 1 | NULL | ^(select.?from) t_user (.)$ | 100 | 1 | 1 |
| 2 | 1 | NULL | ^(select.?from) t_user (.)$ | 100 | 1 | 1 |
| 3 | 1 | NULL | ^(select.?from) testdb.t_user (.)$ | 100 | 1 | 1 |
| 4 | 1 | ^select | NULL | 100 | 0 | 1 |
| 5 | 1 | ^SELECT | NULL | 100 | 0 | 1 |
±--------±-------±-------------±-------------------------------------------±----------------------±------±----+
测试
测试读操作是否路由给20的读组
mysql -usqluser -ppassword -P6033 -h127.0.0.1 -e ‘select @@server_id’
测试写操作
[root@80_11 ~]# mysql -usqluser -ppassword -P6033 -h127.0.0.1 -e ‘create database db1’
[root@80_11 ~]# mysql -usqluser -ppassword -P6033 -h127.0.0.1 -e ‘select @@server_id’
±------------+
| @@server_id |
±------------+
| 12 |
±------------+
本文介绍的一个一款开源的数据库防火墙,对该产品的学习可以帮助我们理解数据库防火墙的实现思路。更重要的是我们可以采用数据库防火墙的方式来实现透明的,终端无感知的数据脱敏和数据监控。在安全领域不断细分的场景下, 我们需要采用不同的产品来满足不同的安全需求。我们再提到防火墙不应该仅仅考虑到网络防火墙, 还有应用防火墙,数据库防火墙。现在也有很多的商业化的数据库防火墙产品, 他们可以对不同种类的数据库提供支持。

本文介绍了ProxySQL的安装与配置,特别是其作为数据库防火墙的功能,如过滤和日志记录。通过示例展示了如何设置规则,以实现对敏感信息的查询结果进行过滤,保护数据库资源。ProxySQL的规则匹配和审计日志功能有助于实现透明的数据脱敏和监控。
--proxySQL&spm=1001.2101.3001.5002&articleId=115127639&d=1&t=3&u=02d7ce4a9bfb478fbbdfdc8bd9c96e5a)
597

被折叠的 条评论
为什么被折叠?



