Oracle Database 23ai 中的In Database SQL Firewall是數(shù)據(jù)庫安全性的重要保障,其作用不僅僅是嵌入數(shù)據(jù)庫內(nèi)核并提供實時保護(hù),防范 SQL 注入攻擊等外部威脅,而且還在于其細(xì)粒度的訪問控制機(jī)制。通過實時監(jiān)測和攔截惡意 SQL 語句,In Database SQL Firewall有效地保護(hù)了數(shù)據(jù)庫的完整性和機(jī)密性,避免了可能導(dǎo)致數(shù)據(jù)泄露、破壞數(shù)據(jù)庫結(jié)構(gòu)或其他惡意行為的安全漏洞。其對未經(jīng)授權(quán)的 SQL 操作的阻止,進(jìn)一步確保了數(shù)據(jù)庫內(nèi)部操作的合法性和安全性,為企業(yè)提供了強(qiáng)大的數(shù)據(jù)安全保障,為業(yè)務(wù)運(yùn)行提供了可靠的基礎(chǔ)支持。我們可以利用In Database SQL Firewall,建立授權(quán)的 SQL 語句,并將其添加到In Database SQL Firewall監(jiān)視器的“允許列表”中。這樣一來,任何符合“允許列表”的 SQL 請求都將被順利執(zhí)行,而潛在違反規(guī)定的 SQL 請求將會被阻止。此外,In Database SQL Firewall還可以利用會話上下文數(shù)據(jù),如 IP 地址、操作系統(tǒng)用戶和程序類型等信息,來加強(qiáng)執(zhí)行控制,確保只有經(jīng)授權(quán)的用戶和程序才能執(zhí)行相應(yīng)的 SQL 操作,進(jìn)一步提升了數(shù)據(jù)庫的安全性和可信度。
今天我們就使用Oracle Database 23ai Free版本進(jìn)行實驗,和大家一起體驗Oracle Database 23ai中提供的In Database SQL Firewall能力。在今天的實驗中,我們的目標(biāo)是創(chuàng)建一個用戶dev1,并且只允許該用戶只能對特定表實現(xiàn)select操作,而無法執(zhí)行其他操作。
首先我們在數(shù)據(jù)庫中創(chuàng)建一個In Database SQL Firewall的管理用戶,名字為df_admin,并對該用戶授予與In Database SQL Firewall相關(guān)的管理權(quán)限。之后,創(chuàng)建普通用戶,名字為dev1,并授予可以登錄數(shù)據(jù)庫的權(quán)限。
[oracle@23ai ~]$ sqlplus / as sysdba SQL*Plus: Release 23.0.0.0.0 - Production on Fri Jun 7 05:55:45 2024Version 23.4.0.24.05 Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to:Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for FreeVersion 23.4.0.24.05 SQL> alter session set container=freepdb1; Session altered. SQL> create user DF_ADMIN identified by Oracle_4U; User created. SQL> grant create session, sql_firewall_admin, audit_admin to df_admin; Grant succeeded. SQL> create user dev1 identified by Oracle_4U; User created. SQL> grant create session, create table, unlimited tablespace to dev1; Grant succeeded. SQL>
接下來,我們使用剛剛創(chuàng)建的dev1用戶登錄,并創(chuàng)建本次測試所需的數(shù)據(jù)表及數(shù)據(jù)。在這里需要注意的是,如果連接失敗,請檢查tnsnames.ora文件,您是否已經(jīng)成功創(chuàng)建了freepdb1這個別名。
[oracle@23ai ~]$ sqlplus dev1/Oracle_4U@freepdb1 SQL*Plus: Release 23.0.0.0.0 - Production on Sat Jun 8 01:36:23 2024Version 23.4.0.24.05 Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to:Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for FreeVersion 23.4.0.24.05 SQL> create table mytab ( cid VARCHAR2(128), owner VARCHAR2(128), address VARCHAR2(128), credit_card VARCHAR2(128));Table created.SQL> create table myobjects ( cid VARCHAR2(128), owner VARCHAR2(128), balance NUMBER, acct_type VARCHAR2(128));Table created.SQL> insert into mytab (cid, owner, address, credit_card) values ('1', 'Bob', '400 Oracle Parkway', '******8118');insert into mytab (cid, owner, address, credit_card) values ('2', 'Jack', '500 Oracle Parkway', '******7641');insert into mytab (cid, owner, address, credit_card) values ('3', 'Joe', '600 Oracle Parkway', '******3720');insert into mytab (cid, owner, address, credit_card) values ('4', 'Tom', '100 Oracle Parkway', '******2873');insert into myobjects (cid, owner,balance, acct_type) values ('1','DEV1', 400, 'online');insert into myobjects (cid, owner,balance, acct_type) values ('1', 'DEV1',500, 'in store');insert into myobjects (cid, owner,balance, acct_type) values ('2', 'DEV2',200, 'online');insert into myobjects (cid, owner,balance, acct_type) values ('2', 'DEV2',700, 'in store');insert into myobjects (cid, owner,balance, acct_type) values ('3', 'DEV3',500, 'online');insert into myobjects (cid, owner,balance, acct_type) values ('3', 'DEV3',900, 'in store');insert into myobjects (cid, owner,balance, acct_type) values ('4', 'DEV4',1000, 'online');insert into myobjects (cid, owner,balance, acct_type) values ('4', 'DEV5',1300, 'in store'); SQL> commit; Commit complete.
接下來我們需要啟動Oracle Database 23ai的In Database SQL Firewall功能,這次請使用我們在之前創(chuàng)建的管理用戶df_admin。啟動In Database SQL Firewall之后,可以通過Select語句檢查數(shù)據(jù)庫的In Database SQL Firewall狀態(tài)。
SQL> conn df_admin/Oracle_4U@freepdb1Connected.SQL> exec dbms_sql_firewall.enable; PL/SQL procedure successfully completed. SQL> select status from dba_sql_firewall_status; STATUS--------ENABLED SQL>
In Database SQL Firewall使用的是“白名單”的保護(hù)方式,為了方便用戶將SQL語句錄入到“白名單”當(dāng)中,Oracle Database 23ai提供了一種便捷的方式,可以使用“捕獲SQL”的方式,簡單來說就是數(shù)據(jù)庫對特定用戶開啟SQL捕獲功能,在開啟該功能之后,該用戶發(fā)出的SQL語句將被記錄下來,當(dāng)管理員認(rèn)為需要捕獲的SQL語句已經(jīng)完成時,可以停止數(shù)據(jù)庫的SQL捕獲行為。
下面的代碼是對dev1用戶開啟SQL捕獲行為,并查看相關(guān)狀態(tài)。
SQL> exec dbms_sql_firewall.create_capture('DEV1');PL/SQL procedure successfully completed.SQL> select username,status from dba_sql_firewall_captures;USERNAME STATUS---------- --------DEV1 ENABLED
通過上面結(jié)果,我們可以看到dev1用戶的SQL捕獲已經(jīng)被開啟。接下來將使用dev1用戶登錄,執(zhí)行一些查詢,來模擬該用戶的日常數(shù)據(jù)庫操作。
SQL> conn dev1/Oracle_4U@freepdb1Connected.SQL> select count(*) from mytab; COUNT(*)----------4 SQL> select count(*) from myobjects; COUNT(*)----------7 SQL> select distinct owner from mytab; OWNER--------------------------------------------------------------------------------BobJackJoeTom SQL> select distinct owner from myobjects; OWNER--------------------------------------------------------------------------------DEV1DEV2DEV3DEV4 SQL> select acct_type from myobjects where owner='DEV1'; ACCT_TYPE--------------------------------------------------------------------------------onlinein store SQL>
當(dāng)完成SQL的捕獲之后,使用df_admin用戶登錄,并停止對dev1用戶的SQL捕獲動作。
SQL> conn df_admin/Oracle_4U@freepdb1Connected.SQL> exec dbms_sql_firewall.stop_capture ('DEV1'); PL/SQL procedure successfully completed.
我們可以通過select語句查詢剛才的捕獲過程中記錄下來的相關(guān)信息。在下面的查詢中,我們可以看到dev1用戶在被捕獲時使用的IP地址、客戶端程序以及操作系統(tǒng)用戶,您也可以根據(jù)自己的情況,對dba_sql_firewall_session_logs進(jìn)行查詢。
SQL> select username,ip_address,client_program,os_user from dba_sql_firewall_session_logs where username='DEV1'; USERNAME IP_ADDRESS CLIENT_PROGRAM OS_USER---------- ---------- ------------------------------ ----------DEV1 10.0.0.10 sqlplus@23ai (TNS V1-V3) oracle
接下來可以查看以下剛才捕獲到的SQL語句。
SQL> select sql_text,accessed_objects from dba_sql_firewall_capture_logs where username='DEV1'; SQL_TEXT--------------------------------------------------------------------------------ACCESSED_OBJECTS--------------------------------------------------------------------------------SELECT COUNT (*) FROM MYTAB"DEV1"."MYTAB" SELECT DISTINCT OWNER FROM MYTAB"DEV1"."MYTAB" SELECT COUNT (ACCT_TYPE) FROM MYOBJECTS WHERE OWNER=:"SYS_B_0""DEV1"."MYOBJECTS" SQL_TEXT--------------------------------------------------------------------------------ACCESSED_OBJECTS--------------------------------------------------------------------------------SELECT ACCT_TYPE FROM MYOBJECTS WHERE OWNER=:"SYS_B_0""DEV1"."MYOBJECTS" SELECT DECODE (USER,:"SYS_B_0",XS_SYS_CONTEXT (:"SYS_B_1",:"SYS_B_2"),USER) FROM SYS.DUAL"SYS"."DUAL" SELECT DISTINCT OWNER FROM MYOBJECTS"DEV1"."MYOBJECTS" SQL_TEXT--------------------------------------------------------------------------------ACCESSED_OBJECTS-------------------------------------------------------------------------------- SELECT COUNT (*) FROM MYOBJECTS"DEV1"."MYOBJECTS" 7 rows selected.
接下來通過剛才捕獲的SQL語句,生成“允許列表”,在該列表中包含了可以運(yùn)行的SQL語句以及與查詢相關(guān)的“路徑信息”,比如哪些IP地址可以訪問、哪些應(yīng)用程序可以訪問等。換句話說,只有特定的操作系統(tǒng)使用特定的IP地址,并使用特定應(yīng)用程序才能執(zhí)行特定的SQL語句,從而可以在更細(xì)的粒度上控制SQL的執(zhí)行。
SQL> EXEC DBMS_SQL_FIREWALL.GENERATE_ALLOW_LIST ('DEV1'); PL/SQL procedure successfully completed.
當(dāng)“允許列表”被創(chuàng)建之后,可以通過如下select語句查詢上面提到的“路徑信息”。首先看看哪些SQL語句可以被dev1用戶執(zhí)行。
SQL> SELECT SQL_TEXT FROM DBA_SQL_FIREWALL_ALLOWED_SQL WHERE USERNAME ='DEV1'; SQL_TEXT--------------------------------------------------------------------------------SELECT COUNT (*) FROM MYTABSELECT DISTINCT OWNER FROM MYTABSELECT COUNT (ACCT_TYPE) FROM MYOBJECTS WHERE OWNER=:"SYS_B_0"SELECT ACCT_TYPE FROM MYOBJECTS WHERE OWNER=:"SYS_B_0"SELECT DECODE (USER,:"SYS_B_0",XS_SYS_CONTEXT (:"SYS_B_1",:"SYS_B_2"),USER) FROMSYS.DUAL SELECT DISTINCT OWNER FROM MYOBJECTSSELECT COUNT (*) FROM MYOBJECTS 7 rows selected.
下面的select語句可以查詢,受信的IP地址。
SQL> select ip_address from dba_sql_firewall_allowed_ip_addr where username='DEV1'; IP_ADDRESS----------10.0.0.10
下面的select語句可以查詢受信的操作系統(tǒng)用戶。
SQL> select os_user from dba_sql_firewall_allowed_os_user where username='DEV1'; OS_USER----------oracle
下面的select語句可以查詢受信的應(yīng)用程序。
SQL> select os_program from dba_sql_firewall_allowed_os_prog where username='DEV1'; OS_PROGRAM--------------------------------------------------------------------------------sqlplus@23ai (TNS V1-V3)
在確認(rèn)“允許列表”的信息正確之后,就可以啟用該允許列表。但需要注意的是,目前沒有啟動In Database SQL Firewall的阻止模式,未受信的SQL語句將可以被執(zhí)行,但會被記錄下來,以供日后參考。通過下面查詢的BLOCK列值,可以了解當(dāng)前dev1用戶是否啟用了阻止模式。
SQL> exec dbms_sql_firewall.enable_allow_list ('DEV1'); PL/SQL procedure successfully completed. SQL> select username,status,block from dba_sql_firewall_allow_lists; USERNAME STATUS BLOCK---------- -------- --------------DEV1 ENABLED N
接下來我們使用未授信的SQL語句進(jìn)行測試,因為沒有啟動阻止模式,因此該SQL語句將可以被執(zhí)行,但會被記錄下來。
SQL> conn dev1/Oracle_4U@freepdb1Connected.SQL> update mytab set owner='JOE_BLOGG' where rownum=1; 1 row updated. SQL> commit; Commit complete.
您可以通過df_admin用戶訪問DBA_SQL_FIREWALL_VIOLATIONS數(shù)據(jù)字典來查詢違規(guī)執(zhí)行的SQL語句。
SQL> select username,sql_text,cause,firewall_action from dba_sql_firewall_violations; USERNAME----------SQL_TEXT--------------------------------------------------------------------------------CAUSE FIREWAL----------------- -------DEV1UPDATE MYTAB SET OWNER=:"SYS_B_0" WHERE ROWNUM=:"SYS_B_1"SQL violation Allowed
啟用In Database SQL Firewall的阻止模式并查看用戶狀態(tài)。通過下面的查詢,可以看到BLOCK的狀態(tài)由原來的N改為Y。
SQL> conn df_admin/Oracle_4U@freepdb1Connected.SQL> exec dbms_sql_firewall.update_allow_list_enforcement ('DEV1',block=>TRUE); PL/SQL procedure successfully completed. SQL> select username,status,block from dba_sql_firewall_allow_lists; USERNAME STATUS BLOCK---------- -------- --------------DEV1 ENABLED Y
接下來我們使用dev1用戶登錄,發(fā)出剛才被允許執(zhí)行的相同違規(guī)語句,看看這回是否可以正常被執(zhí)行。通過下面的結(jié)果可以看出,此次的違規(guī)語句將被拒絕執(zhí)行。
SQL> conn dev1/Oracle_4U@freepdb1Connected.SQL> update mytab set owner='JOE_BLOGG' where rownum=1;update mytab set owner='JOE_BLOGG' where rownum=1*ERROR at line 1:ORA-47605: SQL Firewall violationHelp: https://docs.oracle.com/error-help/db/ora-47605/
接下來使用df_admin用戶登錄,查看系統(tǒng)是否已經(jīng)記錄了剛才的違規(guī)查詢動作??梢钥吹降诙l記錄的firewall_action列值已經(jīng)是Blocked,表示該語句已經(jīng)被阻止。
SQL> conn df_admin/Oracle_4U@freepdb1Connected.SQL> select username,sql_text,cause,firewall_action from dba_sql_firewall_violations; USERNAME----------SQL_TEXT--------------------------------------------------------------------------------CAUSE FIREWAL----------------- -------DEV1UPDATE MYTAB SET OWNER=:"SYS_B_0" WHERE ROWNUM=:"SYS_B_1"SQL violation Allowed DEV1UPDATE MYTAB SET OWNER=:"SYS_B_0" WHERE ROWNUM=:"SYS_B_1"SQL violation Blocked
接下來我們看看,如果使用了非受信的客戶端登錄會怎樣?本次實驗使用sqlcl作為非受信的客戶端,該客戶端可以免費(fèi)下載,解壓后設(shè)定環(huán)境變量后即可使用。下面是該客戶端的下載及使用方式。本次實驗將該工具包下載到/u01下,在下面的環(huán)境變量設(shè)定中,請根據(jù)自己的情況進(jìn)行修改。
wget https://download.oracle.com/otn_software/java/sqldeveloper/sqlcl-latest.zipunzip sqlcl-latest.zip export PATH=$PATH:/u01/sqlcl/bin
sqlcl設(shè)定好之后,可以通過它去連接數(shù)據(jù)庫,因為該客戶端為非授權(quán)客戶端,因此連接行為將被阻止。
[oracle@23ai bin]$ sql dev1/Oracle_4U@localhost:1521/FREEPDB1 SQLcl: Release 24.1 Production on Sat Jun 08 04:07:02 2024 Copyright (c) 1982, 2024, Oracle. All rights reserved. USER = dev1URL = jdbc:oracle:oci8:@localhost:1521/FREEPDB1Error Message = ORA-47605: SQL Firewall violationHelp: https://docs.oracle.com/error-help/db/ora-47605/USER = dev1URL = jdbc:oracle:thin:@localhost:1521/FREEPDB1Error Message = ORA-47605: SQL Firewall violation https://docs.oracle.com/error-help/db/ora-47605/Username? (RETRYING) ('dev1/*********@localhost:1521/FREEPDB1'?)USER = dev1URL = jdbc:oracle:oci8:@localhost:1521/FREEPDB1Error Message = ORA-47605: SQL Firewall violationHelp: https://docs.oracle.com/error-help/db/ora-47605/USER = dev1URL = jdbc:oracle:thin:@localhost:1521/FREEPDB1 Error Message = ORA-47605: SQL Firewall violation
如果想禁用In Database SQL Firewall的攔截行為,可以通過如下語句實現(xiàn),并通過之前使用過的select語句進(jìn)行狀態(tài)確認(rèn)。
[oracle@23ai bin]$ sqlplus df_admin/Oracle_4U@freepdb1 SQL*Plus: Release 23.0.0.0.0 - Production on Sat Jun 8 04:12:06 2024Version 23.4.0.24.05 Copyright (c) 1982, 2024, Oracle. All rights reserved. Last Successful login time: Sat Jun 08 2024 04:00:48 +00:00 Connected to:Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for FreeVersion 23.4.0.24.05 SQL> exec dbms_sql_firewall.update_allow_list_enforcement ('DEV1',block=>False); PL/SQL procedure successfully completed. SQL> select username,status,block from dba_sql_firewall_allow_lists; USERNAME--------------------------------------------------------------------------------STATUS BLOCK-------- --------------DEV1ENABLED N
在今天的內(nèi)容中為您介紹了Oracle Database 23ai中的In Database SQL Firewall功能及其在數(shù)據(jù)庫安全中的關(guān)鍵作用,展示了通過實時監(jiān)測和攔截惡意SQL語句,In Database SQL Firewall有效保護(hù)數(shù)據(jù)庫的完整性和機(jī)密性。通過實驗演示了用戶管理、表創(chuàng)建、數(shù)據(jù)插入、In Database SQL Firewall使用與管理、SQL操作捕獲與記錄、“允許列表”生成及阻止模式測試等步驟,由此可以看出In Database SQL Firewall在防止未授權(quán)操作、記錄和阻止SQL注入攻擊以及處理非受信客戶端連接請求方面的有效性,以及在提升數(shù)據(jù)庫安全性和可信度方面的重要性。
我們將在后續(xù)的文章中繼續(xù)為您介紹Oracle Database 23ai的新特性,敬請期待!
我們一直努力用最尖端的技術(shù),為您提供最貼心的服務(wù)
您能給我們多少信任,我們就能給你多大驚喜
深圳市陽啟科技有限公司
地址:深圳市光明區(qū)鳳凰街道東坑社區(qū)光源二路29號艾維普思大廈613
電話:0755-27404975
郵箱:SunKey@sunkey-tech.com
網(wǎng)址:qwlaw.cn