技術專欄

Oracle Database 23ai 新功能:SQL 防火牆 - 資料庫安全的強力守門員

Oracle 甲骨文 企業軟體供應商
2025/03/07

近年來,資料庫安全議題日益受到重視,各種資料外洩事件層出不窮,企業蒙受重大損失。 Oracle Database 23ai 推出了一項強大的新功能 - SQL 防火牆(SQL Firewall,旨在提升資料庫的安全性,防止未經授權的 SQL 語句執行,有效防禦內部威脅與外部攻擊。 本文將介紹 SQL 防火牆,包含其優勢、適用版本、配置步驟,以及注意事項,讓您快速掌握這項重要的安全功能。

1. SQL 防火牆簡介與好處

SQL 防火牆是 Oracle Database 23ai 導入的一項內建安全機制,它就像資料庫的守門員,負責檢查並控制進入資料庫的 SQL 語句。其運作原理基於「白名單機制」,只允許預先定義且經過授權的 SQL 語句通過,其他未經許可的 SQL 語句則會被阻擋,無法執行 (或僅記錄不阻擋)。

簡單來說,SQL 防火牆會記錄應用程式正常運作所需的合法 SQL 語句,建立一個「可信任 SQL 語句」的白名單。在啟用 SQL 防火牆後,它會攔截所有進入資料庫的 SQL 語句,並比對白名單,只有符合白名單的 SQL 語句才能被執行,其餘皆會被拒絕。

SQL 防火牆的主要好處包括:

2. 適用資料庫版本與平台

SQL 防火牆是 Oracle Database 23ai 版本的新功能,目前可以在以下平台上使用 [1]:

3. 配置步驟 (Demo)

   3.1 以 SYS 使用者連線到資料庫

   3.2 配置SQL 防火牆所需的帳戶和角色

-- 建立 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;

 

   3.3 建立二個測試表格,來讓 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;

   3.4 使用 FWADMIN帳戶連線到資料庫,啟用 SQL Firewall,並開啟活動補捉,以便後續建立白名單

-- 啟用 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;

/

   3.5 使用 APP_USER_1 用戶登入資料庫,並執行一些 SQL 查詢,這些查詢將會成為允許清單的內容

select * from schema_owner.t1;

select * from schema_owner.t2;

   3.6 回到 FWADMIN 資料庫連線,啟用允許清單

--我們可以看到 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;

/

   3.7 回到 APP_USER_1,執行之前沒有操作過的 SQL 查詢,可以看到查詢報錯 ORA-47605: SQL Firewall violation,但在允許清單內的 SQL 操作執行正常

--以下 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

4. 注意事項

總結

SQL 防火牆是 Oracle Database 23ai 提供的一項重要安全功能,它透過白名單機制,有效提升資料庫的安全性,防禦各種惡意攻擊和內部威脅。 透過本文的介紹,相信您已對 SQL 防火牆有了更深入的了解,並能開始在您的資料庫環境中部署和應用這項強大的安全工具。 請持續關注 Oracle 官方資訊,以獲取關於 SQL 防火牆的最新功能和支援訊息,或是洽詢邁達特  Oracle 團隊

[1] https://docs.oracle.com/en/database/oracle/oracle-database/23/dblic/Licensing-Information.html#GUID-0F9EB85D-4610-4EDF-89C2-4916A0E7AC8

聯絡 我們