PolarDB的Proxy提供了SQL防火墻功能,該功能通過設置黑白名單規則來識別需要放行和攔截的SQL語句。本文主要介紹SQL防火墻功能相關內容。
背景信息
在實際應用場景中,如果數據庫被攻擊者撞庫成功,攻擊者可能會通過批量拖庫的方式獲取所有信息。除此之外,在日常運維操作中,如果執行的SQL語句中缺少where
條件,且執行的語句為DELETE語句時,會發生誤刪除數據庫中的表的意外事件。
為了在意外發生之前攔截這類高危操作,Proxy提供了一種SQL攔截能力,通過設置黑名單規則和白名單規則兩種規則類型來識別需要攔截和放行的SQL語句。當前SQL防火墻提供的功能及流程如下:
前提條件
PolarDB數據庫代理版本需為2.5.1或以上。如何查看和升級當前數據庫代理版本,請參見小版本升級。
使用限制
開啟SQL防火墻功能后,Proxy會在您當前的集群中創建一個數據庫
database:proxy_auditing
和兩張表,其中,sql_list
表用于保存黑白名單規則中的參數化SQL語句,org_sql_list
表用于保存黑名單規則中具體的SQL語句。且每張表最多保存500,000條SQL語句。第一次創建新規則時,只對新建立的連接生效。修改規則后,5秒后可以對之前的連接生效。
使用指定模式創建的黑白名單SQL語句,在創建時不會被攔截,只有在創建成功后才會進行攔截。
暫不支持對同一賬號和Endpoint同時啟用黑名單和白名單兩個功能。
不支持Multi-Statement。所有的Multi-Statement都會被攔截。
Proxy無法解析的SQL語句,會被記錄到防火墻審計日志中,但不進行攔截。例如,含有錯誤語法的SQL語句SELECT。
使用指定模式創建的黑白名單SQL語句,即使對應的黑白名單規則都被禁用或被刪除,其在數據庫表中的SQL語句仍然會被保留。如果對應的黑白名單再次被啟用,同賬號的規則還是會生效。如果您想徹底刪除黑白名單,可通過超級賬號連接到對應集群的主節點上刪除對應的SQL語句。
黑白名單功能只能攔截普通SQL command(3),或者prepare command(22);其他command不會被攔截。例如,通過MySQL命令行連接集群后,use db;這條SQL語句會被命令行工具轉為COM_INIT_DB(1)命令,該命令不會被攔截。
性能影響
啟用黑名單規則后,會產生一定的性能開銷(10%以內)。
啟用白名單規則后,且不產生報警日志的情況下,會產生一定的性能開銷(10%左右)。
如果執行的所有SQL語句都產生報警日志,在正常的業務情況下,請求速率會下降20% ~ 30%。但是,正常情況下不會發生所有SQL均觸發報警日志的情況,而是偶爾會有SQL語句觸發報警日志。所以在正常的業務情況下,開啟黑白名單功能對客戶的請求速率都不會有明顯的影響。