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 |
-- 伝統的監査: 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 テーブルの監査ログサイズを確認する
-- 伝統的監査テーブル 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 表領域に格納されます。監査ログが肥大化するとSYSTEM 表領域が枯渇し、データベース全体に影響を与えます。定期的なクリーンアップは必須です。
SYS.AUD$ を別の表領域に移動する
SYS.AUD$ を SYSTEM 表領域から専用の表領域に移動することで、肥大化時の影響範囲を限定できます。
-- (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;
/
SYSTEM 表領域の肥大化は DB 全体に影響するため、監査ログ専用の表領域に移動するのがベストプラクティスです。移動はオンライン(DB 稼働中)で実行可能です。
DBMS_AUDIT_MGMT によるクリーンアップ
初期設定(初回のみ)
-- 統合監査のクリーンアップを初期化
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';
手動クリーンアップ
-- (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;
/
自動クリーンアップジョブの設定
-- 自動クリーンアップジョブを作成(日次実行)
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;
-- ジョブを削除
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 レベルでの定期削除が必要です。
# 監査ファイルの場所を確認 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
# crontab: 毎日 4:00 に 90 日以上前の監査ファイルを削除 0 4 * * * find /oracle/admin/ORCL/adump/ -name '*.aud' -mtime +90 -delete
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 年 |
-- 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): 統合監査の完全なクリーンアップ設定
-- (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 ファイルの両方をクリーンアップ
#!/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): 緊急対応(テーブル肥大化時)
-- 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 TABLE sys.aud$ は監査ログを全件削除するため、コンプライアンス要件に抵触する可能性があります。SYSTEM 表領域の緊急空き確保が目的の場合のみ使用し、事前に必要なログを CSV 等にエクスポートしてから実行してください。
監査ログの監視
-- 監査テーブルのサイズとレコード数を確認
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;
よくある質問
まとめ
監査ログの保存先とローテーションの要点をまとめます。
| やりたいこと | 方法 |
|---|---|
| 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)機能の設定方法」も併せて参照してください。

