【Oracle】統合監査(Unified Audit)完全ガイド|CREATE AUDIT POLICY・UNIFIED_AUDIT_TRAIL・FGA(細粒度監査)まで解説

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 ユーザー・権限・ロール完全ガイドを参照してください。