SQL防火墙实践
Posted PostgreSQLChina
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL防火墙实践相关的知识,希望对你有一定的参考价值。
作者:王志斌
曾获得中国PostgreSQL数据库管理工程师(PGCE),PostgreSQL官方认证讲师。
简述
sql_firewall是PostgreSQL扩展,旨在保护SQL注入或意外查询导致数据库出现问题。sql_firewall模块学习可以执行查询,并且防止/警告执行未找到的查询防火墙规则。
模式
SQL防火墙具有如下模式:学习模式、强制模式、许可模式以及关闭模式。
- 学习模式(learning),防火墙会记录与userid和queryid相关联的SQL查询,作为用户常用查询的预期白名单,此时防火墙打开不做校验。“queryid”是基于解析树计算,类似于pg_stat_statements。
- 强制模式(enforcing),此模式下,防火墙会对用户的查询进行检查,判断查询是否在 “userid” 和
"queryid"对应防火墙规则中,如果查询不在防火墙规则中,阻止执行并返回错误消息。 - 许可模式(permissive),此模式下,防火墙会对用户查询进行判断。如果用户的查询不在规防火墙则中,防火墙会继续执行,并提示告警。
- 关闭模式(disabled),此模式下防火墙不起任何作用。
安装
从源码构建sql_firewall
$ export PATH=$PGHOME/bin:$PATH
$ export USE_PGXS=1
$ make
$ sudo make install
配置
$ vi $PGDATA/postgresql.conf
增加如下内容:
shared_preload_libraries = 'sql_firewall'
sql_firewall.firewall = 'learning'
sql_firewall.max =5000
$ pg_ctl -D $PGDATA restart
$ psql mydb
mydb=# create extension sql_firewall;
注:sql_firewall将检查所有传入的查询,不仅限于已安装模块的特定数据库,而是整个PostgreSQL集群内所有数据库。但是该模块中的视图和功能仅在已安装的数据库上可用。
示例
Learn mode
修改PG_DATA目录下的postgresql.conf文件
shared_preload_libraries = 'pg_stat_statements,sql_firewall'
sql_firewall.firewall = 'learning'
重新启动数据库
postgres=# select * from k1 where uid=1;
Permissive mode
修改PG_DATA目录下的postgresql.conf文件
sql_firewall.firewall = 'permissive'
重新启动数据库
postgres=# select * from sql_firewall.sql_firewall_statements;
WARNING: Prohibited SQL statement
userid | queryid | query | calls
--------+------------+---------------------------------+-------
10 | 3294787656 | select * from k1 where uid = ?; | 1
(1 row)
postgres=# select * from k1 where uid = 1;
uid | uname
-----+-------------
1 | Park Gyu-ri
(1 row)
postgres=# select * from k1 where uid = 3;
uid | uname
-----+-----------
3 | Goo Ha-ra
(1 row)
postgres=# 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)
Enforcing mode
修改PG_DATA目录下的postgresql.conf文件
sql_firewall.firewall = 'enforcing'
重新启动数据库
postgres=# select * from k1 where uid = 3;
uid | uname
-----+-----------
3 | Goo Ha-ra
(1 row)
postgres=# select * from k1 where uid = 3 or 1 = 1;
ERROR: Prohibited SQL statement
以上是关于SQL防火墙实践的主要内容,如果未能解决你的问题,请参考以下文章