Oracle的審計(jì)是一個(gè)事后的工作,即數(shù)據(jù)庫出現(xiàn)安全問題后,為了定位、發(fā)現(xiàn)問題的根源,可以通過審計(jì)追根溯源。Oracle審計(jì)主要包含以下3個(gè)部分:
Trigger-based Auditing(觸發(fā)器)
Auditing the sys User-(SYS用戶審計(jì))
Standard Auditing (標(biāo)準(zhǔn)審計(jì))
觸發(fā)器審計(jì)
下面是一個(gè)觸發(fā)器審計(jì)的例子,一旦emp表的sal字段的值增大超過1.1倍,就在審計(jì)表emp_sal_audit里記錄該次操作。
CREATE TRIGGER trg_a_idu_r_emp_sal
AFTER INSERT OR DELETE OR UPDATE OF sal ON emp
FOR EACH ROW
BEGIN
IF (:NEW.sal > :OLD.sal * 1.10)
THEN INSERT INTO emp_sal_audit VALUES (:OLD.empno
,:OLD.sal
,:NEW.sal
,user
,sysdate);
END IF;
END;
/
SYS用戶的審計(jì)
對SYS用戶的審計(jì)比較特殊,因?yàn)镾YS用戶的權(quán)限太大,它的審計(jì)信息不能存儲(chǔ)在數(shù)據(jù)庫里,否則SYS可以隨意修改審計(jì)信息,因此sys用戶審計(jì)日志寫到操作系統(tǒng)日志中。
下面是一個(gè)例子:
1)首先啟動(dòng)對SYS用戶的審計(jì)
SQL> alter system set audit_sys_operations = true scope = spfile;
系統(tǒng)已更改。
2)由SYS用戶向測試表插入一條數(shù)據(jù)
SQL> show user
USER 為 "SYS"
SQL> insert into test.t (object_id) values(1);
已創(chuàng)建 1 行。
SQL> commit;
提交完成。
3)在操作系統(tǒng)日志中可以看到如下信息:
Audit trail: LENGTH : '176' ACTION :[7] 'CONNECT' DATABASE USER:[1] '/' PRIVILEGE :[6] 'SYSDBA' CLIENT USER:[12] 'CORP\xianzhu' CLIENT TERMINAL:[14] 'L-SHC-00436132' STATUS:[1] '0' DBID:[10] '1327298419' .
標(biāo)準(zhǔn)審計(jì)
標(biāo)準(zhǔn)審計(jì)根據(jù)對象不同,可以分為以下4個(gè)部分:
審計(jì)會(huì)話
審計(jì)對象
審計(jì)操作
審計(jì)授權(quán)
下面以審計(jì)對象為例:
1)首先,開啟標(biāo)準(zhǔn)審計(jì)
SQL> ALTER SYSTEM SET AUDIT_TRAIL = DB,EXTENDED SCOPE = SPFILE;
系統(tǒng)已更改。
SQL> audit select, insert, update, delete on test.t;
審計(jì)已成功。
2)在表上做DML操作
SQL> delete from test.t;
已刪除72768行。
SQL> insert into t (object_id) values(1);
已創(chuàng)建 1 行。
SQL> commit;
提交完成。
3)在審計(jì)表里查看相應(yīng)審計(jì)信息
SQL> col userid for a10
SQL> col obj$name for a10
SQL> col sqltext for a40
SQL> select userid,obj$name,sqltext from sys.aud$ where userid='TEST' and obj$name='T';
USERID? ? OBJ$NAME? SQLTEXT
---------- ---------- ----------------------------------------
TEST? ? ? T? ? ? ? ? delete from test.t
TEST? ? ? T? ? ? ? ? insert into t (object_id) values(1)
步驟
第1步:查看審計(jì)功能是否開啟?
SQL> show parameter audit;
NAME?????????????????????????????????TYPE????????VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest???????????????????string??????/u01/app/oracle/admin/ORCL/adump
audit_sys_operations??????boolean?????FALSE
audit_syslog_level????????????string
audit_trail????????????????????????? ??string??????NONE
audit_trail 的value值為NONE表示不開啟;
audit_trail 的value值為FALSE表示不開啟;
audit_trail 的value值為DB表示開啟;
audit_trail 的value值為TURE表示開啟;
audit_trail 的value值為OS表示審計(jì)記錄寫入一個(gè)操作系統(tǒng)文件(不是特別理解);
第2步:開啟審計(jì)功能
SQL> alter system set audit_sys_operations=TRUE scope=spfile;--審計(jì)管理用戶(以sysdba/sysoper角色登陸)
SQL> alter system set audit_trail=db,extended scope=spfile;
重啟實(shí)例
第3步:關(guān)閉審計(jì)功能
SQL> conn /as sysdba
SQL> show parameter audit
SQL> alter system set audit_trail = none?scope=spfile;
重啟實(shí)例
Oracle使用大量不同的審計(jì)方法來監(jiān)控使用何種權(quán)限,以及訪問哪些對象。審計(jì)不會(huì)防止使用這些權(quán)限,但可以提供有用的信息,用于揭示權(quán)限的濫用和誤用。
審計(jì)類型說明
語句審計(jì)? ? ?按照語句類型審計(jì)SQL語句,而不論訪問何種特定的模式對象。也可以在數(shù)據(jù)庫中指定一個(gè)或多個(gè)用戶,針對特定的語句審計(jì)這些用戶
權(quán)限審計(jì)? ? ?審計(jì)系統(tǒng)權(quán)限,例如CREATE TABLE或ALTER INDEX。和語句審計(jì)一樣,權(quán)限審計(jì)可以指定一個(gè)或多個(gè)特定的用戶作為審計(jì)的目標(biāo)
模式對象審計(jì)? ? ?審計(jì)特定模式對象上運(yùn)行的特定語句(例如,DEPARTMENTS表上的UPDATE語句)。模式對象審計(jì)總是應(yīng)用于數(shù)據(jù)庫中的所有用戶
細(xì)粒度的審計(jì)? ? 根據(jù)訪問對象的內(nèi)容來審計(jì)表訪問和權(quán)限。使用程序包DBMS_FGA來建立特定表上的策略
audit_sys_operations:
默認(rèn)為false,當(dāng)設(shè)置為true時(shí),所有sys用戶(包括以sysdba,sysoper身份登錄的用戶)的操作都會(huì)被記錄,audit trail不會(huì)寫在aud$表中,這個(gè)很好理解,如果數(shù)據(jù)庫還未啟動(dòng)aud$不可用,那么像conn /as sysdba這樣的連接信息,只能記錄在其它地方。如果是windows平臺(tái),audti trail會(huì)記錄在windows的事件管理中,如果是linux/unix平臺(tái)則會(huì)記錄在audit_file_dest參數(shù)指定的文件中。
audit_trail:
None:是默認(rèn)值,不做審計(jì);
DB:將audit trail 記錄在數(shù)據(jù)庫的審計(jì)相關(guān)表中,如aud$,審計(jì)的結(jié)果只有連接信息;
DB,Extended:這樣審計(jì)結(jié)果里面除了連接信息還包含了當(dāng)時(shí)執(zhí)行的具體語句;
OS:將audit trail 記錄在操作系統(tǒng)文件中,文件名由audit_file_dest參數(shù)指定;
XML:10g里新增的。
10g Values:
none
Disables database auditing.
os
Enables database auditing and directs all audit records to the operating system's audit trail.
db
Enables database auditing and directs all audit records to the database audit trail (theSYS.AUD$table).
db,extended
Enables database auditing and directs all audit records to the database audit trail (theSYS.AUD$table). In addition, populates theSQLBINDandSQLTEXTCLOB columns of theSYS.AUD$table.
xml
Enables database auditing and writes all audit records to XML format OS files.
xml,extended
Enables database auditing and prints all columns of the audit trail, including SqlText and SqlBind values.
注: 參數(shù)AUDIT_TRAIL不是動(dòng)態(tài)的,為了使AUDIT_TRAIL參數(shù)中的改動(dòng)生效,必須關(guān)閉數(shù)據(jù)庫并重新啟動(dòng)。在對SYS.AUD$表進(jìn)行審計(jì)時(shí), 應(yīng)該注意監(jiān)控該表的大小,以避免影響SYS表空間中其他對象的空間需求。推薦周期性歸檔SYS.AUD$中的行,并且截取該表。Oracle提供了角色 DELETE_CATALOG_ROLE,和批處理作業(yè)中的特殊賬戶一起使用,用于歸檔和截取審計(jì)表。
audit_file_dest:Audit_trail=OS時(shí) 文件位置
審計(jì)的觸發(fā)條件
?根據(jù)語句執(zhí)行是否成功進(jìn)行審計(jì)
不管是語句,權(quán)限和對象都可以根據(jù)語句執(zhí)行是否成功在審計(jì)語句后面加判斷詞,語法如下:
在審計(jì)語句后面加WHENEVER SUCCESSFUL or WHENEVER NOT SUCCESSFUL
如:
AUDIT CREATE TABLE WHENEVER NOT SUCCESSFUL;
AUDIT TRUNCATE TABLE WHENEVER NOT SUCCESSFUL;
根據(jù)指定用戶進(jìn)行審計(jì)
在做語句和權(quán)限進(jìn)行審計(jì)的時(shí)候可以在審計(jì)語句后面加by再加指定用戶名,多個(gè)用戶用逗號隔開,例如下面語句為開啟對scott,blake兩個(gè)用戶的所有select table和update table權(quán)限
AUDIT SELECT TABLE, UPDATE TABLE? BY scott, blake;
AUDIT SELECT TABLE, UPDATE TABLE? BY scott, blake;
審計(jì)相關(guān)的視圖
可以通過dba_views查看所有相關(guān)的視圖
select * from dba_views where view_name like '%AUDIT%'
最常用的視圖如下:
---審計(jì)系統(tǒng)視圖
select? *? from? STMT_AUDIT_OPTION_MAP? ? -- 審計(jì)選項(xiàng)類型代碼
select? *? from? AUDIT_ACTIONS? ? -- action代碼
select? *? from? ALL_DEF_AUDIT_OPTS? ? -- 對象創(chuàng)建時(shí)默認(rèn)的對象審計(jì)選項(xiàng)
---三種審計(jì)已啟用審計(jì)選項(xiàng)
select? *? from? DBA_STMT_AUDIT_OPTS? ? -- 當(dāng)前數(shù)據(jù)庫系統(tǒng)審計(jì)選項(xiàng)
select? *? from? DBA_PRIV_AUDIT_OPTS? ? -- 當(dāng)前權(quán)限審計(jì)選項(xiàng)
select? *? from? DBA_OBJ_AUDIT_OPTS? ? ---查看當(dāng)前審計(jì)了哪些對象
---審計(jì)結(jié)果,也可以直接查詢sys.aud$表
select? *? from? DBA_AUDIT_TRAIL? ---查看審計(jì)記錄,調(diào)用的sys.aud$表
select? *? from? DBA_AUDIT_OBJECT? ---查看對象審計(jì)記錄
select? *? from? DBA_AUDIT_SESSION? -- session審計(jì)記錄
select? *? from? DBA_AUDIT_STATEMENT? -- 查看語句審計(jì)記錄
select? *? from? DBA_AUDIT_EXISTS? ? -- 使用BY AUDIT NOT EXISTS選項(xiàng)的審計(jì)
select? *? from? DBA_AUDIT_POLICIES? ? -- 審計(jì)POLICIES
select? *? from? DBA_COMMON_AUDIT_TRAIL? -- 標(biāo)準(zhǔn)審計(jì)+精細(xì)審計(jì)記錄