PolarDB的Proxy提供了SQL防火墙功能,该功能通过设置黑白名单规则来识别需要放行和拦截的SQL语句。本文主要介绍SQL防火墙功能相关内容。
背景信息
在实际应用场景中,如果数据库被攻击者撞库成功,攻击者可能会通过批量拖库的方式获取所有信息。除此之外,在日常运维操作中,如果执行的SQL语句中缺少where
条件,且执行的语句为DELETE语句时,会发生误删除数据库中的表的意外事件。
为了在意外发生之前拦截这类高危操作,Proxy提供了一种SQL拦截能力,通过设置黑名单规则和白名单规则两种规则类型来识别需要拦截和放行的SQL语句。当前SQL防火墙提供的功能及流程如下:
前提条件
PolarDB数据库代理版本需为2.5.1或以上。如何查看和升级当前数据库代理版本,请参见小版本升级。
使用限制
开启SQL防火墙功能后,Proxy会在您当前的集群中创建一个数据库
database:proxy_auditing
和两张表,其中,sql_list
表用于保存黑白名单规则中的参数化SQL语句,org_sql_list
表用于保存黑名单规则中具体的SQL语句。且每张表最多保存500,000条SQL语句。第一次创建新规则时,只对新建立的连接生效。修改规则后,5秒后可以对之前的连接生效。
使用指定模式创建的黑白名单SQL语句,在创建时不会被拦截,只有在创建成功后才会进行拦截。
暂不支持对同一账号和Endpoint同时启用黑名单和白名单两个功能。
不支持Multi-Statement。所有的Multi-Statement都会被拦截。
Proxy无法解析的SQL语句,会被记录到防火墙审计日志中,但不进行拦截。例如,含有错误语法的SQL语句SELECT。
使用指定模式创建的黑白名单SQL语句,即使对应的黑白名单规则都被禁用或被删除,其在数据库表中的SQL语句仍然会被保留。如果对应的黑白名单再次被启用,同账号的规则还是会生效。如果您想彻底删除黑白名单,可通过超级账号连接到对应集群的主节点上删除对应的SQL语句。
黑白名单功能只能拦截普通SQL command(3),或者prepare command(22);其他command不会被拦截。例如,通过MySQL命令行连接集群后,use db;这条SQL语句会被命令行工具转为COM_INIT_DB(1)命令,该命令不会被拦截。
性能影响
启用黑名单规则后,会产生一定的性能开销(10%以内)。
启用白名单规则后,且不产生报警日志的情况下,会产生一定的性能开销(10%左右)。
如果执行的所有SQL语句都产生报警日志,在正常的业务情况下,请求速率会下降20% ~ 30%。但是,正常情况下不会发生所有SQL均触发报警日志的情况,而是偶尔会有SQL语句触发报警日志。所以在正常的业务情况下,开启黑白名单功能对客户的请求速率都不会有明显的影响。