Oracle-審計功能


簡述

審計 (Audit) 用於監視和記錄用戶所執行的數據庫操作,審計記錄可存在數據字典表(默認存儲在system表空間中的SYS.AUD$表中,可通過視圖dba_audit_trail查看審計記錄)或操作系統審計記錄文件中(默認位置為$ORACLE_BASE/admin/$ORACLE_SID/adump/)。默認情況下,是沒有開啟審計功能的

審計記錄內容包含

  • 操作的日期和時間等信息
  • 用戶執行的特定類型操作

注意: 無論是否打開數據庫的審計功能,以系統管理員(sysdba, sysoper)權限連接數據庫實例,啟動數據庫和關閉數據庫的操作都會強制寫入操作系統日志文件中。

存儲位置

舊(12c以前版本)審計引擎不同的組件存放在不同的位置
  • SYS.AUD$ : 會存放數據庫的標准審計結果
  • SYS.FGA_LOG$ : 會存放細粒度審計結果(fine-grained auditing
  • DVSYS.AUDIT_TRAIL$ : 會存放Oracle Database Vault和Oracle Label Security等組件的審計結果
12C 統一審計引擎
  • 所有的審計記錄都存儲在字典表UNIFIED_AUDIT_TRAIL

審計功能

  • 審計語句的成功執行、不成功執行或其兩者

審計維度

標准審計(AUD)
細粒度審計(FGA)-Fine Grained Auditing

細粒度的審計使用DBMS_FGA包完成配置和管理工作。細粒度審計除了審計功能外,還可用於綁定變量值的捕獲。oracle 9i引進的一個新特性。

審計級別

Statement (語句)、Privilege (權限)、object(對象)

Statement

對某種類型的SQL語句審計,不指定結構或對象。如audit table 會審計數據庫中所有的create table,drop table,truncate table語句。通過視圖DBA_STMT_AUDIT_OPTS查看當前開啟的審計選項

Privilege

對某些系統權限的使用情況進行審計。通過視圖DBA_PRIV_AUDIT_OPTS查看當前開啟的審計選項

object

對指定模式對象上的指定語句的審計。通過視圖DBA_OBJ_AUDIT_OPTS查看當前開啟的審計選項

審計選項

noaudit | audit
  • audit: 開啟指定對象的審計
  • noaudit: 取消審計
by ACCESS | by session
  • by access: 每一個被審計的操作都會生成一條審計記錄

  • by session: 同一個會話中同類型操作只會生成一條審計記錄,默認by session

whenever [not] successful
  • whenever successful: 操作成功時才被審計
  • whenever not successful: 操作失敗時才被審計

省略該子句時,不管操作成功與否都會審計。

新特性

11g 引入新特性之X$DBGALERTEXT內部視圖

若需要利用SQL查詢Oracle的alert.log告警日志,在11g以前可以通過創建Alert.log內容的外部表來實現查詢日志內容的目的。在11g開始,引入了新的ADR(Automatic Diagnostic Repository) 自動診斷倉庫特性之后,自動將alert.log文件格式自動轉換為XML的格式,默認存放在$ADR_HOME/alert&trace目錄下,並且為日志條目增加了更多的屬性(如Level之類),使得告警日志能提供更多有用的信息。

從11g開始,就不需要手動創建外部表的方式查詢,它已經由Oracle的內部視圖X$DBGALERTEXT直接提供。

set linesize 168 pagesize 99
select originating_timestamp, message_group, problem_key, message_text
  from X$DBGALERTEXT
where message_text like '%ORA-00600%'
-- and message_group = 'Generic Internal Error' -- 最近出現過的Internal Errors
-- and message_group = 'admin_ddl' -- 審計最近2天內管理員執行過的DDL語句
  and rownum < 10;

X$DBGALERTEXT的內容極其豐富,包括message記錄發生的日期、發生問題的進程號、trace日志的位置、問題的關鍵(problem key),為分析數據庫日志提供極為強大的接口,節約大量的時間。

當log.xml的大小超過10MB時,Oracle會將其內容歸檔到如log_$N.xml這樣的歸檔文件中,並清空當前的log.xml的內容。

注意: X$DBGALERTEXT的數據實際來源於ADR中的log.xml文件, 若xml被刪除或者內容缺失都會影響信息完整性

12C 新特性審計模式

  • Mixed Auditing Policy(混合審計模式):支持新的審計引擎和老的審計引擎一起工作,數據庫創建后,默認是使用混合模式,使用ora_secureconfig策略

    • 審計策略:

      set lines 168 pages 99
      col POLICY_NAME for a32
      col USER_NAME for a18
      col SUCCESS for a8
      col FAILURE for a8
      select  USER_NAME, POLICY_NAME, ENABLED_OPT, ENABLED_OPTION, SUCCESS, FAILURE from AUDIT_UNIFIED_ENABLED_POLICIES;
      
      • ora_secureconfig 策略
      • ora_account_mgmt 策略
      • ora_database_parameter 策略
  • Unified Auditing Policy(統一審計模式):12C新引入的審計引擎,審計數據默認放在sysaux表空間中的只讀審計表,其屬主是audsys(該用戶默認是被鎖定的)

查看統一審計模式下的審計記錄數據

通過字典表UNIFIED_AUDIT_TRAIL查看審計記錄

col OS_USERNAME format a12
 col TERMINAL for a12
 col SQL_TEXT format a60
 COL AUDIT_TYPE format a10
 col  ACTION_NAME format a24
 col UNIFIED_AUDIT_POLICIES  format a18
 select AUDIT_TYPE,OS_USERNAME,TERMINAL,ACTION_NAME,
 SQL_TEXT,UNIFIED_AUDIT_POLICIES
  from UNIFIED_AUDIT_TRAIL 
  where OBJECT_NAME='EMP';

相關參數

audit_sys_operations

默認為false,當設置為true時,所有sys用戶(包括以sysdba, sysoper身份登錄的用戶)的操作都會被記錄,審計記錄不會寫到sys.aud$表中。如果是Windows平台,它會記錄在windows的事件管理中,如果是linux/unix平台則會記錄在audit_file_dest參數指定的文件中。

注意:該參數是(static)靜態參數,需要重新啟動數據庫才能生效

audit_trail

注意:該參數是(static)靜態參數,需要重新啟動數據庫才能生效

  • None:是默認值,不做審計;

  • DB:將審計記錄在數據庫的審計相關表中,如aud$,審計的結果只有連接信息;

  • DB,Extended:審計結果里面除了連接信息還包含了當時執行的具體語句;

  • OS:將審計記錄在操作系統文件中,文件名由audit_file_dest參數指定;

  • XML:10g里新增的參數

安裝配置

desc sys.aud$

若上面語句返回結果:表不存在時,說明審計相關的表,視圖等對象還沒有安裝

安裝審計表

由於審計表默認安裝在SYSTEM表空間,因此,需要確保SYSTEM表空間有足夠的空間存放審計信息

sqlplus "/ as sysdba"<<EOF
@$ORACLE_HOME/rdbms/admin/cataudit.sql
shutdown immediate;
startup;
EOF

開啟審計

alter system set audit_sys_operations=TRUE scope=spfile;
alter system set audit_trail=db,extended scope=spfile;

shutdown immediate;
startup;
show parameter audit

查看審計配置信息

col PARAMETER_NAME FOR a30
col PARAMETER_VALUE FOR a16
col AUDIT_TRAIL FOR a20
SELECT PARAMETER_NAME, PARAMETER_VALUE, AUDIT_TRAIL
FROM DBA_AUDIT_MGMT_CONFIG_PARAMS
WHERE audit_trail = 'STANDARD AUDIT TRAIL';

12C環境中配置審計模式

開啟統一審計模式

檢查當前審計模式
SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';

若為FALSE,則表示使用混合審計模式

取消統一審計策略
set lines 168 pages 99
col POLICY_NAME for a32
col USER_NAME for a18
col SUCCESS for a8
col FAILURE for a8
select  USER_NAME, POLICY_NAME, ENABLED_OPT, ENABLED_OPTION, SUCCESS, FAILURE from AUDIT_UNIFIED_ENABLED_POLICIES;

-- 取消審計策略
NOAUDIT POLICY ORA_LOGON_FAILURES ;
-- 開啟審計策略
AUDIT POLICY ORA_LOGON_FAILURES WHENEVER NOT SUCCESSFUL;
關閉數據庫
sqlplus "/ as sysdba"<<EOF
shutdown immediate;
EOF
srvctl stop database -d orcl 
cd $ORACLE_HOME/rdbms/lib
# 開啟統一審計模式
make -f ins_rdbms.mk uniaud_on ioracle

# 關閉統一審計模式
make -f ins_rdbms.mk uniaud_off ioracle

注意:

  • 在Windows平台開啟統一審計模式時,必須將%ORACLE_HOME%\bin\orauniaud12.dll.dbl 文件重命名為%ORACLE_HOME%\bin\orauniaud12.dll
  • 在Windows平台關閉統一審計模式時,必須將%ORACLE_HOME%\bin\orauniaud12.dll.dll 文件重命名為%ORACLE_HOME%\bin\orauniaud12.dbl
重啟數據庫
sqlplus "/ as sysdba"<<EOF
startup;
EOF

srvctl start database -d orcl 
檢查確認
-- 檢查開啟哪種審計模式
SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';

-- 檢查審計數據
set lines 200 pages 99
col name for a18
col username for a18
col account_status for a24
col def_tbs for a16
col temp_tbs for a16
col lt_tbs for a16
select u.con_id,
       c.name,
       username,
       account_status,
       DEFAULT_TABLESPACE def_tbs,
       TEMPORARY_TABLESPACE temp_tbs,
       LOCAL_TEMP_TABLESPACE lt_tbs
  from cdb_users u, v$containers c
 where u.con_id = c.con_id
   and u.username = upper('audsys');

img

審計相關的表移動到其他表空間

建議把AUD$表移動到其他的表空間上

手動遷移方式

alter table aud$ move tablespace AUDTBS;
alter table FGA_LOG$ move tablespace AUDTBS;

set lines 168 pages 999
col TABLE_NAME for a32
col SEGMENT_NAME for a32
col TABLESPACE_NAME for a16
col COLUMN_NAME for a32

select TABLE_NAME, SEGMENT_NAME, TABLESPACE_NAME,COLUMN_NAME,'alter table '|| TABLE_NAME || ' move lob('|| COLUMN_NAME ||') store as '|| SEGMENT_NAME ||' (tablespace AUDTBS);'  sql_cmd
  from dba_lobs
 where table_name in ('AUD$', 'FGA_LOG$');

-- alter table AUD$ move lob(SQLBIND) store as SYS_LOB0000000407C00040$$ (tablespace AUDTBS);
-- alter table AUD$ move lob(SQLTEXT) store as SYS_LOB0000000407C00041$$ (tablespace AUDTBS);

select INDEX_NAME, TABLE_NAME, 'alter index ' || INDEX_NAME || ' rebuild online tablespace AUDTBS;' sql_cmd
from dba_indexes
where table_name in ('AUD$', 'FGA_LOG$');

使用存儲過程遷移方式

使用Oracle自帶的包DBMS_AUDIT_MGMT中的存儲過程SET_AUDIT_TRAIL_LOCATION來實現遷移審計表空間,該存儲過程接受2個參數,順序依次是AUDIT_TRAIL_TYPE和AUDIT_TRAIL_LOCATION_VALUE

-- 遷移審計表到audtbs的表空間
BEGIN
DBMS_AUDIT_MGMT.set_audit_trail_location(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
audit_trail_location_value => 'AUDTBS');
END;
/
 
BEGIN
DBMS_AUDIT_MGMT.set_audit_trail_location(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_FGA_STD,
audit_trail_location_value => 'AUDTBS');
END;
/

-- 檢查確認
SELECT table_name, tablespace_name FROM dba_tables WHERE table_name IN ('AUD$', 'FGA_LOG$');
select TABLE_NAME, SEGMENT_NAME, TABLESPACE_NAME from dba_lobs where table_name in ('AUD$', 'FGA_LOG$');

參數AUDIT_TRAIL_TYPE有以下幾種取值
  • AUDIT_TRAIL_ALL: 所有的審計類型,包括標准數據庫審計、細粒度審計、操作系統審計和XML文件審計

  • AUDIT_TRAIL_AUD_STD: 標准數據庫審計

  • AUDIT_TRAIL_DB_STD :標准數據庫審計和細粒度審計

  • AUDIT_TRAIL_FGA_STD: 細粒度審計

  • AUDIT_TRAIL_FILES :操作系統和XML文件審計

  • AUDIT_TRAIL_OS : 操作系統審計,審計數據存放在操作系統的文件里

  • AUDIT_TRAIL_XML :XML文件審計,審計數據存放在XML文件里

參數AUDIT_TRAIL_LOCATION_TYPE的取值是指定要遷移到的表空間的名字

審計記錄數據維護

通過Oracle自帶的包DBMS_AUDIT_MGMT中的存儲過程管理

  • SET_AUDIT_TRAIL_PROPERTY:設置審計的維護屬性,即每清除多少條數據提交一次
  • INIT_CLEANUP:設置審計數據保留的天數
  • SET_LAST_ARCHIVE_TIMESTAMP:設置上次歸檔審計記錄的時間戳
  • CREATE_PURGE_JOB:設置每隔多長時間清除審計數據的JOB
init_cleanup
-- 設定清除間隔
BEGIN
  DBMS_AUDIT_MGMT.init_cleanup(
    audit_trail_type         => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL,
    default_cleanup_interval => 120 /* hours */);
END;
/
驗證
SET SERVEROUTPUT ON
BEGIN
  IF DBMS_AUDIT_MGMT.is_cleanup_initialized(DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD) THEN
    DBMS_OUTPUT.put_line('YES');
  ELSE
    DBMS_OUTPUT.put_line('NO');
  END IF;
END;
/

select to_char(min(ntimestamp#),'yyyy-mm-dd hh24:mi:ss') ntime from sys.aud$;
SET_LAST_ARCHIVE_TIMESTAMP
-- 設定歸檔間隔
BEGIN
DBMS_AUDIT_MGMT.set_last_archive_timestamp(
  audit_trail_type  => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
  last_archive_time => SYSTIMESTAMP-8
  );
END;
/



-- 查看設定的歸檔間隔
SELECT * FROM dba_audit_mgmt_last_arch_ts;
CREATE_PURGE_JOB
-- 通過創建一個purge Job來進行清理已歸檔的歷史審計記錄
BEGIN
  DBMS_AUDIT_MGMT.CREATE_PURGE_JOB(
    AUDIT_TRAIL_TYPE           => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
    AUDIT_TRAIL_PURGE_INTERVAL => 24 /* hours */,
    AUDIT_TRAIL_PURGE_NAME     => 'DAILY_AUDIT_PURGE_JOB',
    USE_LAST_ARCH_TIMESTAMP    => TRUE
  );
END;
/

exec DBMS_SCHEDULER.RUN_JOB(job_name => 'SYS.DAILY_AUDIT_PURGE_JOB');

手動清理審計記錄數據

sqlplus -S / as sysdba << EOF > clear_aud_`date +%Y%m%d`.log
create table tb_aud_`date +%Y%m` nologging tablespace AUDTBS compress as select * from aud\$;
truncate table sys.aud\$;
EOF

# 表如果太大則采用該方式清理,keep值根據實際情況設置,例如當前aud$大小為5000m
truncate table sys.aud$ reuse storage;
alter table sys.aud$ deallocate unused keep 4000m;
alter table sys.aud$ deallocate unused keep 3000m;
alter table sys.aud$ deallocate unused keep 2000m;
alter table sys.aud$ deallocate unused keep 1000m;

## fga_log$ 表使用類似的清理方法

示例

審計登錄失敗事件

alter session set nls_date_format='yyyy-mm-dd HH24:Mi:SS';
set lines 168 pages 99
col userhost for a32
col terminal for a18
col LOGOFF$TIME for a32
select userid,userhost,terminal,action#,LOGOFF$TIME,NTIMESTAMP# 
from sys.aud$ 
where userid ='GDYX2' 
  and rownum<20;

alter session set nls_date_format='yyyy-mm-dd HH24:Mi:SS';
set lines 168 pages 999
col os_username for a18
col userhost for a32
col terminal for a18
col username for a18
select os_username,userhost,terminal,username,TIMESTAMP,count(*) 
from dba_audit_trail 
where returncode = 1017 
  and TIMESTAMP > (sysdate - 10)
group by os_username,userhost,username,terminal,TIMESTAMP
order by TIMESTAMP desc ;

img

附錄

參考文檔

  • How to - Monitor Non Critical 11g Database Alert Log Errors Using a SQL UDM (Doc ID 961682.1)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM