SQL防火墻(sql_firewall)
SQL防火墻是數(shù)據(jù)庫層面的防火墻功能,可以防止惡意SQL注入。可以用來學(xué)習(xí)一些定義好的SQL規(guī)則,并將這些規(guī)則儲存在數(shù)據(jù)庫中作為白名單,學(xué)習(xí)完成后,可以限制用戶執(zhí)行這些定義規(guī)則之外的風(fēng)險(xiǎn)操作。
您可以加入RDS PostgreSQL插件交流釘釘群(103525002795),進(jìn)行咨詢、交流和反饋,獲取更多關(guān)于插件的信息。
前提條件
RDS PostgreSQL實(shí)例需為以下版本之一:
PostgreSQL 12
PostgreSQL 11
PostgreSQL 10
RDS PostgreSQL已不再支持sql_firewall插件,雖然之前已經(jīng)創(chuàng)建的插件仍可使用,但是由于使用該插件可能導(dǎo)致系統(tǒng)崩潰,我們建議您盡早停止使用,以避免潛在風(fēng)險(xiǎn)。
如果您想要移除sql_firewall插件,可以使用drop extension sql_firewall;
語句卸載此插件,并在shared_preload_libraries參數(shù)中移除它,具體修改參數(shù)方法,請參見設(shè)置實(shí)例參數(shù)。
學(xué)習(xí)模式、預(yù)警模式與防火墻模式
SQL防火墻支持如下三種模式:
學(xué)習(xí)模式:防火墻記錄用戶執(zhí)行的SQL,并添加到常用SQL白名單。
預(yù)警模式:防火墻對用戶將執(zhí)行的SQL進(jìn)行判斷,如果SQL不在白名單中,仍然會執(zhí)行該SQL,但是會告警用戶該SQL不在白名單中。
防火墻模式:防火墻對用戶將執(zhí)行的SQL進(jìn)行判斷,如果SQL不在白名單中,防火墻會拒絕執(zhí)行該SQL并返回錯(cuò)誤提示。
SQL防火墻的使用步驟
打開防火墻的學(xué)習(xí)模式,讓防火墻記錄用戶執(zhí)行的SQL,并加入白名單。這個(gè)過程建議持續(xù)一段較長的時(shí)間,盡量讓防火墻學(xué)習(xí)到所有可能執(zhí)行的SQL。
切換防火墻為預(yù)警模式,這個(gè)過程防火墻會對用戶的一些不在白名單的SQL進(jìn)行告警,用戶結(jié)合自己的業(yè)務(wù)判斷是否為風(fēng)險(xiǎn)SQL,如果這些SQL確實(shí)是用戶需要的業(yè)務(wù)語句,則記錄這些SQL,之后打開學(xué)習(xí)模式進(jìn)行二次學(xué)習(xí)。
經(jīng)過前兩步,用戶常用SQL已經(jīng)被記錄完畢,打開防火墻模式,此時(shí)不在白名單的SQL均會被拒絕執(zhí)行。
操作說明
創(chuàng)建插件
create extension sql_firewall;
刪除插件
drop extension sql_firewall;
切換模式
在控制臺找到sql_firewall.firewall參數(shù),修改參數(shù)值并重啟實(shí)例。詳情請參見設(shè)置實(shí)例參數(shù)。
sql_firewall.firewall取值如下:
disable:關(guān)閉SQL防火墻
learning:學(xué)習(xí)模式
permissive:預(yù)警模式
enforcing:防火墻模式
功能函數(shù)
sql_firewall_reset()
清空白名單。該函數(shù)只有在防火墻關(guān)閉模式下,rds_superuser權(quán)限的用戶可執(zhí)行該函數(shù)。
sql_firewall_stat_reset()
清空統(tǒng)計(jì)信息。該函數(shù)只有在防火墻關(guān)閉模式下,rds_superuser權(quán)限的用戶可執(zhí)行該函數(shù)。
視圖函數(shù)
sql_firewall.sql_firewall_statements
展示目前數(shù)據(jù)庫中所有的白名單及其被調(diào)用的次數(shù)。
postgres=# select * from sql_firewall.sql_firewall_statements; userid | queryid | query | calls --------+------------+---------------------------------+------- 10 | 3294787656 | select * from k1 where uid = ?; | 4 (1 row)
sql_firewall.sql_firewall_stat
展示預(yù)警模式下的警告數(shù)量(sql_warning)和防火墻模式下的錯(cuò)誤數(shù)量(sql_error)。
postgres=# select * from sql_firewall.sql_firewall_stat; sql_warning | sql_error -------------+----------- 2 | 1 (1 row)
示例
--預(yù)警模式
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=# 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=#