sql_firewall
SQL防火墻是數(shù)據(jù)庫層面的防火墻功能,可以防止惡意SQL注入。可以用來學(xué)習(xí)一些定義好的SQL規(guī)則,并將這些規(guī)則儲(chǔ)存在數(shù)據(jù)庫中作為白名單,學(xué)習(xí)完成后,可以限制用戶執(zhí)行這些定義規(guī)則之外的風(fēng)險(xiǎn)操作。
注意事項(xiàng)
sql_firewall插件需要使用共享內(nèi)存,如果集群啟動(dòng)時(shí)沒有加載sql_firewall庫(默認(rèn)不加載),則會(huì)創(chuàng)建插件失敗。如果需要安裝sql_firewall插件,請?jiān)?span data-tag="parmname" id="parmname-g31-zk0-ber" class="parmname">shared_preload_libraries參數(shù)中添加sql_firewall
。
學(xué)習(xí)模式、預(yù)警模式與防火墻模式
SQL防火墻支持如下三種模式:
學(xué)習(xí)模式:防火墻記錄用戶執(zhí)行的SQL,并添加到常用SQL白名單。
預(yù)警模式:防火墻對用戶將執(zhí)行的SQL進(jìn)行判斷,如果SQL不在白名單中,仍然會(huì)執(zhí)行該SQL,但是會(huì)告警用戶該SQL不在白名單中。
防火墻模式:防火墻對用戶將執(zhí)行的SQL進(jìn)行判斷,如果SQL不在白名單中,防火墻會(huì)拒絕執(zhí)行該SQL并返回錯(cuò)誤提示。
SQL防火墻的使用步驟
打開防火墻的學(xué)習(xí)模式,讓防火墻記錄用戶執(zhí)行的SQL,并加入白名單。這個(gè)過程建議持續(xù)一段較長的時(shí)間,盡量讓防火墻學(xué)習(xí)到所有可能執(zhí)行的SQL。
切換防火墻為預(yù)警模式,這個(gè)過程防火墻會(huì)對用戶的一些不在白名單的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均會(huì)被拒絕執(zhí)行。
操作說明
創(chuàng)建插件
create extension sql_firewall;
說明sql_firewall插件需要使用共享內(nèi)存,因此您在集群啟動(dòng)時(shí)沒有加載sql_firewall庫(默認(rèn)不加載),則會(huì)創(chuàng)建插件失敗。
如果想正常使用插件功能,您需要在postgresql.conf文件中添加
shared_preload_libraries = 'sql_firewall'
語句,并重啟集群。
刪除插件
drop extension sql_firewall;
切換模式
在控制臺(tái)找到sql_firewall.firewall參數(shù),修改參數(shù)值并重啟集群。
sql_firewall.firewall取值如下:
disable:關(guān)閉SQL防火墻。
learning:學(xué)習(xí)模式。
permissive:預(yù)警模式。
enforcing:防火墻模式。
功能函數(shù)
sql_firewall_reset()
清空白名單。該函數(shù)只有在防火墻關(guān)閉模式下,polar_superuser權(quán)限的用戶可執(zhí)行該函數(shù)。
sql_firewall_stat_reset()
清空統(tǒng)計(jì)信息。該函數(shù)只有在防火墻關(guān)閉模式下,polar_superuser權(quán)限的用戶可執(zhí)行該函數(shù)。
視圖函數(shù)
sql_firewall.sql_firewall_statements
展示目前數(shù)據(jù)庫中所有的白名單及其被調(diào)用的次數(shù)。
select * from sql_firewall.sql_firewall_statements;
結(jié)果如下:
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)。
select * from sql_firewall.sql_firewall_stat;
sql_warning | sql_error -------------+----------- 2 | 1 (1 row)
示例
--預(yù)警模式
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