【Oracle】監査ログの保存先とローテーション設定方法|DB テーブル・OS ファイル・統合監査・DBMS_AUDIT_MGMT・自動クリーンアップまで解説

【Oracle】監査ログの保存先とローテーション設定方法|DB テーブル・OS ファイル・統合監査・DBMS_AUDIT_MGMT・自動クリーンアップまで解説 Oracle

Oracle の監査ログは放置するとテーブルやディスクが肥大化し、パフォーマンス低下やディスク枯渇の原因になります。本記事では、監査ログの保存先の確認と変更DBMS_AUDIT_MGMT による自動クリーンアップ保持期間の設定まで解説します。

この記事でわかること
・伝統的監査(DB テーブル / OS ファイル)の保存先の確認と変更
・統合監査(UNIFIED_AUDIT_TRAIL)の保存場所
・DBMS_AUDIT_MGMT によるクリーンアップの初期設定
・自動クリーンアップジョブのスケジュール
・手動クリーンアップの方法
・OS 監査ファイルのローテーション
・監査ログ肥大化の予防策
スポンサーリンク

監査ログの保存先一覧

監査方式 保存先 確認方法
伝統的監査(DB) SYS.AUD$ テーブル(SYSTEM 表領域) SELECT COUNT(*) FROM sys.aud$
伝統的監査(OS) audit_file_dest パラメータのパス SHOW PARAMETER audit_file_dest
伝統的監査(XML) audit_file_dest + XML 形式 SHOW PARAMETER audit_file_dest
統合監査(12c+) AUDSYS.AUD$UNIFIED テーブル SELECT COUNT(*) FROM unified_audit_trail
SYS 操作の監査 audit_syslog_level または OS ファイル SHOW PARAMETER audit_sys_operations
SQL(保存先の確認)
-- 伝統的監査: DB / OS / XML のどれか
SHOW PARAMETER audit_trail;
-- DB: SYS.AUD$ テーブルに保存
-- OS: audit_file_dest の OS ファイルに保存
-- XML: audit_file_dest に XML ファイルで保存

-- OS 監査ファイルのパス
SHOW PARAMETER audit_file_dest;
-- 例: /oracle/admin/ORCL/adump

-- 統合監査が有効か確認
SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';
-- TRUE = 統合監査が有効

DB テーブルの監査ログサイズを確認する

SQL(監査テーブルのサイズ確認)
-- 伝統的監査テーブル SYS.AUD$ のサイズ
SELECT segment_name, ROUND(bytes/1024/1024, 1) AS size_mb
FROM dba_segments
WHERE segment_name = 'AUD$' AND owner = 'SYS';

-- 統合監査テーブルのサイズ
SELECT segment_name, ROUND(bytes/1024/1024, 1) AS size_mb
FROM dba_segments
WHERE segment_name LIKE 'AUD$UNIFIED%' AND owner = 'AUDSYS';

-- レコード数
SELECT COUNT(*) AS record_count FROM sys.aud$;
SELECT COUNT(*) AS record_count FROM unified_audit_trail;

-- 月ごとのレコード数推移
SELECT TO_CHAR(event_timestamp, 'YYYY-MM') AS month,
       COUNT(*) AS cnt
FROM unified_audit_trail
GROUP BY TO_CHAR(event_timestamp, 'YYYY-MM')
ORDER BY month;
SYS.AUD$ は SYSTEM 表領域にある
伝統的監査の SYS.AUD$ テーブルは SYSTEM 表領域に格納されます。監査ログが肥大化するとSYSTEM 表領域が枯渇し、データベース全体に影響を与えます。定期的なクリーンアップは必須です。

SYS.AUD$ を別の表領域に移動する

SYS.AUD$ を SYSTEM 表領域から専用の表領域に移動することで、肥大化時の影響範囲を限定できます。

SQL(AUD$ テーブルの移動)
-- (1) 専用表領域を作成
CREATE TABLESPACE audit_ts DATAFILE
    '/oracle/oradata/ORCL/audit_ts01.dbf' SIZE 2G AUTOEXTEND ON MAXSIZE 10G;

-- (2) AUD$ を移動(DBMS_AUDIT_MGMT 使用)
BEGIN
    DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(
        audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
        audit_trail_location_value => 'AUDIT_TS'
    );
END;
/

-- 統合監査テーブルの移動
BEGIN
    DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(
        audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
        audit_trail_location_value => 'AUDIT_TS'
    );
END;
/
SYS.AUD$ の移動は本番環境で推奨
SYSTEM 表領域の肥大化は DB 全体に影響するため、監査ログ専用の表領域に移動するのがベストプラクティスです。移動はオンライン(DB 稼働中)で実行可能です。

DBMS_AUDIT_MGMT によるクリーンアップ

初期設定(初回のみ)

SQL(クリーンアップの初期設定)
-- 統合監査のクリーンアップを初期化
BEGIN
    DBMS_AUDIT_MGMT.INIT_CLEANUP(
        audit_trail_type         => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
        default_cleanup_interval => 720  -- 時間(30 日)
    );
END;
/

-- 伝統的監査の場合
BEGIN
    DBMS_AUDIT_MGMT.INIT_CLEANUP(
        audit_trail_type         => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
        default_cleanup_interval => 720
    );
END;
/

-- 初期化状態の確認
SELECT audit_trail, cleanup_interval
FROM dba_audit_mgmt_config_params
WHERE parameter_name = 'DEFAULT CLEAN UP INTERVAL';

手動クリーンアップ

SQL(手動で古い監査ログを削除)
-- (1) アーカイブタイムスタンプを設定(この日時より前のログを削除対象にする)
BEGIN
    DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
        audit_trail_type  => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
        last_archive_time => SYSDATE - 90  -- 90 日以前を削除対象
    );
END;
/

-- (2) クリーンアップを実行
BEGIN
    DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
        audit_trail_type        => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
        use_last_arch_timestamp => TRUE
    );
END;
/

自動クリーンアップジョブの設定

SQL(自動クリーンアップの設定)
-- 自動クリーンアップジョブを作成(日次実行)
BEGIN
    DBMS_AUDIT_MGMT.CREATE_PURGE_JOB(
        audit_trail_type        => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
        audit_trail_purge_interval => 24,  -- 24 時間ごと
        audit_trail_purge_name  => 'UNIFIED_AUDIT_PURGE_JOB',
        use_last_arch_timestamp => TRUE
    );
END;
/

-- ジョブの状態を確認
SELECT job_name, job_status, audit_trail,
       job_frequency AS interval_hours
FROM dba_audit_mgmt_cleanup_jobs;
SQL(自動クリーンアップジョブの削除)
-- ジョブを削除
BEGIN
    DBMS_AUDIT_MGMT.DROP_PURGE_JOB(
        audit_trail_purge_name => 'UNIFIED_AUDIT_PURGE_JOB'
    );
END;
/

audit_trail_type の定数一覧

定数 対象
AUDIT_TRAIL_AUD_STD 伝統的監査(SYS.AUD$)
AUDIT_TRAIL_FGA_STD FGA 監査(SYS.FGA_LOG$)
AUDIT_TRAIL_UNIFIED 統合監査(AUDSYS.AUD$UNIFIED)
AUDIT_TRAIL_OS OS ファイル監査
AUDIT_TRAIL_XML XML 形式の OS ファイル監査
AUDIT_TRAIL_ALL 上記すべて

OS 監査ファイルのローテーション

audit_trail=OS / XML の場合、OS ファイルに監査ログが蓄積されます。OS レベルでの定期削除が必要です。

Shell(OS 監査ファイルの確認と削除)
# 監査ファイルの場所を確認
sqlplus / as sysdba -s <<EOF
SHOW PARAMETER audit_file_dest
EOF
# 例: /oracle/admin/ORCL/adump

# ファイル数とサイズの確認
ls -la /oracle/admin/ORCL/adump/ | wc -l
du -sh /oracle/admin/ORCL/adump/

# 90 日以上前の監査ファイルを削除
find /oracle/admin/ORCL/adump/ -name '*.aud' -mtime +90 -delete
find /oracle/admin/ORCL/adump/ -name '*.xml' -mtime +90 -delete
Shell(cron で OS ファイルを定期削除)
# crontab: 毎日 4:00 に 90 日以上前の監査ファイルを削除
0 4 * * * find /oracle/admin/ORCL/adump/ -name '*.aud' -mtime +90 -delete
OS 監査ファイルは DBMS_AUDIT_MGMT でも削除可能
OS ファイル形式の監査ログも DBMS_AUDIT_MGMT(audit_trail_type=AUDIT_TRAIL_OS)で管理できます。OS の find コマンドでの削除でも問題ありませんが、DBMS_AUDIT_MGMT に統一する方が管理が容易です。

保持期間の設定

要件 保持期間の目安 根拠
一般的な運用 90 日 直近 3 か月の操作を追跡可能
PCI DSS 1 年(直近 3 か月は即時参照可能) PCI DSS Requirement 10.7
SOX 法 7 年 財務データの監査証跡
ISMS / ISO 27001 組織のポリシーに依存 通常 1〜3 年
SQL(保持期間に基づくクリーンアップ設定の例)
-- 90 日保持: 90 日以前のログを自動削除
BEGIN
    -- アーカイブタイムスタンプを毎日更新するジョブと組み合わせ
    DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
        audit_trail_type  => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
        last_archive_time => SYSDATE - 90
    );
END;
/

-- 上記を毎日実行する DBMS_SCHEDULER ジョブ
BEGIN
    DBMS_SCHEDULER.CREATE_JOB(
        job_name   => 'JOB_SET_ARCHIVE_TS',
        job_type   => 'PLSQL_BLOCK',
        job_action => 'BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP('
                    || 'DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, SYSDATE-90); END;',
        start_date => TRUNC(SYSDATE) + 1 + 3/24,
        repeat_interval => 'FREQ=DAILY; BYHOUR=3',
        enabled    => TRUE
    );
END;
/

実務パターン集

パターン(1): 統合監査の完全なクリーンアップ設定

SQL(推奨設定: 初期化 + アーカイブTS + 自動ジョブ)
-- (1) 初期化
EXEC DBMS_AUDIT_MGMT.INIT_CLEANUP(DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, 720);

-- (2) 90 日保持のアーカイブタイムスタンプを設定
BEGIN
    DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
        DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, SYSDATE - 90);
END;
/

-- (3) 自動クリーンアップジョブ(日次)
BEGIN
    DBMS_AUDIT_MGMT.CREATE_PURGE_JOB(
        audit_trail_type        => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
        audit_trail_purge_interval => 24,
        audit_trail_purge_name  => 'DAILY_AUDIT_PURGE',
        use_last_arch_timestamp => TRUE
    );
END;
/

パターン(2): 伝統的監査 + OS ファイルの両方をクリーンアップ

Shell(統合スクリプト)
#!/bin/bash
# audit_cleanup.sh

# DB テーブルのクリーンアップ
sqlplus / as sysdba <<EOF
BEGIN
    DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
        DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, SYSDATE - 90);
    DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
        DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, TRUE);
END;
/
EOF

# OS ファイルの削除
find /oracle/admin/ORCL/adump/ -name '*.aud' -mtime +90 -delete

パターン(3): 緊急対応(テーブル肥大化時)

SQL(緊急: AUD$ を TRUNCATE)
-- SYSTEM 表領域が逼迫している場合の緊急対応
-- 注意: 監査ログが全件削除される
TRUNCATE TABLE sys.aud$;
TRUNCATE TABLE sys.fga_log$;

-- 統合監査の緊急削除
BEGIN
    DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
        DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, SYSDATE);
    DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
        DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, TRUE);
END;
/
TRUNCATE は最終手段
TRUNCATE TABLE sys.aud$ は監査ログを全件削除するため、コンプライアンス要件に抵触する可能性があります。SYSTEM 表領域の緊急空き確保が目的の場合のみ使用し、事前に必要なログを CSV 等にエクスポートしてから実行してください。

監査ログの監視

SQL(監査ログサイズの定期監視)
-- 監査テーブルのサイズとレコード数を確認
SELECT 'AUD$' AS trail,
       (SELECT ROUND(bytes/1024/1024) FROM dba_segments
        WHERE segment_name='AUD$' AND owner='SYS') AS size_mb,
       (SELECT COUNT(*) FROM sys.aud$) AS records
FROM DUAL
UNION ALL
SELECT 'UNIFIED',
       (SELECT ROUND(SUM(bytes)/1024/1024) FROM dba_segments
        WHERE segment_name LIKE 'AUD$UNIFIED%' AND owner='AUDSYS'),
       (SELECT COUNT(*) FROM unified_audit_trail)
FROM DUAL;

よくある質問

QSYS.AUD$ を SYSTEM 表領域から移動すべきですか?
A本番環境では移動を強く推奨します。AUD$ が肥大化すると SYSTEM 表領域が枯渇し、DB 全体が停止するリスクがあります。DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION で専用表領域に移動してください。
QDBMS_AUDIT_MGMT.INIT_CLEANUP は必須ですか?
Aはい。CLEAN_AUDIT_TRAIL や CREATE_PURGE_JOB を使う前に初期化が必須です。初期化せずにクリーンアップを実行すると ORA エラーが発生します。初期化は DB ごとに 1 回だけ実行すれば十分です。
QSET_LAST_ARCHIVE_TIMESTAMP はどういう意味ですか?
A「この日時より前のログは外部にアーカイブ済み」という宣言です。CLEAN_AUDIT_TRAIL に use_last_arch_timestamp=TRUE を指定すると、このタイムスタンプより前のログだけが削除されます。外部保管していなくても削除のための閾値として使えます。
QTRUNCATE TABLE sys.aud$ は安全ですか?
A動作自体は安全(DB は壊れない)ですが、監査ログが全件消えるため、コンプライアンス上の問題が生じる可能性があります。通常は DBMS_AUDIT_MGMT で保持期間を指定して段階的に削除するのが推奨です。TRUNCATE は SYSTEM 表領域枯渇時の緊急手段です。
Q統合監査のログはどのくらいのペースで増えますか?
A監査ポリシーの範囲と DB の利用頻度に依存します。ログオン監査のみなら 1 日数千件程度ですが、全 DML を監査すると 1 日数十万〜数百万件になることもあります。定期的にサイズを確認し、クリーンアップの頻度を調整してください。
QOS 監査ファイル(.aud)を削除しても DB に影響はありますか?
Aありません。OS 監査ファイルは書き込み専用で、DB は参照しません。古いファイルを find + delete で削除しても DB の動作に影響はありません。ただし DBA_AUDIT_TRAIL(audit_trail=OS 時)の検索結果からは消えます。

まとめ

監査ログの保存先とローテーションの要点をまとめます。

やりたいこと 方法
DB 監査ログのサイズ確認 SELECT bytes FROM dba_segments WHERE segment_name=’AUD$’
AUD$ を SYSTEM 表領域から移動 DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION
クリーンアップの初期化 DBMS_AUDIT_MGMT.INIT_CLEANUP
手動クリーンアップ SET_LAST_ARCHIVE_TIMESTAMP + CLEAN_AUDIT_TRAIL
自動クリーンアップ(日次) DBMS_AUDIT_MGMT.CREATE_PURGE_JOB
OS 監査ファイルの定期削除 find /path -name ‘*.aud’ -mtime +90 -delete(cron)
緊急時のテーブル全削除 TRUNCATE TABLE sys.aud$(最終手段)

監査機能の設定方法は「監査(AUDIT)機能の設定方法」も併せて参照してください。