教你如何成為Oracle 10g OCP - 第二十章 安全

tolywang發表於2010-10-20


20.1 審計

Oracle的審計功能非常強大,分為5個層次: 強制審計,標準資料庫審計,
基於值的審計,精細化審計以及對DBA的審計 。

20.1.1  強制審計

這種審計始終生效,只要以sysdba登入,就會對此進行記錄,資訊包括何時,
哪個使用者哪個客戶端登入到庫中。

這種審計在DB關閉時也生效,所以它不是記錄在DB表中,而是在作業系統檔案
中,對linux或unix而言,則由初始化引數audit_file_dest的值決定,

SQL> show parameter audit_file_dest

NAME              TYPE     VALUE
------------     ------ ----------- ---------------------------
audit_file_dest   string      /u01/product/admin/mxdell/adump


mxrac01$ls 
ora_12893.aud  ora_15393.aud  ora_19054.aud  ora_23252.aud

上面這些檔案都是以sysdba登陸後產生的,名稱為ora_程式號.aud 。 

而對於windows來說,強制審計資訊記錄在事件檢視器中,沒有記錄在aud
檔案中。

 

20.2 標準資料庫審計

預設情況下 audit_trail= NONE,是靜態引數,修改需要重新啟動DB生效 。

AUDIT_TRAIL = { db | os | none | true | false | db_extended }

none or false
Disables database auditing.

os
Enables database auditing and directs all audit records to the
operating system's audit trail. 如果是windows, 放在event log中。

db or true
Enables database auditing and directs all audit records to the
database audit trail (the SYS.AUD$ table). 資訊放在DB中,可
透過表SYS.AUD$或dba_audit_trail檢視查詢。

db_extended
Enables database auditing and directs all audit records to the
database audit trail (the SYS.AUD$ table). In addition, populates
the SQLBIND and SQLTEXT CLOB columns of the SYS.AUD$ table.

XML
審計資訊寫入xml檔案中,檔案位於引數指定路徑,透過v$xml_audit_trail
可以查詢xml檔案資訊。

 


審計選項(audit option) 表示審計內容。我們透過以下4個方面進行設定:

1. 審計範圍,預設為by session,如果當前session執行了審計的SQL命令,
則記錄一次審計資訊,如果下次還是相同型別的SQL,則不記錄,所以生成
資料量較小,如果by access為單位,則每次都記錄要審計的SQL命令,記錄
的審計資訊量比較大。預設為by session .

2. 審計型別: 指定對執行成功的語句進行審計還是對執行失敗的語句進行,
或者不管怎樣都記錄。預設是成功或失敗都記錄。

3. 審計特定使用者,只有特定使用者執行了要審計的SQL命令才記錄,其他不記錄,
比如HR使用者。

4. 審計內容: 包括對SQL審計,對系統許可權進行審計,或對物件許可權進行審計。

在啟用審計時,必須設定審計內容,即必須說明要審計的SQL語句,系統許可權,
還是審計物件許可權,這叫做審計選項。 其他幾個審計方面都有預設值。可以
不用設定。 具體設定如下:

A. 審計SQL語句
例子:  SQL> audit table by hr ;
表示使用者HR執行和表有關的命令,只要成功,就會進行審計。可以查詢
dba_audit_trail 。 關閉審計選項: SQL>noaudit table ;
啟用對session的登陸進行跟蹤。
SQL> audit session ;

B. 審計系統許可權
例子:
SQL> audit select any table by hr ;
SQL> noaudit select any table by hr ;  (關閉)
注意: 如果HR訪問自己使用者下的表是不會有審計記錄的。


B. 審計物件許可權 
例子:
SQL> audit select on hr.credit_card_info by access ;
SQL> audit select on hr.credit_card_info by session ;
SQL> noaudit select on hr.credit_card_info ;  (關閉)
我們也可以審計DML操作:
SQL> audit insert on hr.credit_card_info by session ;
SQL> audit update on hr.credit_card_info by session ;
SQL> audit delete on hr.credit_card_info by session ;

 


20.1.3 基於值的審計

標準審計中,只是記錄使用者做過啥,不能記錄變化前後的值,基於值的審計
可以記錄操作前後的實際值,原理上講,這種審計方法是透過觸發器完成的,
需要使用者自己編寫程式。   所以這種方式可能對系統效能有一些影響,不過
記錄的審計資訊要多很多。

例子: 略,需要自己建立trigger .

 


20.1.4  精細化審計

前面討論的都是針對某種操作進行審計,如果需要審計更新某些行,其他行的
更新不需要審計,或者查詢的某些列需要審計。 Oracle根據此需要提供了精細
化審計(Fined-Grained Auditing,FGA),該功能從Oracle9i引入。

精細化審計是透過DBMS_FGA包來實現的,並將審計的資料內容作為一個策略,在
資料庫中進行定義,審計資訊記錄在資料字典fga_log$中,可以查詢檢視
dba_fga_audit_trail 來查詢審計資料 。 
例子:
begin
   dbms_fga.add_policy(
     object_schema=>'HR',
     object_name=>'employees',
     policy_name=>'audit_emps_salary',
     audit_condition=>'department_id=100', -- 滿足條件的需要審計
     audit_column=>'SALARY', -- 滿足條件的需要審計
     enable=>'true',
     statement_types=>'SELECT,UPDATE'  -- 操作型別審計 
 );
end ;
/

刪除審計策略:
SQL> exec dbms_fga.drop_policy('HR','EMPLOYEES','audit_emps_salary') ;

 

 

20.1.5  對DBA的審計

前面的所有審計對sys使用者都不生效,我們如果需要對SYS使用者進行審計,那麼需要
設定引數 audit_sys_operations=true , 重啟例項生效,因為sys在DB關閉時也能
對資料庫操作,對於sys的審計資訊不能放在資料字典表中,需要audit_file_dest
路徑下的檔案記錄。

SQL> alter system set audit_sys_operations=true scope=spfile ;
重新啟動資料庫。
以SYS執行命令,然後在adump目錄下找到相關aud 檔案即可。

 

 

20.2  虛擬專用資料庫(VPD, Virtual Private Database)

VPD, 即透過設定資料庫,讓不同使用者只能檢視錶中的部分資料,VPD分為兩個級別:

行級別: 控制某些使用者只能查詢某些行,比如銷售人員只能查詢自己的銷售資料。
列級別: 控制某些使用者不能查詢某些列的值,比如Salary.

20.2.1  基於行的VPD

基於行的VPD也是精細化訪問控制(FGAC: Fined Grained Access Control)透過定義
規則實現,規則集合叫做FGAC政策。 如果對某個表設定了FGAC, 當使用者發出查詢後
DML時,Oracle會根據定義的策略,自動改寫SQL, 自動新增where條件。

在使用FGAC,會涉及到一個資料庫物件:應用程式上下文(Application Context),可以
理解為資料庫中每個session的全域性環境變數,比如對於表sals_list,我們建立一個
應用程式上下文,將使用者ID號作為屬性放入應用程式上下文中,然後在定義FGAC的時候
將該使用者ID取出作為限定條件短語,返回給Oracle .

具體例子參考 P415 .

 

20.2.2 基於列的VPD
某些敏感資料列比如工資,可以透過建立基於列的VPD, 遮蔽敏感列資料。
和基於行的VPD一樣,設定FGAC政策。我們還需要指定兩個引數來設定要遮蔽
的列名,比如sec_relevant_cols,多列以逗號隔開,sec_relevant_cols_opt
設定為all_rows, 表示對錶中所有記錄都遮蔽salary列 。

具體例子參考 P417 .

 


20.3 透明資料加密(TDE) 

VPD阻止不了使用者對資料檔案的直接訪問。Oracle10g推出的透明資料加密(Transparent
Database Encryption), 加密方法內嵌在資料庫中,簡化了過程。透過使用TDE, 應用
程式不需要進行任何修改,當資料插入表的時候,Oracle在把資料寫入磁碟前,自動對
資料進行加密,下次查詢時候自動解密。 加密的同時對相關索引條目也進行了加密。

不過雖然對資料進行了加密,但是如果使用者登陸DB檢視的話,還是可以看到資訊的,那麼
TDE不能代替其他的安全措施, 需要和VPD等其他安全手段結合使用。

使用 TDE時,需要藉助“錢包”(wallet), 加密解密都需要呼叫存放了加密金鑰的檔案。

只需要簡單幾步實現對TDE的使用。

A. 指定錢包所在路徑, 可以透過圖形介面Oracle Wallet Mananger來實現。可以輸入owm
   開啟圖形介面,或者也可以編輯sqlnet.ora指定目錄。 預設錢包路徑在admin/SID/wallet下。
B. 建立錢包 SQL> alter system set encryption key identified by "" ;
C. 開啟錢包,具體方式參考P420 .

 

20.4 對備份進行加密
Oracle10g中可以使用3種方式對RMAN備份進行加密。

A. 透明加密模式 : 預設的,藉助錢包實現。
B. 基於密碼的加密模式,備份前指定密碼,恢復時提供密碼才能繼續。
例子:
RMAN >set encryption on identified by "passwordxxxx"  only ; 
RMAN >backup tablespace users ; 
RMAN >set encryption identified by "passwordxxxx" ; (恢復前)
C. 混合加密模式: 同時使用錢包和密碼。

對備份進行加密時,只能對備份集進行加密,不能對映象副本加密。
詳細設定參考 P422 .

 

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

相關文章