在 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

您也可以只針對具備特定權限的特定物件啟用稽核功能,在這種情況下,系統只會記錄該物件專屬的稽核資訊。在下列範例中,稽核功能已在 selectdelete 資料表 AUDIT1.abcd 上啟用。插入、選取和刪除作業會在資料表上執行。由於只有 selectdelete 會受到稽核,因此插入作業不會記錄在稽核資料表中。

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 已停用。統合稽核設為 Falseaudit_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_SECURECONFIGORA_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_SECURECONFIGORA_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 參數設為 DBDB,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_TIMESTAMPDAILY_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