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防火墙实践的主要内容,如果未能解决你的问题,请参考以下文章

Oracle AVDF数据库审计与防火墙最佳实践

20145237《网络攻防》Web安全基础实践

20155223 Exp9 Web安全基础实践

sql sql里面的代码片段

Microsoft SQL Server 代码片段收集

缺少 SQL SERVER 2014 代码片段