在 Oracle Bare Metal 解決方案中稽核 Oracle 資料庫
總覽
資料庫稽核是指記錄、監控及回報在資料庫上執行的動作。這可讓安全性稽核人員觀察資料庫使用者是否依照既定政策使用資料庫,並確保沒有任何政策違規情形。
託管在 Bare Metal 解決方案伺服器上的 Oracle 資料庫,可做為地端部署環境,支援所有 Oracle 標準稽核程序,且不受任何限制。您必須根據業務需求設定稽核政策。
本頁面將說明 Oracle Bare Metal 解決方案支援的稽核政策,以及稽核記錄的維護作業。本頁也將說明如何在必要時使用 Cloud Storage 值區封存較舊的稽核記錄。
1. 稽核 SYS 使用者作業
如要稽核 SYS/SYSDBA/SYSOPER 執行的活動,資料庫管理員可以參考本節內容。
參數 audit_sys_operations 可讓您稽核作業系統稽核記錄檔中 SYS/SYSDBA/SYSOPER 發出的所有陳述式。如要啟用 SYS 使用者的稽核功能,您必須將參數 audit_sys_operations
設為 TRUE
。
SQL> show parameter audit
NAME TYPE VALUE
------------------------------------ ------------------------------
audit_file_dest string /apps/oracle/oracle_base/admin
/dbrman/adump
audit_sys_operations boolean TRUE
audit_syslog_level string
audit_trail string DB
unified_audit_common_systemlog string
unified_audit_sga_queue_size integer 1048576
unified_audit_systemlog string
設定 audit_sys_operations
參數後,audit_file_dest
指定目錄位置的稽核檔案中,就會提供所有 sys 層級稽核詳細資料。
以下範例說明如何從 sys 建立範例使用者。
[oracle@svr002 adump]$ sqlplus / as sysdba
SQL> create user audit_test identified by abcd1234;
在 audit_file_dest
目錄中檢查相關稽核記錄。在這個範例中,資料庫使用者 /
會以 OS 使用者 oracle
和權限 sysdba
執行 2 項稽核作業 (連線和建立使用者)。
[oracle@svr002 ~]$ cd /apps/oracle/oracle_base/admin/dbrman/adump
[oracle@svr002 adump]$ ls -ltr
[oracle@svr002 adump]$ more dbrman_ora_12088_20211113064923842865549602.aud
Fri Nov 13 06:49:23 2021 +00:00
LENGTH : '268'
ACTION :[7] 'CONNECT'
DATABASE USER:[1] '/'
PRIVILEGE :[6] 'SYSDBA'
CLIENT USER:[6] 'oracle'
CLIENT TERMINAL:[5] 'pts/4'
STATUS:[1] '0'
DBID:[10] '3990895662'
SESSIONID:[10] '4294967295'
USERHOST:[17] 'svr002'
CLIENT ADDRESS:[0] ''
ACTION NUMBER:[3] '100'
Fri Nov 13 06:49:55 2021 +00:00
LENGTH : '299'
ACTION :[38] 'create user audit_test identified by *'
DATABASE USER:[1] '/'
PRIVILEGE :[6] 'SYSDBA'
CLIENT USER:[6] 'oracle'
CLIENT TERMINAL:[5] 'pts/4'
STATUS:[1] '0'
DBID:[10] '3990895662'
SESSIONID:[10] '4294967295'
USERHOST:[17] 'svr002'
CLIENT ADDRESS:[0] ''
ACTION NUMBER:[2] '51'
2. 資料庫標準稽核
從 11g 起,稽核功能預設為啟用。如要設定資料庫稽核,請將參數 audit_trail
設為下表的其中一個值:
參數 | 說明 |
NONE | 稽核功能已停用 |
DB | 稽核功能已啟用,稽核資料會寫入 SYS.AUD$ 資料表 |
DB,EXTENDED | 會以資料庫的形式運作,但也會填入 SQL_TEXT 和 SQL_BIND 欄 |
作業系統 | 稽核功能已啟用。在 Unix 上,稽核資料會寫入文字檔案,這些檔案位於透過 audit_file_dest 指定的目錄中。在 Windows 上,稽核資料會傳送至事件檢視器。 |
XML | 稽核功能已啟用,稽核資料會寫入 XML 檔案,這些檔案位於透過 audit_file_dest 指定的目錄中。這適用於 Windows 和 Unix。 |
XML,EXTENDED | 會以 XML 的形式運作,但也會填入 SQL_TEXT 和 SQL_BIND 欄。 |
您可以根據需求將 audit_trail
設為上述任一選項,並從 SYS.AUD$
表格或 audit_file_dest
目錄中產生的稽核檔案檢查稽核活動。
在以下範例中,使用者 audit_test
啟用了所有陳述式稽核功能,並記錄使用者執行的所有作業。
SQL> audit create table by audit_test;
Audit succeeded.
SQL> audit all by audit_test by access;
Audit succeeded.
SQL> conn audit_test
Enter password:
Connected.
SQL> show user
USER is "AUDIT_TEST"
SQL>
SQL> create table test (name char);
Table created.
SQL> insert into test values ('a');
1 row created.
SQL> exit
[oracle@svr002 adump]$ sqlplus / as sysdba
SQL> SELECT username,extended_timestamp,owner,obj_name,action_name FROM dba_audit_trail where owner='AUDIT_TEST' order by timestamp;
USERNAME EXTENDED_TIMESTAMP OWNER OBJ_NAME ACTION_NAME
--------- ------------------- ----------- --------- ------------
AUDIT_TEST 13-NOV-20 07.43.19.361519 AM + AUDIT_TEST TEST CREATE TABLE
00:00
AUDIT_TEST 13-NOV-20 07.43.34.679913 AM + AUDIT_TEST TEST INSERT
00:00
您也可以只針對具備特定權限的特定物件啟用稽核功能,在這種情況下,系統只會記錄該物件專屬的稽核資訊。在下列範例中,稽核功能已在 select
和 delete
資料表 AUDIT1.abcd
上啟用。插入、選取和刪除作業會在資料表上執行。由於只有 select
和 delete
會受到稽核,因此插入作業不會記錄在稽核資料表中。
SQL> create user audit1 identified by abcd1234;
User created.
SQL> conn audit1
Enter password:
Connected.
SQL> create table abcd (id char);
Table created.
SQL> exit
[oracle@svr002 adump]$ sqlplus / as sysdba
SQL> audit select,delete on audit1.abcd;
Audit succeeded.
SQL> conn audit1
Enter password:
Connected.
SQL> insert into abcd values ('a');
1 row created.
SQL> /
1 row created.
SQL> select * from abcd;
I
-
a
a
SQL> delete from abcd;
2 rows deleted.
SQL> column username format a9
column owner format a5
column obj_name format a10
column action_name format a11
column sql_text format a40SQL> SQL> SQL> SQL>
SQL> select username, owner, obj_name,action_name from dba_audit_trail where owner='AUDIT1';
USERNAME OWNER OBJ_NAME ACTION_NAME
------------------- ---------- --------------
AUDIT1 AUDIT1 ABCD SELECT
AUDIT1 AUDIT1 ABCD DELETE
3. Oracle Database 統合稽核
統合稽核是 Oracle 12c 的新功能。從 12c 開始,Oracle 資料庫預設會使用混合模式稽核,同時啟用 Oracle 標準稽核和部分統合稽核稽核政策。
根據預設,安裝新的 Oracle 12c 資料庫或更新版本時,您會看到統一稽核功能在 V$option
中設為 False
,但這並不表示 unified auditing
已停用。統合稽核設為 False
,audit_trail
設為 DB
,表示資料庫使用混合模式稽核。
SQL> select parameter , value from v$option where PARAMETER = 'Unified Auditing';
PARAMETER VALUE
-------------------- --------------------
Unified Auditing FALSE
SQL> show parameter audit_trail
NAME TYPE VALUE
------------------------------------ -----------
audit_trail string DB
混合模式稽核功能可讓您先瞭解統一稽核功能,再完全改用統一稽核功能並停用資料庫標準稽核功能。在混合模式稽核作業中,系統預設會啟用兩項統一稽核政策:ORA_SECURECONFIG
和 ORA_LOGON_FAILURES
。這些政策表示已在混合模式中啟用統一稽核功能。
SQL> select policy_name,enabled_option from AUDIT_UNIFIED_ENABLED_POLICIES;
POLICY_NAME ENABLED_OPTION
-------------------- ---------------
ORA_SECURECONFIG BY USER
ORA_LOGON_FAILURES BY USER
3.1 在混合模式中停用統一稽核
在混合模式中,統一稽核功能會透過使用兩個政策 (ORA_SECURECONFIG
和 ORA_LOGON_FAILURES
) 啟用。如要停用統一稽核功能,並讓資料庫使用標準稽核功能,請執行下列指令:
SQL> noaudit policy ORA_SECURECONFIG;
Noaudit succeeded.
SQL> noaudit policy ORA_LOGON_FAILURES;
Noaudit succeeded.
SQL> select policy_name,enabled_option from AUDIT_UNIFIED_ENABLED_POLICIES;
no rows selected
3.2 啟用純統合稽核
如果您想停止使用預設的混合模式稽核,並只使用純粹的統一稽核,可以執行下列指令:
SQL> alter system set audit_trail='NONE' scope=spfile;
System altered.
QL> shu immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
[oracle@svr002 ~]$ cd $ORACLE_HOME/rdbms/lib
[oracle@svr002 lib]$ make -f ins_rdbms.mk uniaud_on ioracle
SQL> startup
ORACLE instance started.
Total System Global Area 6442448984 bytes
Fixed Size 8910936 bytes
Variable Size 1140850688 bytes
Database Buffers 5284823040 bytes
Redo Buffers 7864320 bytes
Database mounted.
Database opened.
SQL> SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';
VALUE
----------------------------------------------------------------
TRUE
3.3 使用 Oracle 統合稽核
統合稽核功能可讓您將稽核選項組合成簡單的稽核政策。您可以自行建立稽核政策,並設定多項權限。以下範例會建立簡單的稽核政策,稽核使用者的 create
table
權限。
SQL> create AUDIT POLICY policy_for_auditor PRIVILEGES create table WHEN 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'') = ''UNIFIED_AUDIT''' EVALUATE PER SESSION;
Audit policy created.
SQL> audit policy policy_for_auditor;
Audit succeeded.
SQL> conn unified_audit
Enter password:
Connected.
SQL> create table test (id char);
SQL> exit
[oracle@svr002 lib]$ sqlplus / as sysdba
SQL> COLUMN event_timestamp FORMAT A30
SQL> COLUMN dbusername FORMAT A10
SQL> COLUMN action_name FORMAT A20
SQL> COLUMN object_schema FORMAT A10
SQL> COLUMN object_name FORMAT A20
SQL> SELECT event_timestamp,dbusername,action_name,object_schema,object_name FROM unified_audit_trail WHERE dbusername ='UNIFIED_AUDIT';
EVENT_TIMESTAMP DBUSERNAME ACTION_NAME OBJECT_SCHEMA OBJECT_NAME
------------------------------ ---------- --------------- --------------- ----------
19-NOV-20 06.03.40.001665 AM UNIFIED_AUDIT CREATE TABLE UNIFIED_AUDIT TEST
4. 維護 Oracle BMS 中的稽核記錄
如果將 audit_trail
參數設為 DB
或 DB,EXTENDED
,稽核記錄會寫入位於 SYSTEM Tablespace
中的 SYS.AUD$
資料表。隨著 SYS.AUD$
資料表的擴增,SYSTEM tablespace
的空間會耗盡。如果將 audit_trail
參數設為 OS,XML
,稽核記錄會寫入儲存在 audit_file_dest
目錄中的 OS 檔案。
稽核記錄累積和不當的清理作業也會導致檔案系統空間不足。您需要定期清理 SYS.AUD$
資料表或 audit_file_dest
目錄。在統一稽核功能中,稽核記錄也會以 AUD$UNIFIED
寫入。如要清理,請執行下列任一操作:
- 將
audit_trail
資料表移至新的資料表空間,以清除 SYSTEM 資料表空間中的空間。 - 使用
DBMS_AUDIT_MGMT.create_purge_job
程序,定期清理包含稽核記錄的表空間和目錄。
4.1 將 audit_trail
資料表移至新的資料表空間
SQL> select table_name, tablespace_name from dba_tables where table_name='AUD$';
TABLE_NAME TABLESPACE_NAME
-------------------- ------------------------------
AUD$ SYSTEM
SQL> create tablespace audit_trail datafile '/apps/oracle/oracle_base/oradata/DBRMAN/audit.dbf' size 5M autoextend on;
Tablespace created.
SQL> begin
dbms_audit_mgmt.set_audit_trail_location(
audit_trail_type => dbms_audit_mgmt.audit_trail_aud_std,
audit_trail_location_value => 'AUDIT_TRAIL');
end;
/ 2 3 4 5 6
PL/SQL procedure successfully completed.
SQL> Select table_name, tablespace_name from dba_tables where table_name='AUD$';
TABLE_NAME TABLESPACE_NAME
-------------------- ------------------------------
AUD$ AUDIT_TRAIL
4.2 清除舊的稽核追蹤資料
清除稽核記錄前,請務必根據用途封存記錄。您可能只想保留特定期間的稽核記錄,在這種情況下,您不需要封存記錄,而是安排清除工作。
以下程序適用於標準稽核和統一稽核。
將 10 天前的稽核記錄複製到 GCS 值區 (選用)
如果客戶使用 Audit_Trail=OS,則所有稽核記錄都會儲存在 audit_file_dest
目錄中。客戶可以使用 gcloud storage cp
搭配自訂指令碼,找出超過 10 天的檔案並移至 Cloud Storage 值區。以下是指令碼範例:
#!/bin/sh
find /apps/oracle/oracle_base/admin/dbrman/adump -type f -mtime +10 | while read line
do
gcloud storage cp $line gs://oracle_backup_psoracle/audit
done
客戶可以使用上述指令碼,以及準備自訂指令碼,並使用 cron 排定這個指令碼的每日備份程序。如果客戶不想保留舊的稽核記錄,可以略過這個程序。
以下範例說明如何建立自動清除工作,每天執行並清除超過 10 天的稽核記錄:
步驟 1:初始化稽核基礎架構,並設定 10 天的預設間隔
SQL> begin
DBMS_AUDIT_MGMT.init_cleanup(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL,
default_cleanup_interval => 240 /* hours */);
END;
/
PL/SQL procedure successfully completed.
SQL > select * from dba_audit_mgmt_config_params where PARAMETER_NAME='DEFAULT CLEAN UP INTERVAL';
PARAMETER_NAME PARAM AUDIT_TRAIL
------------------------- ----- --------------------
DEFAULT CLEAN UP INTERVAL 240 STANDARD AUDIT TRAIL
DEFAULT CLEAN UP INTERVAL 240 FGA AUDIT TRAIL
DEFAULT CLEAN UP INTERVAL 240 OS AUDIT TRAIL
DEFAULT CLEAN UP INTERVAL 240 XML AUDIT TRAIL
步驟 2:建立每日封存時間戳記作業。
這項工作會指定 10 天的時間戳記,以便在清除舊稽核記錄時使用。
SQL> begin
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'DAILY_AUDIT_ARCHIVE_TIMESTAMP',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(AUDIT_TRAIL_TYPE =>
DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,LAST_ARCHIVE_TIME => sysdate-10); END;',
start_date => sysdate,
repeat_interval => 'FREQ=HOURLY;INTERVAL=24',
enabled => TRUE,
comments => 'Create an archive timestamp'
);
END;
/ 2 3 4 5 6 7 8 9 10 11 12 13
PL/SQL procedure successfully completed.
SQL > select AUDIT_TRAIL, LAST_ARCHIVE_TS, DATABASE_ID from dba_audit_mgmt_last_arch_ts;
AUDIT_TRAIL LAST_ARCHIVE_TS DATABASE_ID
-------------------- ----------------------------------- -----------
STANDARD AUDIT TRAIL 07-NOV-20 07.37.34.000000 AM +00:00 3990895662
步驟 3:建立每日清除工作,以便在 LAST_ARCHIVE_TS
之前清除所有資料
SQL> 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;
/
Commit;
SQL> col JOB_NAME FOR a30
SQL> col JOB_FREQUENCY FOR a40
SQL> select JOB_NAME,JOB_STATUS,AUDIT_TRAIL,JOB_FREQUENCY from DBA_AUDIT_MGMT_CLEANUP_JOBS;
JOB_NAME JOB_STAT AUDIT_TRAIL JOB_FREQUENCY
---------------------- -------- -------------------- ------------------------
DAILY_AUDIT_PURGE_JOB ENABLED STANDARD AUDIT TRAIL FREQ=HOURLY;INTERVAL=24
步驟 4:檢查 dba_scheduler_jobs
,查看新建立的 DAILY_AUDIT_ARCHIVE_TIMESTAMP
、DAILY_AUDIT_PURGE_JOB
和其時間表
SQL> col next_run_date FOR a50
SQL> select job_name, next_run_date, state, enabled from dba_scheduler_jobs where job_name like '%AUDIT%';
JOB_NAME NEXT_RUN_DATE STATE ENABLED
------------------------------ ------------------------------ --------- --------
DAILY_AUDIT_ARCHIVE_TIMESTAMP 18-NOV-20 07.37.33.000000 AM + SCHEDULED TRUE
00:00
DAILY_AUDIT_PURGE_JOB 18-NOV-20 07.44.35.744657 AM SCHEDULED TRUE
TC/UTC