1. 程式人生 > 實用技巧 >Oracle 11g與12c的審計詳解

Oracle 11g與12c的審計詳解

最近遇到一些指令碼誘發的審計相關BUG,感覺有必要重新梳理一下11g與12c的審計模式,於是根據官網修正了一下以前的一篇筆記這裡發出來。

一、審計功能的開啟:

SQL> show parameter audit
--主要有以下四個引數:
AUDIT_TRAIL(default:DB)
AUDIT_FILE_DEST(default:ORACLE_BASE/admin/ORACLE_SID/adump or ORACLE_HOME/rdbms/audit)
AUDIT_SYS_OPERATIONS(default:FALSE)
AUDIT_SYSLOG_LEVEL(no default)

audit_trail引數的值可以設定為以下幾種(11G,12C適用):

https://docs.oracle.com/cd/E11882_01/server.112/e40402/initparams017.htm#REFRN10006

1. none --不開啟
2. os --啟用資料庫審計,並將資料庫審計記錄定向到作業系統檔案,儲存目錄為AUDIT_FILE_DEST
3. db --開啟審計功能 啟用資料庫審計,並將資料庫所有審計記錄定向到資料庫的SYS.AUD$表
5. db, extended --extened之前的空格必須有,啟用資料庫審計,並將資料庫所有審計記錄定向到資料庫的SYS.AUD$表,另外填充SYS.AUD$表的SQLBIND列和SQLTEXT列
6. xml  --類似os,但是是將審計記錄存放於XML格式的檔案中
7. xml, extended --將審計記錄存放於作業系統的xml檔案中並填充sql_text和sql_bind資訊
#此引數無法動態修改,因此需要重啟資料庫才能生效,示例:
alter system set AUDIT_TRAIL=db scope=spfile;
#對於db和db, extended兩種審計模式,如果資料庫是read-only模式的,那麼資料庫預設使用os審計模式,無視已有設定(因為不能向資料庫表寫入資料)。

AUDIT_SYS_OPERATIONS設定為true那麼sys使用者的操作也會被審計,但此值預設為false,此引數控制以sysdba和sysoper許可權登陸的使用者以及sys使用者本身的登陸,審計記錄一定會寫在作業系統檔案中(無論AUDIT_TRAIL引數如何設定)。

AUDIT_SYSLOG_LEVEL則表示當涉及到向作業系統檔案寫入審計記錄時,直接寫入到系統日誌中而不是AUDIT_FILE_DEST(僅適用於類unix系統)。

二、審計記錄的儲存
審計的兩大分類:
  • 標準審計:主要記錄一些涉及資料庫安全性的SQL操作和許可權變更等,官網列出的預設標準審計項包含如下操作(通過DBA_STMT_AUDIT_OPTS檢視):
    --Oracle Database audits the following privileges by default:
    ALTER ANY PROCEDURE 	CREATE ANY LIBRARY 				DROP ANY TABLE
    ALTER ANY TABLE 		CREATE ANY PROCEDURE 			DROP PROFILE
    ALTER DATABASE 			CREATE ANY TABLE 				DROP USER
    ALTER PROFILE 			CREATE EXTERNAL JOB 			EXEMPT ACCESS POLICY
    ALTER SYSTEM 			CREATE PUBLIC DATABASE LINK 	GRANT ANY OBJECT PRIVILEGE
    ALTER USER 				CREATE SESSION 					GRANT ANY PRIVILEGE
    AUDIT SYSTEM 			CREATE USER 					GRANT ANY ROLE
    CREATE ANY JOB 			DROP ANY PROCEDURE 	 
    --Oracle Database audits the following SQL statement shortcuts by default:
    ROLE 					SYSTEM AUDIT 					PUBLIC SYNONYM
    DATABASE LINK 			PROFILE 						SYSTEM GRANT
    --此外通過audit命令指定的審計也是標準審計。
    
  • 精細審計:提供非常細粒度的審計,例如可以使你審計針對某個表的某些欄位在某一段時間內的某種DML操作,還可以限定客戶端的IP等。

標準審計記錄儲存在SYS.AUD$表中,精細審計的記錄存放於SYS.FGA_LOG$表中,分別可以通過DBA_AUDIT_TRAIL和DBA_FGA_AUDIT_TRAIL檢視標準和精細審計的審計記錄。

兩種審計模式還有一個共同的檢視可以看:DBA_COMMON_AUDIT_TRAIL,包含了標準+精細審計的記錄。

truncate table aud$; --可以截斷相關表,清理審計資料。

檢視dba_common_audit_trail(包含標準和精細審計的記錄)可以看到記錄的主要欄位包含:

SESSION_ID:會話ID,並非實際資料庫會話的id,應該只是一個自增的ID
EXTENDED_TIMESTAMP:記錄生成時間
DB_USER、OS_USER、USERHOST:一些使用者相關的資訊
OS_PROCESS:服務端對應的server process的系統程序ID,如果帶冒號:,冒號後邊的是執行緒ID
RETURNCODE:服務端的返回錯誤碼,比如密碼驗證失敗就會顯示1017的錯誤碼,即ORA-1017:"invalid username/password; logon denied"
COMMENT_TEXT:如果是遠端登入還會包含客戶端連線使用的TNS資訊,包括使用的埠號
LOGOFF_TIME:會話登出時間
LOGOFF_LREAD、LOGOFF_PREAD、LOGOFF_LWRITE、LOGOFF_DLOCK:會話期間的邏輯讀、物理讀、物理寫、死鎖次數
ACTION:審計記錄對應的操作號
STATEMENT_TYPE:審計記錄對應的操作號表示的具體操作,也可以用過查詢audit_actions檢視來獲取action與STATEMENT_TYPE的對應關係

提示:

12c中的unified審計記錄不在AUD$表中,而是儲存在AUDSYS schema下,可以通過AUDSYS.UNIFIED_AUDIT_TRAIL表查詢,開啟unified審計後傳統的AUD$和dba_common_audit_trail等不再包含任何審計記錄。

三、關於精細審計(fine-grained auditing):

https://docs.oracle.com/cd/E11882_01/network.112/e36292/auditing.htm#DBSEG525

如果想要細粒度的審計某個schema下針對某個表的某些資料的操作記錄,可以開啟精細審計,這允許你設計很細粒度的策略,例如創造一個fga策略如下:

--檢視相關包的用法:
desc DBMS_FGA;
BEGIN
 DBMS_FGA.ADD_POLICY(
 OBJECT_SCHEMA=>'HR',                   
 OBJECT_NAME =>'EMPLOYEES',                    
 POLICY_NAME =>'SAL_AUD',                    
 AUDIT_CONDITION =>'SALARY>3000',               
 AUDIT_COLUMN =>'SALARY',                                    
 ENABLE=>TRUE,                          
 STATEMENT_TYPES=>'SELECT,UPDATE');
END;
--在sqlplus 中直接/執行,或者作為儲存過程在plsql中exec dbms_fga.add_policy(...........);

檢視精細審計策略:

DESC dba_audit_policies;
--檢視已建立的精細審計策略
SELECT OBJECT_NAME,POLICY_NAME,ENABLED FROM DBA_AUDIT_POLICIES;

刪除精細策略:

begin
dbms_fga.drop_policy (
object_schema=>'HR',
object_name=>'TEST',
policy_name=>'SAL_AUD');
end;
/

四、檢視審計記錄:

DBA_COMMON_AUDIT_TRAIL:https://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_3077.htm#REFRN23393

desc dba_common_audit_trail;
--示例:12c之前檢視因為密碼驗證失敗的審計記錄:
select 
	EXTENDED_TIMESTAMP,DB_USER, OS_USER, USERHOST, COMMENT_TEXT
from dba_common_audit_trail
where 
	DB_USER = 'EASYITS'
   and RETURNCODE = 1017
   and EXTENDED_TIMESTAMP between
       to_timestamp('2019-04-18 21:30:00', 'YYYY-MM-DD HH24:MI:SS') and
       to_timestamp('2019-04-18 22:30:00', 'YYYY-MM-DD HH24:MI:SS');

五、12c審計:

官網參考:

12c的傳統審計(即11g裡的標準審計和精細審計):

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/AUDIT-Traditional-Auditing.html#GUID-ADF45B07-547A-4096-8144-50241FA2D8DD

12c的unified審計:

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/AUDIT-Unified-Auditing.html#GUID-B24D6874-4053-4E66-8238-6CD0C87E9DCA

12c中新引入的審計機制名為unified audit,你可以將其理解為一種更加輕便的精細審計。

我們知道在12c之前想要使用精細審計就要用dbms_fga包去建立審計策略,想要使用標準審計就要用audit語句去審計特定的許可權和SQL,相關的檢視也非常多,這導致審計策略的管理非常混亂,audit的語法也非常的反人類。而12c的unified audit則對設定審計策略的方式做了統一和簡化,只需要使用以下三種語句來設定審計策略就可以了:

而開啟和關閉審計策略也極簡,只需要使用簡單的audit和noaudit語句:

audit policy <policy_name>;
noaudit policy <policy_name>;

可以看到我們只要熟悉建立/修改審計策略的語法就可以了。

至於原有的標準審計和精細審計的建立模式,12c中依然保留,在混合審計模式下你依然可以使用dbms包建立精細審計,audit命令也保留著建立標準審計的語法。

Unified審計模式的開啟:

12c的Unified Auditing引數預設為false:

select parameter,value from v$option where parameter='Unified Auditing';

這種預設設定表示既支援12c之前的那種標準+精細的傳統審計模式,也可以使用unified審計模式,這種預設的模式也被稱作混合審計模式(mixed)。

而如果開啟unified audting,那麼傳統審計模式就會被禁用,audit_trail引數被忽略,AUD$和FGA_LOG$等相關表不再新增任何審計記錄,只能在AUDSYS.UNIFIED_AUDIT_TRAIL中看到unified審計的記錄。

如何開啟unified審計?

SQL> shutdown immediate;
ORACLE instance shut down.
SQL> host lsnrctl stop
--如果有EM啟用,那麼暫時關閉:emctl stop oms
SQL> host ( cd $ORACLE_HOME/rdbms/lib ; make -f ins_rdbms.mk uniaud_on ioracle )
--同樣的關閉方式就是:make -f ins_rdbms.mk uniaud_off ioracle
SQL> startup
SQL> select * from v$option where PARAMETER = 'Unified Auditing';

12c混合審計模式下的審計表現:

我們知道11g中,只要audit_trail不為none,那麼資料庫會預設審計一些操作,例如logon,logout和涉及資料庫安全的操作等。而在12c中系統也預設了一些unified審計策略,可以通過AUDIT_UNIFIED_ENABLED_POLICIES檢視檢視已生效的審計策略,通過AUDIT_UNIFIED_POLICIES可以檢視所有預設審計策略。

12c的混合模式下,對於11g中那些標準審計預設審計的審計項們也依然進行審計,只不過方式變了,變為了通過預設開啟一些unified審計策略來進行這些預設審計(DBA_STMT_AUDIT_OPTS也不再包含記錄)。我們可以看一下這些預設開啟的審記策略:

select * from AUDIT_UNIFIED_ENABLED_POLICIES;

以上為12c中預設開啟的審計策略,其中ORA_LOGON_FAILURES在12.1.0.2以後被從ORA_SECURECONFIG獨立出來,並且只審計失敗的登入.

而從AUDIT_UNIFIED_POLICIES檢視可以看出ORA_SECURECONFIG其實就包含了以前的那些預設標準審計項。

混合模式下無論是傳統審計記錄,還是通過預設的unified auditing policy進行的預設審計,其審計記錄在dba_common_audit_trail中都可以檢視。