亚马逊AWS官方博客
开源软件 ProxySQL 与 AWS RDS 不得不说系列 Blog(二):借助 ProxySQL 的 Firewall 功能保护 AWS RDS 数据库
近年来,数据库逐渐成为各类安全事件的主角,除了大量的黑客攻击数据库以进行获取暴利之外,还不断出现内部人员“删库跑路”等新闻。当数据库受到攻击后,如果企业有完备的灾备体系,就可以快速恢复数据和系统,在最短时间内恢复对外服务。但毕竟只是事后的补救措施,业务连续性已经不可避免的被破坏,用户在一段时间内无法访问服务,数据也可能会有部分丢失,对企业的业务运营和声誉影响都非常大。
那么,从技术的角度有没有事前防范措施,可以避免类似事件的发生呢? 答案是肯定的。
在AWS云上部署RDS MySQL数据库的用户,可以考虑采用数据库防火墙技术,作为首选的事前防范技术手段。
本文采用开源软件ProxySQL作为数据库防火墙,以代理中间件方式部署在RDS MySQL数据库之前,配置和运维都非常简单。
ProxySQL的Firewall配置
在系列blog(一)中的ProxySQL基本配置完成后,测试环境已经准备好,可以开始做Firewall的配置和测试。
在2.0.9之前的ProxySQL,可以在mysql_query_rules表中配置多个查询规则来实现防火墙的功能,但在实际环境中,如果有几百上千个sql查询需要进行配置的话,对规则的配置实现起来就会非常复杂。
Firewall特性是ProxySQL在2.0.9中推出的新功能,为数据库防火墙提供了简化配置。其中主要通过两个表来配置:
登陆ProxySQL管理界面。先启用两个参数,以便把查询记录到stats.stats_mysql_query_digest内存表,再把这个表中数据自动保存到磁盘上的history_mysql_query_digest表:
1.创建测试用的数据库和表
通过ProxySQL代理后访问RDS MySQL数据库,创建两个数据库,每个数据库一个表,每个表两条记录。
2.查看stats和history表的记录,注意记录digest。
如果history_mysql_query_digest没有记录,执行以下命令再查记录:
3. 启用Firewall Whitelist功能
这个功能不启用的话,任何查询都被允许通过。
4.把用户user01加入whitelist的users表
用户的状态有三个模式:
- OFF : 允许任何查询
- DETECTING : 允许任何查询,但没有被在mysql_firewall_whitelist_rules被enable的查询会记录到error log
- PROTECTING :只允许mysql_firewall_whitelist_rules里enable的查询,其它查询都会被block
5.将用户状态改为Detecting模式
通过ProxySQL对proxy_test1的table做几个查询
查看/var/lib/ProxySQL/ProxySQL.log,有unkown query的告警。
6.将用户状态改为Protect模式
如果改为Protect保护模式,但还没有配置whitelist 规则的情况下,所有查询都被block。
通过ProxySQL代理登陆RDS MySQL数据库
查看/var/lib/ProxySQL/ProxySQL.log,有查询被block的信息
7.配置whitelist规则
可以根据stats_history.history_mysql_query_digest中的记录,按照需要逐条添加rule。但如果查询很多,建议采用批量方式,将stats_history.history_mysql_query_digest表的记录导入到whitelist表中,再根据需要进行调整。
查看规则
查看每个digest对应查询语句,可以查看stats_history.history_mysql_query_digest表。
可以根据业务需要,找到需要的查询语句,确定是否需要从mysql_firewall_whitelist_rules中删除。或者,也可以直接把需要允许通过的查询语句,直接增加一条记录,其中的digest在stats_history.history_mysql_query_digest表中可以查到:
接下来可以测试一下Firewall是否正常工作:
通过ProxySQL登陆RDS MySQL,然后执行多个查询语句。
可以看到,在whitelist中的查询语句都可以正常执行,而其它语句比如: select id from table1; drop table table1; drop database proxy_test1; 都会被block,从而很好的保护了数据库。
细心的同学可能会发现,配置好Whitelist的规则后,其中第一个执行的语句 show databases在 whitelist_rules表中是有的,为什么也被block呢?这是因为在第一次执行的时候,我是先执行了use proxy_test1,然后才运行了 show databases,所以这个语句有个对应schema是proxy_test1。那么,在把这个语句导入到规则时,show databases语句也带了这个shcema,在图中可以看到。
所以大家可以测试一下,先执行use proxy_test1,再执行show databases就可以正常显示结果了。
另外需要提示一下,有些在我们看来是一样的语句,对Firewall的whitelist规则来说是不同的,比如 select * from table1和 select * from proxy_test1.table1就是两条不同的语句。
小结
对于Firewall的使用,通常会先配置为“Detecting”模式,经过一段时间的业务运行后,把所有执行的SQL语句都记录下来,然后根据安全的要求,把正常的语句放入白名单规则,可以允许执行,其它语句都将被block。当然,也可以先在业务系统的开发测试环境进行部署,也会发现很多语句。