Oracle 數(shù)據(jù)庫 11g 提供了豐富的安全性新功能 — 區(qū)分大小寫的口令、透明表空間加密以及適用于 UTL_TCP/HTTP/SMTP 的訪問控制列表。
下載 Oracle 數(shù)據(jù)庫 11g |
2006 年,OTN 發(fā)布了我撰寫的一系列題為“安全保護項目:一種分階段的數(shù)據(jù)庫基礎架構保護方法”的文章。在這些文章中,我討論了如何應對常見的安全挑戰(zhàn)(如用戶使用默認口令)以及如何掃描您的數(shù)據(jù)庫以查找這些用戶。
對我而言很不幸的是,您可能已經(jīng)忘記了我文章中的那一部分。Oracle 數(shù)據(jù)庫 11g 現(xiàn)在提供一種快速識別使用默認口令的用戶的方法。該方法實施起來極為簡單,只需檢查單個數(shù)據(jù)字典視圖:DBA_USERS_WITH_DEFPWD。(注意,DBA_ 是一個標準前綴,它不僅包含使用默認口令的 DBA 用戶。)您可以執(zhí)行以下命令來識別這些用戶:
select *from dba_users_with_defpwd輸出如下:
USERNAME------------------------------DIPMDSYSWK_TESTCTXSYSOLAPSYSOUTLNEXFSYSSCOTTMDDATAORDPLUGINSORDSYSXDBLBACSYSSI_INFORMTN_SCHEMAWMSYS由于 SCOTT 使用了默認口令 TIGER,因此您會看到他出現(xiàn)在上面的清單中。使用下面的語句進行更改:
SQL> alter user scott identified by tiger1;User altered.現(xiàn)在,如果您查看該視圖:
SQL> select * from dba_users_with_defpwd;您就不會在該清單中看到 SCOTT 了。就這么簡單!
在版本 11g 之前的 Oracle 數(shù)據(jù)庫中,用戶口令是不區(qū)分大小寫的。例如:
SQL> conn scott/tigerConnected.SQL> conn scott/TIGERConnected.這種安排為支付卡行業(yè) (PCI) 數(shù)據(jù)安全標準之類的標準帶來了問題,這些標準要求口令區(qū)分大小寫。
該問題得到了解決,在 Oracle 數(shù)據(jù)庫 11g 中,口令也可以區(qū)分大小寫。通過 DBCA 創(chuàng)建數(shù)據(jù)庫時,系統(tǒng)會提示您是否希望升級到“新的安全標準”,其中之一就是區(qū)分大小寫的口令。如果您接受該標準,口令在創(chuàng)建時的大小寫狀態(tài)將被記錄下來。假如您接受了新標準,相應的操作結果如下:
SQL> conn scott/tigerConnected.SQL> conn scott/TIGERERROR:ORA-01017:invalid username/password; logon deniedWarning:You are no longer connected to ORACLE.注意對“tiger”和“TIGER”的不同處理方式。
現(xiàn)在,您的某些應用程序可能無法立刻傳遞大小寫正確的口令。典型示例是用戶輸入表單:很多表單在接受口令時不會進行大小寫轉換。然而,在 Oracle 數(shù)據(jù)庫 11g中,這種登錄方式可能會失敗,除非用戶以區(qū)分大小寫格式輸入口令,或者開發(fā)人員對應用程序進行了修改,使其能夠進行大小寫轉換(這一點不可能迅速實現(xiàn))。
不過,如果您希望的話,仍然可以通過更改系統(tǒng)參數(shù) SEC_CASE_SENSITIVE_LOGON 恢復到不區(qū)分大小寫的狀態(tài),如以下示例所示。
SQL> conn / as sysdbaConnected.SQL> alter system set sec_case_sensitive_logon = false;System altered.SQL> conn scott/TIGERConnected.在將現(xiàn)有 Oracle 數(shù)據(jù)庫 10g 升級到 11g 時,可將口令移植到新標準??梢酝ㄟ^查詢 DBA_USERS 視圖來檢查口令狀態(tài),尤其是新的 PASSWORD_VERSIONS 列。
select username, password, password_versionsfrom dba_users;USERNAME PASSWORD PASSWORD------------------------- ------------------------------ --------SYSTEM 10G 11GSYS 10G 11GMGMT_VIEW 10G 11G您首先會注意到 PASSWORD 列為空,沒有像 Oracle 數(shù)據(jù)庫 10g 和以前的版本中那樣使用散列值填充。那么,口令出什么問題了?口令仍然存儲在數(shù)據(jù)庫中(在表 USER$ 中),但它在 DBA_USERS 視圖中不可見。當用戶被創(chuàng)建為全局或外部認證時,其狀態(tài)指示為 GLOBAL 或 EXTERNAL,但不顯示口令的散列值。
接下來,注意 PASSWORD_VERSIONS 列,它是 Oracle 數(shù)據(jù)庫 11g 中新增的。該列表明口令是否區(qū)分大小寫。值“10G 11G”的意思是,用戶要么是在 10g 中創(chuàng)建然后移植到 11g 中的,要么是直接在 11g 中創(chuàng)建的。
如果您希望的話,在創(chuàng)建口令文件時,您也可以輸入一個新參數(shù) ignorecase 來實現(xiàn) SYSDBA 口令的大小寫區(qū)分,如下所示:
$ orapwd file=orapwPRODB3 password=abc123 entries=10 ignorecase=n在以上示例中,SYSDBA 的口令將為 abc123,而不是 ABC123 或任何其他大小寫變體。
通過采用區(qū)分大小寫的口令,不僅使得強行破解口令更為困難,同時能夠使您滿足更多合規(guī)性要求。更為重要的是,您可以動態(tài)地執(zhí)行口令要求而不必關閉數(shù)據(jù)庫。在進行升級或因升級原有應用程序而對登錄問題進行調試時,這是非常有用的。
還記得 Oracle數(shù)據(jù)庫中的口令驗證功能嗎?很多人甚至可能都不知道它的存在,更不要說使用它了。該功能是快速、輕松地確保數(shù)據(jù)庫口令的質量 —例如,口令應當包含一定數(shù)目的字符,不應當與用戶名相同,等等。也許它的最佳特色在于它是內置的,您只需要啟用它即可。但很可能的是,您并沒有啟用該功能。
在 Oracle 數(shù)據(jù)庫 11g 中,口令管理功能具有新的經(jīng)過改進的驗證邏輯。如果您查看 $ORACLE_HOME/rdbms/admin 下的口令驗證文件 utlpwdmg.sql,您會發(fā)現(xiàn)腳本新建了一個名為 verify_fnction_11g 的口令函數(shù)。腳本末尾的語句如下所示:
ALTER PROFILE DEFAULT LIMITPASSWORD_LIFE_TIME 180PASSWORD_GRACE_TIME 7PASSWORD_REUSE_TIME UNLIMITEDPASSWORD_REUSE_MAX UNLIMITEDFAILED_LOGIN_ATTEMPTS 10PASSWORD_LOCK_TIME 1PASSWORD_VERIFY_FUNCTION verify_function_11G;腳本將該函數(shù)附加到概要文件 DEFAULT 中。除非明確分配了其他文件,該文件是所有用戶的默認概要文件。這使得認證符合許多規(guī)定的要求。您要做的只是運行該腳本以創(chuàng)建 11 g 版的口令檢查函數(shù),該腳本將通過將自身附加到默認概要文件中來啟用口令驗證功能。
審計是另一個常見難題。Oracle 數(shù)據(jù)庫包括強大的審計功能,可用于跟蹤用戶活動。大多數(shù)人由于擔心 I/O 爭用問題,并不利用審計功能。但事實上,一些審計可以被安全打開而風險卻很小。
相關的示例包括 CREATE SESSION,它在會話開始時編寫一條記錄,然后在會話結束時更新該記錄。該審計對 I/O 的影響極小,但帶來了眾多好處。
在 Oracle 數(shù)據(jù)庫 11g 中,進行了兩個簡單的改動以提供更強大的審計解決方案。首先,數(shù)據(jù)庫參數(shù) audit_trail 現(xiàn)在默認情況下設置為 DB,在以前的版本中,它的默認值為 NONE。這允許您對任何對象、語句或權限打開審計,而無需重復使用數(shù)據(jù)庫。
第二處改動是,默認情況下更多語句處于審計范圍內。清單如下:
ALTER SYSTEMSYSTEM AUDITCREATE SESSIONCREATE USERALTER USERDROP USERROLECREATE ANY TABLEALTER ANY TABLEDROP ANY TABLECREATE PUBLIC DATABASE LINKGRANT ANY ROLEALTER DATABASECREATE ANY PROCEDUREALTER ANY PROCEDUREDROP ANY PROCEDUREALTER PROFILEDROP PROFILEGRANT ANY PRIVILEGECREATE ANY LIBRARYEXEMPT ACCESS POLICYGRANT ANY OBJECT PRIVILEGECREATE ANY JOBCREATE EXTERNAL JOB如您所見,審計這些活動不會導致嚴重的 I/O 問題,因此,可將審計活動維持在可接受水平,同時對性能的影響最小。
這兩處改動帶來了一些強大的即需即用的審計功能。當然,它們只是一些數(shù)據(jù)庫參數(shù)和審計設置;如果需要的話,您可以輕松地關閉它們。但如果您看看這些語句清單,您實際上會發(fā)現(xiàn)即使在開發(fā)數(shù)據(jù)庫中,它們也是值得審計的。不過,您可能想對它們進行細微的調整。(例如,在數(shù)據(jù)倉庫中,用戶創(chuàng)建并刪除大量臨時表,因此審計 CREATE/DROP TABLE 可能會在審計線索中泛濫。)
(警告: 當您升級到 Oracle 數(shù)據(jù)庫 11g 時,默認情況下上述語句的審計將打開。因此,審計線索將寫入到 SYSTEM 表空間中的表 AUD$ 中,這些審計線索將迅速填充。密切關注該表空間。
由于各種新的法律法規(guī),人們現(xiàn)在對加密的重視程度越來越高。您需要以某種方式對數(shù)據(jù)進行加密,但最大的問題在于如何加密?
對于仍然使用 Oracle 數(shù)據(jù)庫 10g 第 1 版和以前版本的人來說,DBMS_CRYPTO 和 DBMS_OBFUSCATION_TOOLKIT 工具包允許您構建自己的加密框架。在 Oracle 數(shù)據(jù)庫 10g 第 2 版中,該框架通過透明數(shù)據(jù)加密特性得以增強。
透明數(shù)據(jù)加密使您可以對特定列進行加密,這足以滿足大多數(shù)要求。然而,性能仍然是該特性的一個問題(或者說,任何其他加密解決方案都存在著性能問題):索引范圍掃描不能應用于加密列,這會對性能造成嚴重的負面影響。
這正是 Oracle 數(shù)據(jù)庫 11g 中透明表空間加密的真正出色之處。當表空間聲明已加密時,表空間(包括透明表空間、備份等)上的任何數(shù)據(jù)都已加密,而不僅僅是單獨聲明為已加密的表。但在進行索引掃描時,掃描發(fā)生在未對數(shù)據(jù)進行加密的內存中,因而不會對性能造成影響。
感覺激動嗎?讓我們看一下它的工作原理。加密過程與透明數(shù)據(jù)加密過程相同:您需要創(chuàng)建一個錢夾以存儲主加密密鑰。如果您還沒有設置透明數(shù)據(jù)加密,則需要創(chuàng)建錢夾和密鑰。
首先,創(chuàng)建錢夾的文件位置;默認位置為 $ORACLE_BASE/admin/
接下來,執(zhí)行下面的語句以在錢夾中創(chuàng)建加密密鑰:
alter system set encryption key identified by "abcd1234!";該語句同時創(chuàng)建錢夾和密鑰。如果您現(xiàn)在檢查該目錄,您會看到剛剛創(chuàng)建的錢夾文件 (ewallet.p12)。
$ cd /home/oracle/app/admin/PRODB3/wallet$ lsewallet.p12錢夾要使用口令才能打開,在本例中,口令為 abcd1234!。該語句也可以打開錢夾。以后,您無需再創(chuàng)建錢夾了。數(shù)據(jù)庫啟動后,您只需通過執(zhí)行以下語句來打開錢夾:
alter system set wallet open identified by "abcd1234!"有關錢夾的更詳細的討論,請閱讀這篇 Oracle Magazine 文章。
現(xiàn)在創(chuàng)建表空間:
create tablespace secure1datafile ‘/home/oracle/oradata/PRODB3/secure1_01.dbf‘size 1Mencryption using ‘AES128‘default storage (encrypt)/子句“encryption using ... default storage(encrypt)”將表空間標記為經(jīng)過加密的。(注:我們對此表空間使用了 AES 128 位加密算法。其他選擇包括 Triple DES168 位密鑰算法、AES 192 位密鑰算法和 AES 256 位密鑰算法。)
既然已經(jīng)創(chuàng)建了表空間,您就可以像在常規(guī)表空間中那樣創(chuàng)建表了。
create table secure_transtablespace secure1asselect * from transwhere rownum < 201/create table secure_restablespace secure1asselect * from reswhere rownum < 201/上述語句在加密的表空間 SECURE1 中創(chuàng)建了表。為進行比較,以正常方式(不加密)創(chuàng)建另一個名為 INSECURE1的表空間,并在其中創(chuàng)建表 INSECURE_TRANS 和 INSECURE_RES。INSECURE_TRANS 和SECURE_TRANS 在結構和數(shù)據(jù)方面相同,但位于不同的表空間中。SECURE_RES 和 INSECURE_RES 也是如此。
現(xiàn)在更新這些表中的一個文本字段,以便在數(shù)據(jù)文件中搜索該字段:
update secure_trans set comments = ‘Transaction Comments‘;update insecure_trans set comments = ‘Transaction Comments‘;commit;通過使表空間先脫機再聯(lián)機,將內容強制寫到磁盤上:
alter tablespace secure1 offline;alter tablespace secure1 online;alter tablespace insecure1 offline;alter tablespace insecure1 online;此時,緩存中的數(shù)據(jù)已經(jīng)寫到磁盤上。搜索該字段,看會發(fā)生什么?
$ strings insecure1_01.dbf | grep TransactionTransaction Comments...該字符串以明文形式出現(xiàn)在數(shù)據(jù)文件中?,F(xiàn)在,對經(jīng)過加密的 SECURE1 表空間執(zhí)行同樣的操作。
$ strings secure1_01.dbf | grep Transaction$該操作不會返回任何結果,因為數(shù)據(jù)文件是加密的,您不會以明文形式看到各列的值。一切都完美無缺,但性能怎么樣呢?我們運行以下查詢來體驗一下。
select hotel_id, sum(amt)from secure_trans t, secure_res rwhere t.res_id = r.res_idgroup by hotel_id運行該查詢時,我們也會對其進行跟蹤。下面是跟蹤文件的節(jié)選。
call count cpu elapsed disk query current rows------- ------ -------- ---------- ---------- ---------- ---------- ----------Parse 1 0.00 0.00 0 0 0 0Execute 1 0.00 0.00 0 0 0 0Fetch 14 0.01 0.01 4 6 0 186------- ------ -------- ---------- ---------- ---------- ---------- ----------total 16 0.01 0.01 4 6 0 186Rows Row Source Operation------- ---------------------------------------------------186 HASH GROUP BY (cr=6 pr=4 pw=4 time=5 us cost=8 size=10400 card=200)200 HASH JOIN (cr=6 pr=4 pw=4 time=45 us cost=7 size=10400 card=200)200 TABLE ACCESS FULL SECURE_TRANS (cr=3 pr=2 pw=2 time=8 us cost=3 size=5200 card=200)200 TABLE ACCESS FULL SECURE_RES (cr=3 pr=2 pw=2 time=9 us cost=3 size=5200 card=200)現(xiàn)在,對 INSECURE_RES 和 INSECURE_TEST 運行相同的測試,它們處于正常的(未加密的)表空間內。
call count cpu elapsed disk query current rows------- ------ -------- ---------- ---------- ---------- ---------- ----------Parse 1 0.00 0.00 0 0 0 0Execute 1 0.00 0.00 0 0 0 0Fetch 14 0.00 0.01 4 6 0 186------- ------ -------- ---------- ---------- ---------- ---------- ----------total 16 0.01 0.01 4 6 0 186Rows Row Source Operation------- ---------------------------------------------------186 HASH GROUP BY (cr=6 pr=4 pw=4 time=4 us cost=8 size=10400 card=200)200 HASH JOIN (cr=6 pr=4 pw=4 time=46 us cost=7 size=10400 card=200)200 TABLE ACCESS FULL INSECURE_TRANS (cr=3 pr=2 pw=2 time=8 us cost=3 size=5200 card=200)200 TABLE ACCESS FULL INSECURE_RES (cr=3 pr=2 pw=2 time=9 us cost=3 size=5200 card=200)注意各例中的執(zhí)行時間,它們都是相似的。因解密而導致的 CPU 消耗也并不顯著。因此,表空間加密不會對性能產生影響。
DBA_TABLESPACES 視圖有一個新列 ENCRYPTED,該列用于顯示某個表空間是否已加密。此外,一個名為 V$ ENCRYPTED_TABLESPACES 的新視圖用于顯示針對該表空間啟用的加密類型。
SQL> desc v$encrypted_tablespacesName Null?Type----------------------------------------- -------- ------------TS# NUMBERENCRYPTIONALG VARCHAR2(7)ENCRYPTEDTS VARCHAR2(3)SQL> select * from v$encrypted_tablespaces;TS# ENCRYPT ENC---------- ------- ---5 AES128 YES該視圖可以和 V$TABLESPACE 視圖的 TS# 列結合,以獲得完整的信息。下面是該視圖的外觀:
SQL> desc v$tablespaceName Null?Type----------------------------------------- -------- ------------TS# NUMBERNAME VARCHAR2(30)INCLUDED_IN_DATABASE_BACKUP VARCHAR2(3)BIGFILE VARCHAR2(3)FLASHBACK_ON VARCHAR2(3)ENCRYPT_IN_BACKUP VARCHAR2(3)注意,ENCRYPT_IN_BACKUP 列和透明表空間加密沒有任何關系。相反,它是備份期間表空間的 RMAN 加密,是在 Oracle 數(shù)據(jù)庫 10g 第 2 版中引入的。
如您所見,透明表空間加密以一種相當完美的方式解決了兩個問題:它對磁盤上處于靜止狀態(tài)的數(shù)據(jù)進行加密,由于數(shù)據(jù)管理發(fā)生在 SGA 內,因此不會影響性能。
Oracle 數(shù)據(jù)庫 10g 引入了用于數(shù)據(jù)移動的最強大的特性之一:Data Pump,它用于代替原來的導出/導入工具。除了速度更快之外,Data Pump 還具有很多優(yōu)點,如并行化進程和重新映射表空間。在 Oracle 數(shù)據(jù)庫 11g 中,它還通過一個新參數(shù) ENCRYPTION 來幫助保護轉儲文件的安全。
轉儲文件位于數(shù)據(jù)庫和數(shù)據(jù)庫安全領域之外,并且包含潛在的敏感數(shù)據(jù)。在如今的安全意識環(huán)境中,它們構成了一組獨特的問題。在一些真正具有安全意識的環(huán)境中,DBA 在導出數(shù)據(jù)后通過第三方實用程序對轉儲文件進行加密 — 如果導出工作量巨大,這不是一個非常方便的方法。
首先,我們了解一下典型轉儲文件的易受攻擊程度。假設您有一個名為 TRANS 的表,它包含一個名為 COMMENTS 的列。該列中的值為“Transaction Comments”。如果您以正常方式導出該表:
$ expdp scott/tiger tables=trans dumpfile=insec.dmp directory=tmp_dir檢查轉儲文件以查看該列值是否存在:
$ strings /tmp/insec.dmp | grep Transaction將出現(xiàn)大量匹配項。轉儲文件中的數(shù)據(jù)未加密,處于明文狀態(tài)。
現(xiàn)在,使用新參數(shù) ENCRYPTION 執(zhí)行導出。您還必須指定要使用的算法類型。我們將使用 AES 128 位算法。
$ expdp scott/tiger tables=trans dumpfile=sec.dmp directory=tmp_dir encryption=data_only encryption_algorithm=aes128Export:Release 11.1.0.5.0 - Beta on Sunday, 22 July, 2007 18:17:30Copyright (c) 2003, 2007, Oracle.All rights reserved.Connected to:Oracle Database 11g Enterprise Edition Release 11.1.0.5.0 - BetaWith the Partitioning, Oracle Label Security, OLAP, Data Miningand Real Application Testing optionsStarting "SYS"."SYS_EXPORT_TABLE_01":在此 轉儲文件中搜索是否存在該文本字符串:
‘/******** AS SYSDBA‘ tables=scott.insecure_trans dumpfile=
sec.dmp directory=tmp_dir encryption=data_only encryption_algorithm=aes128Estimate in progress using BLOCKS method...Processing object type TABLE_EXPORT/TABLE/TABLE_DATATotal estimation using BLOCKS method:64 KBProcessing object type TABLE_EXPORT/TABLE/TABLE. . exported "SCOTT"."TRANS" 16.82 KB 200 rowsMaster table "SYS"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded******************************************************************************Dump file set for SYS.SYS_EXPORT_TABLE_01 is:/tmp/sec.dmpJob "SYS"."SYS_EXPORT_TABLE_01" successfully completed at 18:17:44
$ cat /tmp/sec.dmp | grep Transaction$由于轉儲文件中的值是經(jīng)過加密的,不是明文,因此不會出現(xiàn)任何匹配項。
“但是等一下”,您會說,“加密不需要密鑰嗎?我們將要使用的密鑰傳遞到什么地方了?更重要的是,解密時如果沒有密鑰如何解密呢?”
答案非常簡單:密鑰將來自于您在前面看到的透明表空間加密中使用的錢夾。您無需為了使用 Data Pump 加密而使用透明表空間加密特性,但您需要執(zhí)行相關步驟來創(chuàng)建錢夾。不必說,在加密和解密過程中,錢夾必須是打開的。
如果您熟悉 Data Pump 工具,您可能會想起一個類似的特性是通過參數(shù) ENCRYPTION_PASSWORD 實現(xiàn)的。現(xiàn)在,您可能想知道二者有何區(qū)別。
問得好。10g 版對那些處于透明數(shù)據(jù)加密狀態(tài)的列進行加密,而不是對整個轉儲文件進行加密。如果您不使用透明數(shù)據(jù)加密,就不會進行轉儲文件加密。在該工具的 11g版中,無論是否使用了透明數(shù)據(jù)加密,您都可以對轉儲文件進行加密。這會為您帶來更大的靈活性,同時具有一些實用價值。您可能不想對數(shù)據(jù)庫中的數(shù)據(jù)進行加密,原因有很多,性能和增加的安全性是最明顯的原因。但當數(shù)據(jù)位于數(shù)據(jù)庫領域之外時,您一定希望對它們進行加密。在這種情況下,Data Pump加密的威力就無可匹敵了。
您可能熟悉 UTL_TCP、UTL_HTTP 和 UTL_SMTP這些程序包,它們支持數(shù)據(jù)庫領域外的服務器之間的通信。例如,utl_tcp 用于在兩臺主機間建立 TCP/IP通信,而不是通過數(shù)據(jù)庫鏈接。類似地,utl_http 用于從 Web 服務器發(fā)出 http 請求,utl_smtp 用于在主機間進行 SMTP郵件呼叫。
開發(fā)人員偶爾會使用這些強大的工具 — 例如,使用 utl_smtp 從數(shù)據(jù)庫內發(fā)送郵件,使用 utl_http 提取可在 PL/SQL程序內處理的 Web 頁面等等。然而,這些工具帶來了巨大的安全風險。使用utl_tcp,數(shù)據(jù)庫用戶可以到達該主機可到達的任何其他計算機,甚至不會遇到系統(tǒng)提示。這曾是 Voyager蠕蟲的慣用伎倆,該病毒一年前剛騷擾過 Oracle 用戶社區(qū)。
為了消除這一風險,很多專家建議撤消“從公網(wǎng)執(zhí)行”這些程序包的權限。在我的“安全保護項目”系列文章中,我也推薦了這種方法。但如果開發(fā)人員出于合理原因希望執(zhí)行這些程序包,該怎么辦?
Oracle 數(shù)據(jù)庫 11g有一個新的解決方案:您可以將執(zhí)行權限程序包授予任何人,但要控制他們可以調用的資源。例如,utl_tcp 可限制為僅調用幾個 IP地址,這種機制稱為訪問控制列表 (ACL)。如果主機在 ACL 中,用戶可以在 utl_tcp 中使用;但是僅僅擁有對 utl_tcp的執(zhí)行權限是不夠的。因此,惡意進程不可能取代 utl_tcp 程序包和建立非法連接。
我們來看一下它的工作原理。首先,創(chuàng)建一個 ACL:
begindbms_network_acl_admin.create_acl (acl => ‘utlpkg.xml‘,description => ‘Normal Access‘,principal => ‘CONNECT‘,is_grant => TRUE,privilege => ‘connect‘,start_date => null,end_date => null);end;此處,參數(shù) principal => ‘CONNECT‘ 表示該 ACL 適用于 CONNECT 角色。您可以在此處定義一個用戶或角色。該 ACL 是作為一個 utlpkg.xml 文件創(chuàng)建的。
創(chuàng)建完畢后,您可以進行檢查以確保該 ACL 已增加:
SELECT any_pathFROM resource_viewWHERE any_path like ‘/sys/acls/%.xml‘;輸出結果如下:
ANY_PATH----------------------------------------------------------------------------/sys/acls/ANONYMOUS/ANONYMOUS3553d2be53ca40e040a8c0680777c_acl.xml/sys/acls/OLAP_XS_ADMIN/OLAP_XS_ADMIN3551b25f93feb8dde040a8c068075b7_acl.xml/sys/acls/OLAP_XS_ADMIN/OLAP_XS_ADMIN3551b25f944b8dde040a8c068075b7_acl.xml/sys/acls/OLAP_XS_ADMIN/OLAP_XS_ADMIN3551b25f948b8dde040a8c068075b7_acl.xml/sys/acls/OLAP_XS_ADMIN/OLAP_XS_ADMIN3551b25f94cb8dde040a8c068075b7_acl.xml/sys/acls/all_all_acl.xml/sys/acls/all_owner_acl.xml/sys/acls/bootstrap_acl.xml/sys/acls/ro_all_acl.xml/sys/acls/ro_anonymous_acl.xml/sys/acls/utlpkg.xml注意輸出結果中的最后一行,它顯示您剛剛創(chuàng)建的 ACL。接下來,為該 ACL 增加一個權限。在本示例中,您將嘗試將該 ACL 局限于用戶 SCOTT。您還可以定義開始和結束日期。
begindbms_network_acl_admin.add_privilege (acl => ‘utlpkg.xml‘,principal => ‘SCOTT‘,is_grant => TRUE,privilege => ‘connect‘,start_date => null,end_date => null);end;分配將受該 ACL 制約的主機以及其他詳細信息:
begindbms_network_acl_admin.assign_acl (acl => ‘utlpkg.xml‘,host => ‘www.proligence.com‘,lower_port => 22,upper_port => 55);end;在本示例中,您指定“用戶 SCOTT 只能調用主機 www.proligence.com,并且只能使用 22 到 55 端口。”現(xiàn)在讓我們來試一下:
SQL> grant execute on utl_http to scott2 /Grant succeeded.SQL> conn scott/tigerConnected.SQL> select utl_http.request(‘http://www.proligence.com‘) from dual;select utl_http.request(‘http://www.proligence.com‘) from dual*ERROR at line 1:ORA-29273:HTTP request failedORA-06512:at "SYS.UTL_HTTP", line 1577ORA-24247:network access denied by access control list (ACL)ORA-06512:at line 1注意錯誤“ORA-24247:network access denied by access control list (ACL)”。用戶在端口 80 上調用 http 服務器,由于該服務器在允許的 22-55 范圍之外,因此該操作被阻止。
現(xiàn)在,添加另一條規(guī)則以允許該通信:
1 begin2 dbms_network_acl_admin.assign_acl (3 acl => ‘utlpkg.xml‘,4 host => ‘www.proligence.com‘,5 lower_port => 1,6 upper_port => 10000);7* end;8 /PL/SQL procedure successfully completed.SQL> conn scott/tigerConnected.SQL> select utl_http.request(‘http://www.proligence.com‘) from dual;UTL_HTTP.REQUEST(‘HTTP://WWW.PROLIGENCE.COM‘)--------------------------------------------------------------------------------</iframe><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE>Proligence Home</TITLE><META http-equiv=Content-Language content=en-us>...但該規(guī)則僅適用于 www.proligence.com。如果您調用其他 Web 站點,調用將失敗,錯誤原因仍為ORA-24247。這是最細粒度水平上的安全性。如果您的企業(yè)需要連接到主機www.proligence.com,您可以在允許該連接的同時阻止對任何其他主機的訪問,從而防止惡意用戶使用該功能來訪問所有其他的主機。
要了解 ACL 的詳細信息,請查詢 DBA_NETWORK_ACLS 視圖:
select host, lower_port, upper_port, acl, aclidfrom dba_network_aclswhere ACL=‘/sys/acls/utlpkg.xml‘;HOST---------------------------------------LOWER_PORT UPPER_PORT---------- ----------ACL---------------------------------------ACLID--------------------------------prolin3.proligence.com80 100/sys/acls/utlpkg.xml35D4278980DE6407E040A8C0680037D6... and so on ...在我看來,這是 Oracle 數(shù)據(jù)庫 11g 最好的新安全特性之一。
在許多組織中,臨時或 QA數(shù)據(jù)庫都會經(jīng)常根據(jù)生產數(shù)據(jù)庫進行刷新,從而允許開發(fā)人員在投入生產前針對數(shù)據(jù)庫運行生產前代碼。然而,該過程存在潛在的安全問題 —當數(shù)據(jù)從生產數(shù)據(jù)庫刷新到 QA數(shù)據(jù)庫以保持同步時,可能會泄露敏感的數(shù)據(jù)元素。為了應對該風險,很多組織在非生產數(shù)據(jù)庫中將敏感數(shù)據(jù)更換為某些無意義的值,這種做法稱為數(shù)據(jù)屏蔽。例如,您可能希望臨時用一個隨機的 9 個字符的編號來更新社會保險編號,從而屏蔽真實的 SSN。
進行設想是很容易的,但進行更改可能就難了 — 您必須編寫 SQL 腳本,確保進程是可重新啟動的,小心避免系統(tǒng)崩潰等等。導入數(shù)據(jù)時,為什么不讓 Oracle 來處理上述事宜呢?在 Oracle 數(shù)據(jù)庫 11g 中,Data Pump 有一個新參數(shù) remap_data,用于在導入過程中更改數(shù)據(jù)。
首先創(chuàng)建一個重映射函數(shù):
create or replace package pkg_maskasfunction fn_mask_ssn (p_in varchar2) return varchar2;end;/create or replace package body pkg_maskasfunction fn_mask_ssn (p_in varchar2)return varchar2isbeginreturn lpad (round(dbms_random.value (001000000,999999999)),9,0);end;end;/該函數(shù)接受一個 varchar 變量,返回 9 個字符。我們將使用該函數(shù)來屏蔽 SSN。ACCOUNTS 表如下所示。
SQL> select * from rates;ACC_NO ACC_NAME ACC_SSN---------- ------------------------------ ---------1 John Smith 1234567892 Jane Doe 234567890您要屏蔽 ACC_SSN 列,它是帳戶持有者的 SSN。您使用 Data Pump 導出該表。導出時,您使用新參數(shù) remap_data 屏蔽導出轉儲文件中的數(shù)據(jù)。
$ expdp scott/tiger tables=scott.accounts dumpfile=accounts.dmp directory=tmp_dirremap_data=accounts.acc_ssn:pkg_mask.fn_mask_ssn該參數(shù)將重映射函數(shù) fn_mask_ssn 中生成的值放到 pkg_mask 程序包中。注意該參數(shù)的格式。它遵循以下模式:
[<SchemaName>.]<TableName>.<ColumnName>:[<SchemaName>.]<PackageName>.<FunctionName>
<ColumnName> 是您要屏蔽的值所屬列的名稱。實際的重映射邏輯位于 <PackageName>.<FunctionName> 內。現(xiàn)在,您可以將表導入到非生產數(shù)據(jù)庫中。導入完成后,如果您檢查該表的值:
SQL> select * from rates;ACC_NO ACC_NAME ACC_SSN---------- ------------------------------ ---------1 John Smith 6452708612 Jane Doe 538996590注意各個 ACC_SSN 值是如何變化的。這些值是由我們在前面編寫并儲存在導出轉儲文件中的重映射函數(shù) pkg_mask.fn_mask_ssn 生成的。當我們導入時,該值就被導入了。
如果您已經(jīng)導出了表但沒有使用該 remap_data 參數(shù),則轉儲文件中的值已經(jīng)是準確值。您可以在導入時屏蔽這些值,仍然使用這個神奇的參數(shù)。
$ impdp scott/tiger dumpfile=accounts.dmp remap_data=我們在此處使用了一個隨機值函數(shù),我們還可以使用任何其他邏輯。例如,假設要求將 SSN 除后四位之外的所有數(shù)字全部用 X 代替。這也很簡單。您只需編寫一個類似于下面的函數(shù):
accounts.acc_ssn:pkg_mask.fn_mask_ssn directory=tmp_dir tables=accounts
create or replace package pkg_maskasfunction fn_mask_ssn (p_in varchar2) return varchar2;end;/create or replace package body pkg_maskasfunction fn_mask_ssn (p_in varchar2)return varchar2isbeginreturn;‘XXXXX‘||substr (p_in,6,4);end;end;/打包的函數(shù)也是可重用的;它可用于對任何列的任何導入中。屏蔽數(shù)據(jù)的方法多種多樣無窮無盡 — 只要您能創(chuàng)建一個可以返回一個值的函數(shù),您就可以用它來屏蔽該值。這就減少了您的開發(fā)和維護任務,同時使得從生產數(shù)據(jù)庫向非生產數(shù)據(jù)庫進行安全的數(shù)據(jù)刷新成為可能。
在以前的版本中,大多數(shù)安全操作是通過一個名叫 Oracle Security Manager 的工具進行的。在 Oracle 數(shù)據(jù)庫 11g 中,Oracle 企業(yè)管理器包括用于執(zhí)行這些任務的所有工具。下面是數(shù)據(jù)庫主頁上 Server 選項卡的屏幕截圖。注意右下方名為 Security 的部分。
聯(lián)系客服