統合監査証跡の定期削除ジョブを試す（Oracle Database 19c）

# 監査証跡
Oracle Database には監査証跡を取得する機能があります。標準として使われる機能は「統合監査（Unified Auditing）」です。統合監査では監査証跡をAUDSYS ユーザーのAUD$UNIFIED テーブルに保存されます。このテーブルに保存される監査証跡は標準では自動削除されないため、不要になったら削除が必要になります。しかし、このテーブルに対する DELETE 文や TRUNCATE 文は管理者（SYS ユーザー、SYSTEM ユーザー）であっても許可されていません。

```SQL: 削除の拒否
SQL> CONNECT / AS SYSDBA
接続されました。
SQL> TRUNCATE TABLE AUDSYS.AUD$UNIFIED;
TRUNCATE TABLE AUDSYS.AUD$UNIFIED
                      *
行1でエラーが発生しました。:
ORA-46385: 表"AUDSYS"."AUD$UNIFIED"ではDMLおよびDDL操作は許可されていません。
```

# 監査証跡の削除方法
監査証跡の管理は DBA_AUDIT_MGMT パッケージを使います。このパッケージは AUDIT_ADMIN ロールを保有するユーザーで実行する必要があります。監査証跡の手動削除は CLEAN_AUDIT_TRAIL プロシージャを実行します。すべての監査証跡を削除するか、不要になった監査証跡のタイムスタンプを指定するかを決めます。不要になった監査証跡のタイムスタンプを指定するには SET_LAST_ARCHIVE_TIMESTAMP プロシージャを実行します。

```SQL: 不要になった監査証跡の指定
SQL> BEGIN
  2    DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
  3     AUDIT_TRAIL_TYPE     =>  DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
  4     LAST_ARCHIVE_TIME    =>  SYSTIMESTAMP -1,
  5     RAC_INSTANCE_NUMBER  =>  1,
  6     CONTAINER            => DBMS_AUDIT_MGMT.CONTAINER_CURRENT);
  7  END;
  8  /

PL/SQLプロシージャが正常に完了しました。
```

上記の例では現在時刻から LAST_ARCHIVE_TIME パラメーターを使って 1日より前の監査証跡を不要と判断しています。監査証跡の削除には CLEAN_AUDIT_TRAIL プロシージャを使います。USE_LAST_ARCH_TIMESTAMP に TRUE を指定すると、不要となった監査証跡のみを削除します。このパラメーターに FALSE を指定すると全監査証跡が削除されます。

```SQL: 監査証跡の削除
SQL> BEGIN
  2    DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
  3     AUDIT_TRAIL_TYPE           =>  DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
  4     USE_LAST_ARCH_TIMESTAMP    =>  TRUE,
  5     CONTAINER                  =>  DBMS_AUDIT_MGMT.CONTAINER_CURRENT );
  6  END;
  7  /

PL/SQLプロシージャが正常に完了しました。
```


# 監査証跡の自動削除方法
DBMS_AUDIT_MGMT パッケージの CREATE_PURGE_JOB プロシージャを使うと、監査証跡を定期的に削除するジョブを作成できます。

```SQL: 監査データの定期削除を行うジョブの作成
SQL> BEGIN
  2    DBMS_AUDIT_MGMT.CREATE_PURGE_JOB (
  3     AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
  4     AUDIT_TRAIL_PURGE_INTERVAL => 12,
  5     AUDIT_TRAIL_PURGE_NAME => 'PurgeAuditJob1',
  6     USE_LAST_ARCH_TIMESTAMP => FALSE,
  7     CONTAINER => DBMS_AUDIT_MGMT.CONTAINER_CURRENT);
  8  END;
  9  /

PL/SQLプロシージャが正常に完了しました。
```

上記の例はカレントのコンテナで、すべての統合監査データを12時間間隔で削除するジョブを作成しています。

|パラメーター名|説明|備考
|:---|:---|:---|
|AUDIT_TRAIL_TYPE|削除する監査証跡のタイプ、AUDIT_TRAIL_UNIFIED は統合監査||
|AUDIT_TRAIL_PURGE_INTERVAL|ジョブの実行間隔（時間単位）||
|AUDIT_TRAIL_PURGE_NAME|任意のジョブ名||
|USE_LAST_TIMESTAMP|削除対象のタイムスタンプを使う場合はTRUE、全監査データを削除する場合はFALSE||
|CONTAINER|ジョブ実行コンテナ||

AUDIT_TRAIL_TYPE に AUDIT_TRAIL_OS を指定しても、SYSLOG (Linux / UNIX) やイベントログ（Windows）に出力された監査証跡は削除されません。

CREATE_PURGE_JOB プロシージャを実行すると、以下のようなスケジューラー・ジョブが作成されます。

```SQL:作成されるスケジューラ・ジョブの情報
SQL> SELECT owner, job_name, job_style, program_name, job_type, job_action, job_priority,start_date,repeat_interval from dba_scheduler_jobs where job_name='PURGEAUDITJOB1';

OWNER      JOB_NAME             JOB_STYLE         PROGRAM_NA JOB_TYPE         JOB_ACTION                               JOB_PRIORITY
---------- -------------------- ----------------- ---------- ---------------- ---------------------------------------- ------------
START_DATE                               REPEAT_INTERVAL
---------------------------------------- --------------------
AUDSYS     PURGEAUDITJOB1       REGULAR                      PLSQL_BLOCK      BEGIN AUDSYS.DBMS_AUDIT_MGMT.CLEAN_AUDIT            3
                                                                              _TRAIL(51, FALSE, 1);  END;
24-02-05 15:05:54.365023 ASIA/TOKYO      FREQ=HOURLY;INTERVAL
                                         =12
```

|列名|値|備考|
|:---|:---|:---|
|OWNER|AUDSYS|固定値|
|JOB_NAME|PURGEAUDITJOB1|AUDIT_TRAIL_PURGE_NAME 設定値|
|JOB_STYLE|REGULAR|固定値|
|JOB_TYPE| PLSQL_BLOCK|固定値|
|JOB_ACTION|BEGIN AUDSYS.DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(51, FALSE, 1); END;||
|JOB_PRIORITY|3|固定値|
|START_DATE|{初回実行時刻}|計算値|
|REPEAT_INTERVAL|FREQ=HOURLY;INTERVAL=12|AUDIT_TRAIL_PURGE_INTERVAL指定値|

上記のように定期的に DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL プロシージャを実行するスケジューラ・ジョブが作成されることがわかります。

監査証跡削除ジョブを参照する専用のビューも提供されています。

```SQL: 監査証跡削除ジョブの確認
SQL> SELECT * FROM DBA_AUDIT_MGMT_CLEANUP_JOBS;

JOB_NAME             JOB_STAT AUDIT_TRAIL                  JOB_FREQUENCY             USE JOB_CON
-------------------- -------- ---------------------------- ------------------------- --- -------
PURGEAUDITJOB1       ENABLED  UNIFIED AUDIT TRAIL          FREQ=HOURLY;INTERVAL=24   NO  CURRENT

```


# 実行間隔の変更
削除間隔を変更する場合には DMBS_AUDIT_MGMT.SET_PURGE_JOB_INTERVAL プロシージャを実行します。以下の例では作成した PurgeAuditJob1 ジョブの実行間隔を 24 時間に変更しています。DBA_SCHEDULER_JOBS ビューの REPEAT_INTERVAL 列が変更されていることがわかります。

```SQL: 削除間隔の変更
SQL> BEGIN
  2    DBMS_AUDIT_MGMT.SET_PURGE_JOB_INTERVAL(
  3      AUDIT_TRAIL_PURGE_NAME => 'PurgeAuditJob1',
  4      AUDIT_TRAIL_INTERVAL_VALUE => 24 );
  5  END;
  6  /

PL/SQLプロシージャが正常に完了しました。

SQL> SELECT REPEAT_INTERVAL FROM DBA_SCHEDULER_JOBS WHERE JOB_NAME='PURGEAUDITJOB1';

REPEAT_INTERVAL
--------------------------------------------------------------------------------
FREQ=HOURLY;INTERVAL=24
```

Author: Noriyoshi Shinoda / Date: February 5, 2024