23C新特性SQL防火牆 (SQL Firewall)

sjw1933發表於2024-01-19

描述                                            

SQL 防火牆 的介紹

SQL 防火牆透過監控和阻止未經授權的SQL SQL 注入攻擊來工作。它內建了一系列規則,可以識別和阻止常見的SQL 注入攻擊,如布林型注入、報錯注入、聯合查詢注入、堆疊查詢注入等。此外,它還可以透過基於角色的訪問控制(RBAC )來限制使用者的訪問許可權,從而防止SQL 注入攻擊。

防火牆的優點在於它內建在資料庫內部,不需要任何外部元件或代理,因此可以提供更高效和可靠的防護。此外,它可以自動識別和阻止SQL 注入攻擊,而無需手動配置或更新防火牆規則。

SQL 防火牆的注意事項

  • 如果我們基於捕獲進行  SQL  防火牆配置,則必須執行捕獲足夠長的時間才能獲取所有可能的變化。假設我們執行捕獲一週,然後基於該捕獲啟用  SQL  防火牆。然後,我們嘗試執行一些月度、季度或新增業務語句,它會被阻止,因為它在捕獲期間未執行過。
  • 應用程式會隨著時間的推移而發展,因此新版本可能包含許多新的  SQL  語句,這些語句將被阻止,直到修改  SQL  允許列表。會話上下文允許列表( IP  地址、作業系統使用者和作業系統程式)也可能隨時間而更改。
  • SQL  防火牆的存在並不是放鬆 最小許可權 管理和使用防火牆的傳統訪問控制的藉口。它是對那些應該已經到位的安全層的補充。
  • SQL  防火牆可用於監視活動,而不是阻止它。將過程中的引數 BLOCKENABLE_ALLOW_LIST 設定為  false  意味著它將記錄,但不會阻止。
  • 可以在根容器或  PDB  中啟用  SQL  防火牆。

防火牆測試

建立測試使用者

建立使用者指令碼:

conn sys/SysPassword1@//localhost:1521/freepdb1 as sysdba
 
drop user if exists fwadmin cascade;
 
create user fwadmin identified by fwadmin;
grant create session to fwadmin;
grant sql_firewall_admin to fwadmin;
 
 
drop user if exists schema_owner cascade;
 
create user schema_owner identified by schema_owner quota unlimited on users;
grant db_developer_role to schema_owner;
 
 
drop user if exists app_user_1 cascade;
 
create user app_user_1 identified by app_user_1;
grant create session to app_user_1;
grant select any table on schema schema_owner to app_user_1;


建立兩張表用於測試

drop table if exists schema_owner.t1 purge;
create table schema_owner.t1 (id number);
insert into schema_owner.t1 values (1);
 
drop table if exists schema_owner.t2 purge;
create table schema_owner.t2 (id number);
insert into schema_owner.t2 values (2);
 
commit;

防火牆抓取(審計)會話

登入防火牆許可權使用者,開啟防火牆

conn fwadmin/fwadmin@//localhost:1521/freepdb1
 
exec dbms_sql_firewall.enable;

使用以下查詢檢查  SQL  防火牆的狀態。

select status   from  dba_sql_firewall_status;
 
STATUS
--------
ENABLED

# 啟用對應使用者跟蹤日誌

begin
  dbms_sql_firewall.create_capture (
    username       => 'app_user_1',
    top_level_only => true,
    start_capture  => true);
end;
/

新建會話使用app_user_1 使用者連線,執行查詢操作

# sqlplus  連線執行

select * from schema_owner.t1;
select * from schema_owner.t2;

# pl/sql 也登入一個會話,執行同樣的操作

select * from schema_owner.t1;
select * from schema_owner.t2;

回到防火牆管理員會話中,查詢日誌

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      sqlplus@localhost.localdomain (TNS V1-V3)     oracle     127.0.0.1  SELECT DECODE (USER,:"SYS_B_0"
                                                                                                 ,XS_SYS_CONTEXT (:"SYS_B_1",:"
                                                                                                 SYS_B_2"),USER) FROM SYS.DUAL
 
SELECT       APP_USER_1      sqlplus@localhost.localdomain (TNS V1-V3)     oracle     127.0.0.1  SELECT * FROM SCHEMA_OWNER.T2
SELECT       APP_USER_1      PL/SQL                                         tim_hall   10.0.2.2   SELECT * FROM SCHEMA_OWNER.T2
SELECT       APP_USER_1      sqlplus@localhost.localdomain (TNS V1-V3)     oracle     127.0.0.1  SELECT * FROM SCHEMA_OWNER.T1
SELECT       APP_USER_1      PL/SQL                                       tim_hall   10.0.2.2   SELECT * FROM SCHEMA_OWNER.T1
 
SQL>
停止抓取
exec dbms_sql_firewall.stop_capture('app_user_1');

建立防火牆規則

根據日誌為使用者生成允許列表。

exec dbms_sql_firewall.generate_allow_list ('app_user_1');

可以透過 IP 地址、程式、系統使用者、 SQL 語句進行配置規則。

#IP  地址

select *
from   dba_sql_firewall_allowed_ip_addr
where  username = 'APP_USER_1';
 
USERNAME             IP_ADDRESS
-------------------- ----------
APP_USER_1           10.0.2.2
APP_USER_1           127.0.0.1

# 應用程式

select *
from   dba_sql_firewall_allowed_os_prog
where  username = 'APP_USER_1';
 
USERNAME             OS_PROGRAM
-------------------- --------------------------------------------------
APP_USER_1           PL/SQL
APP_USER_1           sqlplus@localhost.localdomain (TNS V1-V3)

# 系統使用者

select *
from   dba_sql_firewall_allowed_os_user
where  username = 'APP_USER_1';
 
USERNAME             OS_USER
-------------------- ----------
APP_USER_1           oracle
APP_USER_1           tim_hall

#SQL 語句內容

select current_user,
       sql_text
from   dba_sql_firewall_allowed_sql
where  username = 'APP_USER_1';
 
CURRENT_USER    SQL_TEXT
--------------- --------------------------------------------------
APP_USER_1      SELECT DECODE (USER,:"SYS_B_0",XS_SYS_CONTEXT (:"S
                YS_B_1",:"SYS_B_2"),USER) FROM SYS.DUAL
 
APP_USER_1      SELECT * FROM SCHEMA_OWNER.T2
APP_USER_1      SELECT * FROM SCHEMA_OWNER.T1
 
SQL>

使用以下過程配置允許下列 IP 地址可進行刪除操作。

## 新增 IP 地址

begin
  dbms_sql_firewall.add_allowed_context (
    username     => 'app_user_1',
    context_type => dbms_sql_firewall.ip_address,
    value        => '192.168.56.1');
end;
/

## 確認 IP 列表

column ip_address format a12
 
select *
from   dba_sql_firewall_allowed_ip_addr
where  username = 'APP_USER_1';
 
USERNAME             IP_ADDRESS
-------------------- ------------
APP_USER_1           10.0.2.2
APP_USER_1           127.0.0.1
APP_USER_1           192.168.56.1
 
SQL>

## 刪除 IP 地址

begin
  dbms_sql_firewall.delete_allowed_context (
    username     => 'app_user_1',
    context_type => dbms_sql_firewall.ip_address,
    value        => '192.168.56.1');
end;
/

## 確認 IP 列表

 

select *
from   dba_sql_firewall_allowed_ip_addr
where  username = 'APP_USER_1';
 
USERNAME             IP_ADDRESS
-------------------- ------------
APP_USER_1           10.0.2.2
APP_USER_1           127.0.0.1
 
SQL>

下面示例,我們同時啟用上下文和  SQL  允許列表。若將引數設定為  false 只會記錄異常操作,但不會阻止操作。

begin
  dbms_sql_firewall.enable_allow_list (
    username => 'app_user_1',
    enforce  => dbms_sql_firewall.enforce_all,
    block    => true);
end;
/

可以使用檢視檢視允許列表的狀態。 DBA_SQL_FIREWALL_ALLOW_LISTS

select username,
       status,
       top_level_only,
       enforce,
       block
from   dba_sql_firewall_allow_lists
where username='APP_USER_1';
 
USERNAME             STATUS   TOP_LEVEL_ONLY ENFORCE         BLOCK
-------------------- -------- -------------- --------------- --------------
APP_USER_1           ENABLED  Y              ENFORCE_ALL     Y
 
SQL>

可以使用該檢視檢查  SQL  防火牆的違規情況。 DBA_SQL_FIREWALL_VIOLATIONS

select sql_text,
       firewall_action,
       ip_address,
       cause,
       occurred_at
from   dba_sql_firewall_violations
where  username = 'APP_USER_1';

使用不同的會話,向資料庫發出未知和已知的 SQL 語句。請注意,未知語句失敗,並顯示 “ORA-47605 SQL  防火牆衝突 錯誤。

-- 未知語句

select count(*) from schema_owner.t1;
 
Error starting at line : 1 in command -
select count(*) from schema_owner.t1
Error at Command Line : 1 Column : 1
Error report -
SQL Error: ORA-47605: SQL Firewall violation
 
SQL>

--  列表內語句

select * from schema_owner.t1;
 
  COUNT(*)
----------
         1
 
SQL>

登入防火牆管理員使用者並檢查違規行為。

select sql_text,
       firewall_action,
       ip_address,
       cause,
       occurred_at
from   dba_sql_firewall_violations
where  username = 'APP_USER_1'
and    sql_text like '%COUNT%';
 
SQL_TEXT                                           FIREWAL IP_ADDRESS   CAUSE                OCCURRED_AT
-------------------------------------------------- ------- ------------ -------------------- -----------------------------------
SELECT COUNT (*) FROM SCHEMA_OWNER.T1              Blocked 10.0.2.2     SQL violation        03-JUL-23 09.35.55.318805 PM +00:00
 
SQL>

如果我們發現應該允許透過的違規行為,我們可以手動將它們新增到允許列表中,也可以透過從日誌中提取它們來新增它們。

exec dbms_sql_firewall.append_allow_list('app_user_1', dbms_sql_firewall.violation_log);

嘗試再次執行導致衝突的查詢,會正常透過

select count(*) from schema_owner.t1;
 
  COUNT(*)
----------
         1
 
SQL>

防火牆相關檢視

select view_name
from   dba_views
where  view_name like 'DBA_SQL_FIREWALL%'
order by 1;
 
VIEW_NAME
--------------------------------------------------------------------------------
DBA_SQL_FIREWALL_ALLOWED_IP_ADDR
DBA_SQL_FIREWALL_ALLOWED_OS_PROG
DBA_SQL_FIREWALL_ALLOWED_OS_USER
DBA_SQL_FIREWALL_ALLOWED_SQL
DBA_SQL_FIREWALL_ALLOW_LISTS
DBA_SQL_FIREWALL_CAPTURES
DBA_SQL_FIREWALL_CAPTURE_LOGS
DBA_SQL_FIREWALL_SESSION_LOGS
DBA_SQL_FIREWALL_SQL_LOGS
DBA_SQL_FIREWALL_STATUS
DBA_SQL_FIREWALL_VIOLATIONS


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/23825935/viewspace-3004479/,如需轉載,請註明出處,否則將追究法律責任。

相關文章