SQL防火墙是数据库层面的防火墙功能,可以防止恶意SQL注入。可以用来学习一些定义好的SQL规则,并将这些规则储存在数据库中作为白名单,学习完成后,可以限制用户执行这些定义规则之外的风险操作。
前提条件
PolarDB PostgreSQL版版本为PostgreSQL 11。
注意事项
sql_firewall插件需要使用共享内存,如果集群启动时没有加载sql_firewall库(默认不加载),创建插件成功,但功能使用异常。如果需要正常使用sql_firewall插件功能,请在shared_preload_libraries参数中添加sql_firewall
。
您可以通过控制台设置shared_preload_libraries参数,详细操作请参考设置集群参数。修改该参数后集群将会重启,请在修改参数前做好业务安排,谨慎操作。
学习模式、预警模式与防火墙模式
SQL防火墙支持如下三种模式:
学习模式:防火墙记录用户执行的SQL,并添加到常用SQL白名单。
预警模式:防火墙对用户将执行的SQL进行判断,如果SQL不在白名单中,仍然会执行该SQL,但是会告警用户该SQL不在白名单中。
防火墙模式:防火墙对用户将执行的SQL进行判断,如果SQL不在白名单中,防火墙会拒绝执行该SQL并返回错误提示。
SQL防火墙的使用步骤
打开防火墙的学习模式,让防火墙记录用户执行的SQL,并加入白名单。这个过程建议持续一段较长的时间,尽量让防火墙学习到所有可能执行的SQL。
切换防火墙为预警模式,这个过程防火墙会对用户的一些不在白名单的SQL进行告警,用户结合自己的业务判断是否为风险SQL,如果这些SQL确实是用户需要的业务语句,则记录这些SQL,之后打开学习模式进行二次学习。
经过前两步,用户常用SQL已经被记录完毕,打开防火墙模式,此时不在白名单的SQL均会被拒绝执行。
操作说明
创建插件
CREATE EXTENSION sql_firewall;
说明sql_firewall插件需要使用共享内存,因此您在集群启动时没有加载sql_firewall库(默认不加载),创建插件成功,但功能使用异常。
如果想正常使用插件功能,请在shared_preload_libraries参数中添加
sql_firewall
,详细操作请参考设置集群参数。修改该参数后集群将会重启,请在修改参数前做好业务安排,谨慎操作。
删除插件
DROP EXTENSION sql_firewall;
切换模式
在控制台找到sql_firewall.firewall参数,修改参数值并重启集群。
说明sql_firewall.firewall参数控制台不可见,如您需要使用相关功能,请联系我们处理。
sql_firewall.firewall取值如下:
disable:关闭SQL防火墙。
learning:学习模式。
permissive:预警模式。
enforcing:防火墙模式。
功能函数
函数名称
描述
sql_firewall_reset()
清空白名单。该函数仅在防火墙关闭模式下可用,仅polar_superuser权限用户可执行该函数。
sql_firewall_stat_reset()
清空统计信息。该函数仅在防火墙关闭模式下可用,仅polar_superuser权限用户可执行该函数。
视图函数
视图名称
描述
sql_firewall.sql_firewall_statements
展示目前数据库中所有的白名单及其被调用的次数。
sql_firewall.sql_firewall_stat
展示预警模式下的警告数量(sql_warning)和防火墙模式下的错误数量(sql_error)。
示例
预警模式
SELECT * FROM sql_firewall.sql_firewall_statements; WARNING: Prohibited SQL statement userid | queryid | query | calls --------+------------+---------------------------------+------- 10 | 3294787656 | select * from k1 where uid = 1; | 1 (1 row) SELECT * FROM k1 WHERE uid = 1; uid | uname -----+------------- 1 | Park Gyu-ri (1 row) SELECT * FROM k1 WHERE uid = 3; uid | uname -----+----------- 3 | Goo Ha-ra (1 row) SELECT * FROM k1 WHERE uid = 3 OR 1 = 1; WARNING: Prohibited SQL statement uid | uname -----+---------------- 1 | Park Gyu-ri 2 | Nicole Jung 3 | Goo Ha-ra 4 | Han Seung-yeon 5 | Kang Ji-young (5 rows)
防火墙模式
SELECT * FROM k1 WHERE uid = 3; uid | uname -----+----------- 3 | Goo Ha-ra (1 row) SELECT * FROM k1 WHERE uid = 3 OR 1 = 1; ERROR: Prohibited SQL statement