SQL防火牆是資料庫層面的防火牆功能,可以防止惡意SQL注入。可以用來學習一些定義好的SQL規則,並將這些規則儲存在資料庫中作為白名單,學習完成後,可以限制使用者執行這些定義規則之外的風險操作。
前提條件
PolarDB PostgreSQL版版本為PostgreSQL 11。
注意事項
sql_firewall外掛程式需要使用共用記憶體,如果叢集啟動時沒有載入sql_firewall庫(預設不載入),建立外掛程式成功,但功能使用異常。如果需要正常使用sql_firewall外掛程式功能,請在shared_preload_libraries參數中添加sql_firewall。
您可以通過控制台設定shared_preload_libraries參數,詳細操作請參考設定叢集參數。修改該參數後叢集將會重啟,請在修改參數前做好業務安排,謹慎操作。
學習模式、預警模式與防火牆模式

SQL防火牆支援如下三種模式:
學習模式:防火牆記錄使用者執行的SQL,並添加到常用SQL白名單。
預警模式:防火牆對使用者將執行的SQL進行判斷,如果SQL不在白名單中,仍然會執行該SQL,但是會警示使用者該SQL不在白名單中。
防火牆模式:防火牆對使用者將執行的SQL進行判斷,如果SQL不在白名單中,防火牆會拒絕執行該SQL並返回錯誤提示。
SQL防火牆的使用步驟
開啟防火牆的學習模式,讓防火牆記錄使用者執行的SQL,並加入白名單。這個過程建議持續一段較長的時間,盡量讓防火牆學習到所有可能執行的SQL。
切換防火牆為預警模式,這個過程防火牆會對使用者的一些不在白名單的SQL進行警示,使用者結合自己的業務判斷是否為風險SQL,如果這些SQL確實是使用者需要的業務語句,則記錄這些SQL,之後開啟學習模式進行二次學習。
經過前兩步,使用者常用SQL已經被記錄完畢,開啟防火牆模式,此時不在白名單的SQL均會被拒絕執行。
操作說明
建立外掛程式
CREATE EXTENSION sql_firewall;說明sql_firewall外掛程式需要使用共用記憶體,因此您在叢集啟動時沒有載入sql_firewall庫(預設不載入),建立外掛程式成功,但功能使用異常。
如果想正常使用外掛程式功能,請在shared_preload_libraries參數中添加
sql_firewall,詳細操作請參考設定叢集參數。修改該參數後叢集將會重啟,請在修改參數前做好業務安排,謹慎操作。
刪除外掛程式
DROP EXTENSION sql_firewall;切換模式
在控制台找到sql_firewall.firewall參數,修改參數值並重啟叢集。
說明sql_firewall.firewall參數控制台不可見,如您需要使用相關功能,請聯絡我們處理。
sql_firewall.firewall取值如下:
disable:關閉SQL防火牆。
learning:學習模式。
permissive:預警模式。
enforcing:防火牆模式。
功能函數
函數名稱
描述
sql_firewall_reset()
清空白名單。該函數僅在防火牆關閉模式下可用,僅polar_superuser許可權使用者可執行該函數。
sql_firewall_stat_reset()
清空統計資訊。該函數僅在防火牆關閉模式下可用,僅polar_superuser許可權使用者可執行該函數。
視圖函數
視圖名稱
描述
sql_firewall.sql_firewall_statements
展示目前資料庫中所有的白名單及其被調用的次數。
sql_firewall.sql_firewall_stat
展示預警模式下的警告數量(sql_warning)和防火牆模式下的錯誤數量(sql_error)。
樣本
預警模式
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