ORACLE資料庫標準審計
1、什麼是審計
審計(Audit)用於監視使用者所執行的資料庫操作,並且Oracle會將審計跟蹤結果存放到OS檔案(預設位置為$ORACLE_BASE/admin/$ORACLE_SID/adump/)或資料庫(儲存在system表空間中的 SYS.AUD$表中,可通過檢視dba_audit_trail檢視)中。預設情況下審計是沒有開啟的。
不管你是否開啟資料庫的審計功能,以下這些作業系統會強制記錄:用管理員許可權連線Instance;啟動資料庫;關閉資料庫。
2、和審計相關的兩個主要引數
AUDIT_SYS_OPERATIONS
AUDIT_SYS_OPERATIONS enables or disables the auditing of operations issued by user SYS, and users connecting with SYSDBA or SYSOPER privileges. The audit records are written to the operating system's audit trail. The audit records will be written in XML format if the AUDIT_TRAIL initialization parameter is set to XML.
AUDIT_TRAIL
AUDIT_TRAIL enables or disables database auditing.
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 (the SYS.AUD$ table).
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
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.
You can use the SQL statement AUDIT to set auditing options regardless of the setting of this parameter.
注:這兩個引數是static引數,需要重新啟動資料庫才能生效。
3、審計級別
當開啟審計功能後,可在三個級別對資料庫進行審計:Statement(語句)、Privilege(許可權)、object(物件)。
Statement:
按語句來審計,比如audit table 會審計資料庫中所有的create table,drop table,truncate table語句,alter session by cmy會審計cmy使用者所有的資料庫連線。
Privilege:
按許可權來審計,當使用者使用了該許可權則被審計,如執行grant select any table to a,當執行了audit select any table語句後,當使用者a 訪問了使用者b的表時(如select * from b.t)會用到select any table許可權,故會被審計。注意使用者是自己表的所有者,所以使用者訪問自己的表不會被審計。
Object:
按物件審計,只審計on關鍵字指定物件的相關操作,如aduit alter,delete,drop,insert on cmy.t by scott; 這裡會對cmy使用者的t表進行審計,但同時使用了by子句,所以只會對scott使用者發起的操作進行審計。注意Oracle沒有提供對schema中所有物件的審計功能,只能一個一個物件審計,對於後面建立的物件,Oracle則提供on default子句來實現自動審計,比如執行audit drop on default by access;後,對於隨後建立的物件的drop操作都會審計。但這個default會對之後建立的所有資料庫物件有效,似乎沒辦法指定只對某個使用者建立的物件有效,想比 trigger可以對schema的DDL進行“審計”,這個功能稍顯不足。
4、審計的一些其他選項
by access / by session:
by access 每一個被審計的操作都會生成一條audit trail。
by session 一個會話裡面同型別的操作只會生成一條audit trail,預設為by session。
whenever [not] successful:
whenever successful 操作成功(dba_audit_trail中returncode欄位為0) 才審計,
whenever not successful 反之。省略該子句的話,不管操作成功與否都會審計。
5、和審計相關的檢視
dba_audit_trail:儲存所有的audit trail,實際上它只是一個基於aud$的檢視。
其它的檢視dba_audit_session,dba_audit_object, dba_audit_statement都只是dba_audit_trail的一個子集。
dba_stmt_audit_opts:可以用來檢視statement審計級別的audit options,即資料庫設定過哪些statement級別的審計。
dba_obj_audit_opts,dba_priv_audit_opts檢視功能與之類似
all_def_audit_opts:用來檢視資料庫用on default子句設定了哪些預設物件審計。
6、取消審計
將對應審計語句的audit改為noaudit即可,如audit session whenever successful對應的取消審計語句為noaudit session whenever successful;
7、10g中的審計告知一切
Oracle 資料庫 10g 審計以一種非常詳細的級別捕獲使用者行為,它可以消除手動的、基於觸發器的審計。
假定使用者 Joe 具有更新那張表的許可權,並按如下所示的方式更新了表中的一行資料:
update SCOTT.EMP set salary = 12000 where empno = 123456;
您如何在資料庫中跟蹤這種行為呢?在 Oracle 9i 資料庫及其較低版本中,審計只能捕獲“誰”執行此操作,而不能捕獲執行了“什麼”內容。例如,它讓您知道 Joe 更新了 SCOTT 所有的表EMP,但它不會顯示他更新了該表中員工號為 123456 的薪水列。它不會顯示更改前的薪水列的值 — 要捕獲如此詳細的更改,您將不得不編寫您自己的觸發器來捕獲更改前的值,或使用 LogMiner 將它們從存檔日誌中檢索出來。
細粒度審計(FGA),是在 Oracle 9i 中引入的,能夠記錄 SCN 號和行級的更改以重建舊的資料,但是它們只能用於 select 語句,而不能用於 DML,如 update 、insert 和delete 語句。因此,對於 Oracle 資料庫 10g 之前的版本,使用觸發器雖然對於以行級跟蹤使用者初始的更改是沒有吸引力的選擇,但它也是唯一可靠的方法。
如果在命令後面新增by user則只對user的操作進行審計,如果省去by使用者,則對系統中所有的使用者進行審計(不包含sys使用者).
例:
AUDIT DELETE ANY TABLE; --審計刪除表的操作
AUDIT DELETE ANY TABLE WHENEVER NOT SUCCESSFUL; --只審計刪除失敗的情況
AUDIT DELETE ANY TABLE WHENEVER SUCCESSFUL; --只審計刪除成功的情況
AUDIT DELETE,UPDATE,INSERT ON user.table by test; --審計test使用者對user.table的delete,update,insert操作
9、精細審計
9.1、建立審計標記
SQL> exec dbms_fga.add_policy(object_schema=>'ryan',object_name=>'test',policy_name=>'chk_test',
statement_types=>'select');
9.2、開啟審計
SQL> exec DBMS_FGA.ENABLE_POLICY(object_schema=>'ryan' ,object_name=>'test' ,policy_name=>'chk_test');
9.3、檢視審計記錄
SQL> conn system/811226@ryan123
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as system
SQL> SELECT session_id,TIMESTAMP,db_user,os_user,userhost,sql_text FROM Dba_Fga_Audit_Trail;
SESSION_ID TIMESTAMP DB_USER OS_USER USERHOST SQL_TEXT
---------- ----------- ------------------------------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
201 2008-11-4 2 RYAN Ryan WORKGROUP/LENOVO-C30DA497 select * from test
9.4、關閉審計
SQL> exec DBMS_FGA.DISABLE_POLICY(object_schema=>'ryan' ,object_name=>'TEST' ,policy_name=>'chk_test');
9.5、刪除審計標記
SQL> exec DBMS_FGA.DROP_POLICY(object_schema=>'ryan' ,object_name=>'TEST' ,policy_name=>'chk_test');
設定ORACLE審計
下列步驟可以設定ORACLE的審計功能:
1.修改引數檔案(init
DB/TRUE:啟動審計功能,並且把審計結果存放在資料庫的SYS.AUD$表中
OS:啟動審計功能,並把審計結果存放在作業系統的審計資訊中
DB_EXTENDED:具有DB/TRUE的功能,另外填寫AUD$的SQLBIND和SQLTEXT欄位
NONE/FALSE:關閉審計功能
2.如果設定AUDIT_TRAIL = OS,還需要修改引數AUDIT_FILE_DEST。
如果作業系統支援設定AUDIT_TRAIL=OS,檔案會自動存放在AUDIT_FILE_DEST所指定的目錄下,並且檔名包含程式的PID。
比如:
AUDIT_FILE_DEST = $ORACLE_HOME/rdbms/audit
$ ls -l $ORACLE_HOME/rdbms/audit
-rw-rw---- 1 ora92 dba 881 Mar 17 09:57 ora_13264.aud
$ ps -ef|grep 13264
ora92 13264 13235 0 09:56:43 ? 0:00 oracleV92 (DESCRIPTION=(LOCAL=Y)
SQL> select spid, program, username from v$process;
SPID PROGRAM USERNAME
------ -------------------------------------------- -------------
...
13264 oracle@frhp11 (TNS V1-V3) ora92
注意:WINDOWS NT不使用AUDIT_FILE_DEST引數,如果使用OS設定,那麼審計資訊會存放在WINDOWS NT的事件日誌裡。
3.確認審計相關的表是否已經安裝
SQLPLUS> connect / AS SYSDBA
SQLPLUS> select * from sys.aud$; --沒有記錄返回
SQLPLUS> select * from dba_audit_trail;--沒有記錄返回
如果做上述查詢的時候發現表不存在,說明審計相關的表還沒有安裝,需要安裝。
SQLPLUS> connect / as sysdba
SQLPLUS> @$ORACLE_HOME/rdbms/admin/cataudit.sql
審計表安裝在SYSTEM表空間。所以要確保SYSTEM表空間又足夠的空間存放審計資訊。
4.關閉並重啟資料庫
5.設定所需要的審計資訊
下面是一個例子
SQL> connect system/manager
SQL> grant audit system to scott;
SQL> connect scott/tiger
SQL> audit session;
停止審計:
SQL> noaudit session;
設定審計的例項:對試圖嘗試口令的訪問的審計
1.修改審計相關引數2.重啟資料庫
3.設定審計資訊
SQL>AUDIT ALL BY ACCESS WHENEVER NOT SUCCESSFUL
4.查詢AUD$
SQL> select returncode, action#, userid, userhost, terminal,timestamp
from aud$
RETURNCODE ACTION# USERID USERHOST TERMINAL
---------- ---------- -------- -------------------- --------------------
1017 100 SCOTT WPRATA-BR
1017 100 SCOTT WPRATA-BR
1017 100 SCOTT WPRATA-BR
ORA-1017的含義為錯誤的使用者名稱口令。通過檢視AUD$表可以清楚地看到WPRATA-BR嘗試破譯SCOTT的口令。可以通過下面一個儲存過程來分析AUD$表,找出可疑的資訊:
create or replace procedure AuditLogin(Since Varchar2,Times PLS_Integer)
is
USER_ID VARCHAR2(20);
cursor c1 is select userid,count(*) from sys.aud$ where returncode='1017' and timestamp#>=to_date(Since,'yyyy-mm-dd')
group by userid;
cursor C2 IS Select userhost, terminal,TO_CHAR(timestamp#,'YYYY-MM-DD:HH24:MI:SS')
from sys.aud$ WHERE returncode='1017' and timestamp#>=to_date(Since,'yyyy-mm-dd') AND USERID=USER_ID;
ct PLS_INTEGER;
V_USERHOST VARCHAR2(40);
V_TERMINAL VARCHAR(40);
V_DATE VARCHAR2(40);
BEGIN
OPEN C1;
dbms_output.enable(1024000);
LOOP
FETCH C1 INTO USER_ID,CT;
EXIT WHEN C1%NOTFOUND;
IF(CT>=TIMES) THEN
DBMS_OUTPUT.PUT_LINE('USER BROKEN ALARM:'||USER_ID);
OPEN C2;
LOOP
FETCH C2 INTO V_USERhOST,V_TERMINAL,V_DATE;
DBMS_OUTPUT.PUT_LINE(CHR(9)||'HOST:'||V_USERHOST||',TERM:'||V_TERMINAL||',TIME:'||V_DATE);
EXIT WHEN C2%NOTFOUND;
ENDLOOP;
close c2;
END IF;
ENDLOOP;
close c1;
END;
/
一下是執行結果:
SQL>set serveroutput on;
SQL> execute auditlogin('2004-01-01',2);
USER BROKEN ALARM:SYS
HOST:,TERM:XUJI,TIME:2004-09-22:11:08:00
HOST:,TERM:XUJI,TIME:2004-09-22:11:08:01
HOST:,TERM:XUJI,TIME:2004-09-22:11:09:29
HOST:,TERM:XUJI,TIME:2004-09-22:11:09:29
PL/SQL過程已成功完成。
將審計相關的表移動到其他表空間
由於AUD$表等審計相關的表存放在SYSTEM表空間,因此為了不影響系統的效能,保護SYSTEM表空間,最好把AUD$移動到其他的表空間上。可以使用下面的語句來進行移動:
實際上sys.aud$表上包含了兩個lob欄位,並不是簡單的move table就可以。
下面是具體的過程:
alter table sys.aud$ move tablespace users;
alter table sys.aud$ move lob(sqlbind) store as( tablespace USERS);
alter table sys.aud$ move lob(SQLTEXT) store as( tablespace USERS);
alter index sys.I_AUD1 rebuild tablespace users;
alter table audit_actions move tablespace
alter index i_audit_actions rebuild online tablespace
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23071790/viewspace-703141/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【審計】標準資料庫審計資料庫
- 標準資料審計
- oracle標準審計Oracle
- 【安全】oracle 標準審計Oracle
- Oracle Database標準審計和細粒度審計功能OracleDatabase
- Oracle標準資料庫稽核Oracle資料庫
- ORACLE 資料庫審計詳解Oracle資料庫
- 審計Oracle資料庫的使用Oracle資料庫
- Oracle資料庫審計功能介紹Oracle資料庫
- Oracle 資料庫安全許可權配置標準Oracle資料庫
- 資料庫審計-hexorbase資料庫HexoORB
- Oracle FGA細粒度審計——基於內容的資料庫審計(一)Oracle資料庫
- Oracle FGA細粒度審計——基於內容的資料庫審計(二)Oracle資料庫
- Oracle FGA細粒度審計——基於內容的資料庫審計(三)Oracle資料庫
- 拍拍貸資料庫審計資料庫
- 資料庫DDL操作審計資料庫
- 舉例說明Oracle資料庫審計的用法Oracle資料庫
- Oracle 標準審計,設定AUDIT_SYSLOG _LEVEL引數Oracle
- Profile標準化資料庫管理資料庫
- Java與資料庫 —— JDBC標準Java資料庫JDBC
- DBA必讀:Oracle資料庫審計七宗罪Oracle資料庫
- MySQL資料庫審計系統MySql資料庫
- Access資料庫審計工具mdbtools資料庫
- Oracle資料庫標準版與企業版的區別Oracle資料庫
- 【實驗】【審計】【FGA】使用Oracle的審計功能監控資料庫中的可疑操作Oracle資料庫
- 資料庫 - 關聯式資料庫標準語言SQL資料庫SQL
- 使用Profile標準化資料庫管理資料庫
- oracle資料庫sys使用者的審計(網文摘錄)Oracle資料庫
- 資料庫審計技術進化資料庫
- 開啟mysql 資料庫審計功能。MySql資料庫
- openGauss 設定資料庫審計資料庫
- 檢視Oracle資料庫是企業版還是標準版Oracle資料庫
- 資料庫標準化與正規化資料庫
- Python標準庫14 資料庫 (sqlite3)Python資料庫SQLite
- 資料庫安全審計在資料安全中的功能資料庫
- 《汽車設計標準資料手冊(標準件篇)》PDF下載
- 安全管理:polardb資料庫審計功能資料庫
- Oracle資料庫DDL審計觸發器觸發的bug問題Oracle資料庫觸發器