Postgresql插件sql_firewall介绍

sql_firewall是PostgreSQL扩展插件,旨在防止SQL注入或意外查询数据库。该插件可以学习定义好的一些规则,然后过滤掉定义规则之外的SQL。

如下图,有三种模式
Postgresql插件sql_firewall介绍_第1张图片
SQL防火墙共有三种模式,学习模式、预警模式与防火墙模式。

• 学习模式,防火墙会记录用户的SQL查询,作为用户常用查询的预期白名单,此时防火墙打开不做校验。

• 预警模式,此模式下,防火墙会对用户的SQL进行判断,如果用户的SQL不在白名单中,仍然会执行该SQL,但是会给用户一个报警,告知用户这条SQL不符合白名单记录的业务规则。

• 防火墙模式,此模式下,防火墙会对用户的SQL进行判断。如果用户的SQL不在白名单中,防火墙会拒绝该SQL的执行并告知用户这是一个错误。

sql_firewall安装:

$ export PATH=$PGHOME/bin:$PATH
$ export USE_PGXS=1
$ make
$ sudo make install

修改postgresql.conf配置文件,添加如下
shared_preload_libraries = 'sql_firewall'
由于开始不知道要执行那些SQL,可以先开启一段时间learning
sql_firewall.firewall = 'learning'
一段时间后,可以修改为enforcing

重启数据库,登陆到某一个数据库,然后给改库安装插件。
$ pg_ctl -D $PGDATA restart
$ psql xxx
xxxx=# create extension sql_firewall;

SQL_FIREWALL提供了7个用户接口的操作函数,如下:
• sql_firewall_reset() 重置 所有的防火墙规则
• sql_firewall_statements() 展示所有的防火墙规则
• sql_firewall_stat_error_count() 查看强制模式下的错误数量
• sql_firewall_stat_warning_count() 查看宽容模式下的警告数量
• sql_firewall_stat_reset() 重置 错误与警告数量
• sql_firewall_export_rule() 导出 防火墙规则
• sql_firewall_import_rule() 导入 防火墙规则

相关视图
sql_firewall.sql_firewall_statements 显示了firewall的规则和每个SQL的统计次数
sql_firewall.sql_firewall_stat有两个统计列,一个是sql_warning,一个是sql_error,
sql_warning是在permissive模式下统计告警的次数,sql_error是在sql_error模式下的错误统计数

如下例子:

* 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
    (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)
  
    postgres=# 

* 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
    postgres=# 

参考:
https://github.com/uptimejp/sql_firewall

你可能感兴趣的:(#,postgreSQL)