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語句觸發警示日誌。所以在正常的業務情況下,開啟黑白名單功能對客戶的請求速率都不會有明顯的影響。