近年來,資料庫安全議題日益受到重視,各種資料外洩事件層出不窮,企業蒙受重大損失。 Oracle Database 23ai 推出了一項強大的新功能 - SQL 防火牆(SQL Firewall),旨在提升資料庫的安全性,防止未經授權的 SQL 語句執行,有效防禦內部威脅與外部攻擊。 本文將介紹 SQL 防火牆,包含其優勢、適用版本、配置步驟,以及注意事項,讓您快速掌握這項重要的安全功能。
SQL 防火牆是 Oracle Database 23ai 導入的一項內建安全機制,它就像資料庫的守門員,負責檢查並控制進入資料庫的 SQL 語句。其運作原理基於「白名單機制」,只允許預先定義且經過授權的 SQL 語句通過,其他未經許可的 SQL 語句則會被阻擋,無法執行 (或僅記錄不阻擋)。
簡單來說,SQL 防火牆會記錄應用程式正常運作所需的合法 SQL 語句,建立一個「可信任 SQL 語句」的白名單。在啟用 SQL 防火牆後,它會攔截所有進入資料庫的 SQL 語句,並比對白名單,只有符合白名單的 SQL 語句才能被執行,其餘皆會被拒絕。
SQL 防火牆是 Oracle Database 23ai 版本的新功能,目前可以在以下平台上使用 [1]:
-- 建立 FWADMIN 用戶,專門用來管理 SQL Firewall,該用戶會被授予 SQL_FIREWALL_ADMIN 角色 create user fwadmin identified by "password"; grant create session to fwadmin; grant sql_firewall_admin to fwadmin;
-- 建立 SCHEMA_OWNER 用戶,用來建立測試需要的資料庫物件 create user schema_owner identified by "password" quota unlimited on users; grant db_developer_role to schema_owner;
-- 建立 APP_USER_1 用戶,當作應用程序所使用的用戶,用來存取 SCHEMA_OWNER 所建立的物件 create user app_user_1 identified by "password"; grant create session to app_user_1; grant select any table on schema schema_owner to app_user_1; |
create table schema_owner.t1 (id number); insert into schema_owner.t1 values (1); create table schema_owner.t2 (id number); insert into schema_owner.t2 values (2); commit; |
-- 啟用 SQL Firewall exec dbms_sql_firewall.enable;
--對 APP_USER_1 用戶的活動開啟補捉 begin dbms_sql_firewall.create_capture ( username => 'app_user_1', top_level_only => true, start_capture => true); end; / |
select * from schema_owner.t1; select * from schema_owner.t2; |
--我們可以看到 APP_USER_1 的 SQL操作已被補捉 select command_type, current_user, client_program, os_user, ip_address, sql_text from dba_sql_firewall_capture_logs where username = 'APP_USER_1';
COMMAND_TYPE CURRENT_USER CLIENT_PROGRAM OS_USER IP_ADDRESS SQL_TEXT ------------ --------------- --------------------------------------------- ---------- SELECT APP_USER_1 SQL Developer chengyichang 60.250.39.10 SELECT * FROM SCHEMA_OWNER.T2 SELECT APP_USER_1 SQL Developer chengyichang 60.250.39.10 SELECT * FROM SCHEMA_OWNER.T1
--停止APP_USER_1 用戶活動補捉 exec dbms_sql_firewall.stop_capture('app_user_1');
--基於補捉到的日誌,產生白名單 exec dbms_sql_firewall.generate_allow_list ('app_user_1');
--查看白名單的內容,分別查看IP_ADDRESS、OS_PROGRAM、OS_USER、SQL_TEXT 內容 select * from dba_sql_firewall_allowed_ip_addr where username = 'APP_USER_1';
USERNAME IP_ADDRESS -------------------- ---------- APP_USER_1 60.250.39.10
select * from dba_sql_firewall_allowed_os_prog where username = 'APP_USER_1';
USERNAME OS_PROGRAM -------------------- -------------------------------------------------- APP_USER_1 SQL Developer
select * from dba_sql_firewall_allowed_os_user where username = 'APP_USER_1';
USERNAME OS_USER -------------------- ---------- APP_USER_1 chengyichang
select current_user, sql_text from dba_sql_firewall_allowed_sql where username = 'APP_USER_1' and sql_text like '%SCHEMA_OWNER%';
CURRENT_USER SQL_TEXT --------------- --------------------------------------------------
APP_USER_1 SELECT * FROM SCHEMA_OWNER.T2 APP_USER_1 SELECT * FROM SCHEMA_OWNER.T1
--啟用白名單: 以下例子將啟用 context (上下文資訊) 與 SQL 語句白名單,另外 block 參數設置為 true,表示不在允許清單內的操作將被阻擋 begin dbms_sql_firewall.enable_allow_list ( username => 'app_user_1', enforce => dbms_sql_firewall.enforce_all, block => true); end; / |
--以下 SQL 語句不在白名單中,執行報錯 select count(*) from schema_owner.t1;
ORA-47605: SQL Firewall violation
https://docs.oracle.com/error-help/db/ora-47605/47605. 00000 - "SQL Firewall violation" *Cause: Operation blocked by the SQL Firewall due to enforcement of the firewall policy. *Action: Review the SQL Firewall policy. If it is not intended to block the operation, review and modify the SQL Firewall policy.
--以下 SQL 語句在白名單中,執行正常 select * from schema_owner.t1;
COUNT(*) ---------- 1 |
足夠的捕捉時間: 這是非常重要的一點。 捕捉階段必須涵蓋所有可能的 SQL 語句變化,包括週期性任務(例如季報、年報)。 如果捕捉時間不夠長,遺漏了某些 SQL 語句,在啟用 SQL 防火牆後,這些合法的 SQL 語句將被錯誤地阻擋,導致業務中斷。 因此,必須根據業務週期和應用程式特性,設定足夠長的捕捉時間。
驗證捕捉內容: 捕捉階段的安全性也至關重要。如果在捕捉期間發生了安全漏洞或駭客攻擊,惡意的 SQL 語句可能會被錯誤地加入到白名單中。 因此,必須仔細驗證捕捉的上下文資訊和 SQL 語句,排除任何可疑或惡意的內容。這一步驟可以透過人工審查或自動化工具來完成。
新 SQL 語句的處理: 隨著應用程式的升級或新功能的加入,會引入新的 SQL 語句。 這些新的 SQL 語句在未加入白名單之前,會被 SQL 防火牆阻擋。 因此,在每次應用程式更新後,都需要重新評估並更新 SQL 防火牆的白名單,可以透過重新執行捕捉或手動添加的方式來完成。
上下文資訊的變更: 除了 SQL 語句,上下文資訊(例如 IP 位址、OS 使用者、OS 程式)也可能隨著時間而改變。 例如,伺服器 IP 變更、新增使用者或程式更新,這些都可能導致 SQL 防火牆的規則失效。 因此,也需要定期檢視和更新上下文資訊的白名單。
阻擋策略的選擇: 您可以根據風險評估來決定是否要阻擋未知的 SQL 語句。 如果認為風險較高,可以啟用阻擋功能;如果擔心影響業務連續性,可以先只阻擋未知的上下文,而暫不阻擋未知的 SQL 語句。
監控模式: SQL 防火牆也可以用作監控工具,而非強制阻擋。 透過將 ENABLE_ALLOW_LIST
程序的 BLOCK
參數設定為 false
,可以只記錄違規行為,而不實際阻擋。 這種模式適用於觀察和分析 SQL 活動,以便更好地了解應用程式的行為或偵測潛在的安全威脅。
最低權限原則 (Least Privilege): SQL 防火牆並不能取代最低權限原則。 即使有了 SQL 防火牆,仍然需要嚴格控制使用者的資料庫權限,只授予他們執行必要任務所需的最低權限。
傳統防火牆: SQL 防火牆也無法取代傳統的網路防火牆。網路防火牆仍然是保護資料庫免受外部攻擊的第一道防線。SQL 防火牆是網路層級防禦後,針對資料庫的一層額外保護。
稽核: 可以利用統一稽核策略 (Unified Audit Policy) 來記錄 SQL 防火牆的違規事件,方便安全事件的追蹤和分析。
容器資料庫 (CDB) 與可插拔資料庫 (PDB): SQL 防火牆可以在根容器 (root container) 或特定的 PDB 中啟用,提供靈活的部署選擇。
總結
SQL 防火牆是 Oracle Database 23ai 提供的一項重要安全功能,它透過白名單機制,有效提升資料庫的安全性,防禦各種惡意攻擊和內部威脅。 透過本文的介紹,相信您已對 SQL 防火牆有了更深入的了解,並能開始在您的資料庫環境中部署和應用這項強大的安全工具。 請持續關注 Oracle 官方資訊,以獲取關於 SQL 防火牆的最新功能和支援訊息,或是洽詢邁達特 Oracle 團隊。