Oracle の統合監査(Unified Audit)は Oracle 12c で導入された新しい監査フレームワークです。従来の監査(Traditional Audit・AUDIT 文や DBMS_FGA)を統合して一元管理し、すべての監査ログを UNIFIED_AUDIT_TRAIL ビューで確認できます。
Oracle 21c 以降は統合監査がデフォルトで有効になっており、従来の監査は廃止予定です。セキュリティ・コンプライアンス要件を満たすために適切な監査ポリシーを設計することが重要です。
この記事でわかること
- Traditional Audit と Unified Audit の違い・監査モードの確認方法
- CREATE AUDIT POLICY で監査ポリシーを作成する方法
- AUDIT POLICY でポリシーをユーザーやセッションに適用する方法
- UNIFIED_AUDIT_TRAIL で監査ログを検索・分析する方法
- Fine-Grained Audit(DBMS_FGA)で条件付き監査を設定する方法
- 監査ログのパージ(DBMS_AUDIT_MGMT)で肥大化を防ぐ方法
Traditional Audit と Unified Audit の違い
| 項目 | Traditional Audit(旧) | Unified Audit(推奨) |
|---|---|---|
| 導入バージョン | Oracle 9i 以前から | Oracle 12c から(21c でデフォルト) |
| 監査ログの格納先 | AUD$(OS ファイルまたはDB)、FGA_LOG$ | AUDSYS.AUD$UNIFIED(UNIFIED_AUDIT_TRAIL) |
| 監査設定 | AUDIT 文(セッション・オブジェクト・権限ごと) | CREATE AUDIT POLICY でポリシーを作成して AUDIT POLICY で適用 |
| FGA との統合 | 別管理(DBMS_FGA) | 統合ビューで一元確認可能 |
| パフォーマンス | ログ書き込みが即時 | バッファリングにより即時でない場合あり(DBMS_AUDIT_MGMT で制御) |
| 将来性 | 廃止予定 | 推奨・継続サポート |
統合監査モードの確認と有効化
-- 現在の監査モードを確認する SELECT value FROM V$OPTION WHERE parameter = 'Unified Auditing'; -- TRUE: 統合監査が有効(Pure Unified Audit モード) -- FALSE: 混在モード(Traditional と Unified の両方が使える) -- Oracle 12c でのモード確認 -- デフォルトでは Mixed Mode(混在モード)で動作する -- Pure Unified Audit に移行するには Oracle バイナリの再リンクが必要(通常は不要) -- 混在モードでも統合監査ポリシーは使用可能 -- 現在有効なデフォルト監査ポリシーを確認する SELECT policy_name, enabled_opt, entity_name, entity_type, success, failure FROM AUDIT_UNIFIED_ENABLED_POLICIES ORDER BY policy_name; -- ORA_SECURECONFIG: Oracle が事前定義したセキュリティ設定監査ポリシー -- ORA_LOGON_FAILURES: ログイン失敗の監査ポリシー -- これらはデフォルトで有効になっている -- 事前定義の監査ポリシー一覧を確認する SELECT policy_name, object_schema, object_name, object_type FROM AUDIT_UNIFIED_POLICIES WHERE policy_name LIKE 'ORA_%' ORDER BY policy_name;
CREATE AUDIT POLICY で監査ポリシーを作成する
監査ポリシーの作成例
-- DML 操作を監査するポリシー(全ユーザーへの SELECT/INSERT/UPDATE/DELETE)
CREATE AUDIT POLICY audit_dml_policy
ACTIONS SELECT, INSERT, UPDATE, DELETE
ON hr.employees -- 特定テーブルへの操作を監査する
WHEN 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') != ''HR'''
EVALUATE PER SESSION;
-- WHEN 句: HR ユーザー以外の操作を監査する(特権ユーザーのアクセスを監視)
-- EVALUATE PER SESSION: セッションごとに1回ログ(頻繁な操作でも1行)
-- EVALUATE PER INSTANCE: インスタンスごとに1回(デフォルト)
-- EVALUATE PER ACCESS: アクセスごとに1行(詳細だがログが多い)
-- 権限の使用を監査するポリシー(システム権限)
CREATE AUDIT POLICY audit_priv_policy
PRIVILEGES CREATE USER, DROP USER, ALTER USER,
GRANT ANY PRIVILEGE, GRANT ANY ROLE;
-- ユーザー管理と権限付与の操作を監査する
-- DDL 操作を監査するポリシー
CREATE AUDIT POLICY audit_ddl_policy
ACTIONS CREATE TABLE, ALTER TABLE, DROP TABLE,
CREATE INDEX, DROP INDEX,
CREATE VIEW, DROP VIEW;
-- ログイン・ログアウトを監査するポリシー
CREATE AUDIT POLICY audit_logon_policy
ACTIONS LOGON, LOGOFF;
-- 失敗したログインも記録する(FAILED LOGON の監視)
-- 監査ポリシーを有効化する
AUDIT POLICY audit_dml_policy; -- すべてのユーザーに適用
AUDIT POLICY audit_dml_policy BY hr, scott; -- 特定ユーザーのみ
AUDIT POLICY audit_logon_policy BY USERS WITH GRANTED ROLES DBA; -- DBA ロール保持者
AUDIT POLICY audit_ddl_policy WHENEVER NOT SUCCESSFUL; -- 失敗時のみ
-- 監査ポリシーを無効化する
NOAUDIT POLICY audit_dml_policy;
-- 監査ポリシーを削除する
DROP AUDIT POLICY audit_dml_policy;
UNIFIED_AUDIT_TRAIL で監査ログを確認する
UNIFIED_AUDIT_TRAIL の主要な検索クエリ
-- 直近の監査ログを確認する(直近50件)
SELECT event_timestamp, db_username, action_name,
object_schema, object_name, sql_text,
return_code, unified_audit_policies
FROM UNIFIED_AUDIT_TRAIL
ORDER BY event_timestamp DESC
FETCH FIRST 50 ROWS ONLY;
-- 特定ユーザーの操作を確認する
SELECT event_timestamp, action_name, object_schema, object_name,
sql_text, return_code
FROM UNIFIED_AUDIT_TRAIL
WHERE db_username = 'HR'
AND event_timestamp > SYSTIMESTAMP - INTERVAL '1' DAY
ORDER BY event_timestamp DESC;
-- 失敗した操作(エラー)を確認する
SELECT event_timestamp, db_username, action_name,
object_schema, object_name, return_code, sql_text
FROM UNIFIED_AUDIT_TRAIL
WHERE return_code != 0 -- エラーがあった操作
ORDER BY event_timestamp DESC;
-- return_code = 0: 成功, return_code != 0: Oracle エラーコード
-- ログイン失敗を確認する
SELECT event_timestamp, db_username, os_username, userhost,
action_name, return_code
FROM UNIFIED_AUDIT_TRAIL
WHERE action_name = 'LOGON'
AND return_code != 0
ORDER BY event_timestamp DESC;
-- DDL 操作の監査ログを確認する(テーブルの作成・削除)
SELECT event_timestamp, db_username, action_name,
object_schema, object_name, sql_text
FROM UNIFIED_AUDIT_TRAIL
WHERE action_name IN ('CREATE TABLE', 'DROP TABLE', 'ALTER TABLE')
ORDER BY event_timestamp DESC;
-- 権限付与の監査ログを確認する
SELECT event_timestamp, db_username, action_name, sql_text
FROM UNIFIED_AUDIT_TRAIL
WHERE action_name IN ('GRANT', 'REVOKE')
ORDER BY event_timestamp DESC;
-- 監査ログの件数と期間を確認する
SELECT action_name, COUNT(*) AS cnt,
MIN(event_timestamp) AS oldest,
MAX(event_timestamp) AS newest
FROM UNIFIED_AUDIT_TRAIL
GROUP BY action_name
ORDER BY cnt DESC;
Fine-Grained Audit(DBMS_FGA)で条件付き監査を設定する
FGA(Fine-Grained Audit)は SELECT などの操作に対して、特定の列を参照した場合だけや特定の WHERE 条件が成立した場合だけログを取る細粒度な監査機能です。一般的な AUDIT よりも細かい条件を指定できます。
DBMS_FGA で細粒度監査ポリシーを作成する
-- 特定列(salary)を参照した SELECT を監査する(個人情報・機密情報の保護)
BEGIN
DBMS_FGA.ADD_POLICY(
object_schema => 'HR',
object_name => 'EMPLOYEES',
policy_name => 'AUDIT_SALARY_ACCESS',
audit_column => 'SALARY,COMMISSION_PCT', -- この列が参照されたら監査する
audit_condition => NULL, -- NULL: 全行に適用
statement_types => 'SELECT', -- SELECT のみ監査する
enable => TRUE,
audit_column_opts => DBMS_FGA.ANY_COLUMNS -- SALARY か COMMISSION_PCT のどちらかを参照
-- audit_column_opts => DBMS_FGA.ALL_COLUMNS: 両方が参照された場合のみ
);
END;
/
-- 特定条件(department_id が 60 以外)の操作を監査する
BEGIN
DBMS_FGA.ADD_POLICY(
object_schema => 'HR',
object_name => 'EMPLOYEES',
policy_name => 'AUDIT_OTHER_DEPT_ACCESS',
audit_condition => 'DEPARTMENT_ID != 60', -- 条件が真の行が返された場合に監査
statement_types => 'SELECT, UPDATE'
);
END;
/
-- FGA ポリシーを無効化・有効化する
BEGIN
DBMS_FGA.DISABLE_POLICY(
object_schema => 'HR',
object_name => 'EMPLOYEES',
policy_name => 'AUDIT_SALARY_ACCESS'
);
DBMS_FGA.ENABLE_POLICY(
object_schema => 'HR',
object_name => 'EMPLOYEES',
policy_name => 'AUDIT_SALARY_ACCESS'
);
END;
/
-- FGA ポリシーを削除する
BEGIN
DBMS_FGA.DROP_POLICY(
object_schema => 'HR',
object_name => 'EMPLOYEES',
policy_name => 'AUDIT_SALARY_ACCESS'
);
END;
/
-- FGA ポリシーの一覧を確認する
SELECT object_schema, object_name, policy_name,
policy_column, pf_schema, pf_package, pf_function,
enabled, statement_types, audit_column_opts
FROM DBA_AUDIT_POLICIES;
-- 統合監査で FGA のログも UNIFIED_AUDIT_TRAIL に記録される(12c 以降)
SELECT event_timestamp, db_username, fga_policy_name,
object_schema, object_name, sql_text
FROM UNIFIED_AUDIT_TRAIL
WHERE fga_policy_name IS NOT NULL
ORDER BY event_timestamp DESC;
監査ログのパージ(DBMS_AUDIT_MGMT)で肥大化を防ぐ
監査ログは時間とともに蓄積して AUDSYS スキーマのテーブルが肥大化します。DBMS_AUDIT_MGMT でパージスケジュールを設定して定期的に削除します。
DBMS_AUDIT_MGMT で監査ログを管理する
-- 監査ログの保存先を確認する(DB 内 or OS ファイル)
SELECT parameter, value FROM DBA_AUDIT_MGMT_GLOBAL_CONF;
-- 監査ログのパージを初期化する(初回のみ必要)
-- UNIFIED_AUDIT_TRAIL のログを DB 内に保存する場合
BEGIN
DBMS_AUDIT_MGMT.INIT_CLEANUP(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
default_cleanup_interval => 24 -- 24時間ごとにパージを実行する
);
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;
/
-- パージの基準タイムスタンプを設定する(この日時以前のログを削除対象にする)
BEGIN
DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
last_archive_time => SYSTIMESTAMP - INTERVAL '90' DAY -- 90日より古いログを削除対象
);
END;
/
-- 手動でパージを実行する(即時削除)
BEGIN
DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
use_last_arch_timestamp => TRUE -- 基準タイムスタンプより古いものを削除
);
END;
/
-- パージジョブの状態を確認する
SELECT job_name, audit_trail, job_status, job_interval
FROM DBA_AUDIT_MGMT_CLEANUP_JOBS;
-- 監査ログの現在のサイズを確認する
SELECT segment_name, ROUND(bytes/1073741824, 2) AS size_gb
FROM DBA_SEGMENTS
WHERE owner = 'AUDSYS'
ORDER BY bytes DESC;
まとめ
- 統合監査(Unified Audit):Oracle 12c から導入。UNIFIED_AUDIT_TRAIL で一元的に監査ログを管理できる。21c 以降はデフォルト有効
- CREATE AUDIT POLICY:権限・アクション・オブジェクト単位で監査ポリシーを定義する。AUDIT POLICY コマンドで全体・特定ユーザー・ロール保持者へ適用できる
- UNIFIED_AUDIT_TRAIL:event_timestamp・db_username・action_name・sql_text・return_code で監査ログを確認できる。失敗操作は return_code != 0 でフィルタする
- DBMS_FGA(細粒度監査):特定列の参照や条件付き監査が可能。機密列(給与・個人情報)へのアクセスを条件付きで記録できる。12c 以降は UNIFIED_AUDIT_TRAIL にも記録される
- DBMS_AUDIT_MGMT(パージ):CREATE_PURGE_JOB と SET_LAST_ARCHIVE_TIMESTAMP で監査ログの自動削除を設定する。ログ保存期間はコンプライアンス要件に合わせて設定する
監査と合わせて検討すべきアクセス制御機能として、Oracle VPD(仮想プライベートデータベース)完全ガイドも参照してください。ユーザーの権限管理については Oracle ユーザー・権限・ロール完全ガイドを参照してください。