【Oracle】監査(AUDIT)機能の設定方法完全ガイド|伝統的監査・統合監査・FGA・監査ログ確認・設計例まで解説

【Oracle】監査(AUDIT)機能の設定方法完全ガイド|伝統的監査・統合監査・FGA・監査ログ確認・設計例まで解説 Oracle

Oracle の監査(AUDIT)機能は、「誰が・いつ・何をしたか」をデータベースレベルで記録する仕組みです。セキュリティインシデントの調査、不正アクセスの検出、コンプライアンス対応(PCI DSS / SOX / ISMS 等)に不可欠な機能です。

Oracle には伝統的監査(AUDIT 文)統合監査(Unified Audit / 12c 以降)の 2 つの方式があります。本記事では、両方式の違い、設定方法、監査ログの確認、FGA(ファイングレイン監査)の概要、そして実務での監査ポリシー設計例まで体系的に解説します。

この記事でわかること
・伝統的監査と統合監査(Unified Audit)の違い
・伝統的監査: 文レベル / 権限 / オブジェクト監査の設定方法
・統合監査: CREATE AUDIT POLICY によるポリシーベースの設定方法
・DBA_AUDIT_TRAIL / UNIFIED_AUDIT_TRAIL での監査ログ確認
・FGA(ファイングレイン監査)の概要
・監査ログのクリーンアップ
・コンプライアンス対応の監査ポリシー設計例
スポンサーリンク

伝統的監査と統合監査の比較

項目 伝統的監査(AUDIT 文) 統合監査(Unified Audit)
対応バージョン 全バージョン 12c 以降
設定方法 AUDIT / NOAUDIT 文 CREATE AUDIT POLICY + AUDIT POLICY
監査ログの格納先 SYS.AUD$(DB テーブル)/ OS ファイル AUDSYS.AUD$UNIFIED(統合テーブル)
確認ビュー DBA_AUDIT_TRAIL UNIFIED_AUDIT_TRAIL
FGA との統合 別管理 統合管理(同じビューで確認可能)
推奨 11g 以前の環境 12c 以降は統合監査を推奨
12c 以降は統合監査(Unified Audit)を推奨
統合監査は伝統的監査の全機能を包含し、FGA・SYS 監査・RMAN 監査などを1 つのビューで統合管理できます。新規構築では統合監査を選択してください。既存の伝統的監査からの移行も可能です。

監査の有効化(AUDIT_TRAIL パラメータ)

SQL(伝統的監査の有効化)
-- 現在の設定を確認
SHOW PARAMETER audit_trail;
-- audit_trail = NONE(デフォルト: 監査無効)

-- DB テーブルに記録(最も一般的)
ALTER SYSTEM SET audit_trail = DB SCOPE=SPFILE;

-- DB テーブル + 拡張情報(SQL テキスト含む)
ALTER SYSTEM SET audit_trail = DB,EXTENDED SCOPE=SPFILE;

-- OS ファイルに記録
ALTER SYSTEM SET audit_trail = OS SCOPE=SPFILE;

-- 設定変更後は DB 再起動が必要
SHUTDOWN IMMEDIATE;
STARTUP;
audit_trail 値 記録先 特徴
NONE 監査なし デフォルト。監査は無効
DB SYS.AUD$(DB テーブル) 最も一般的。SQL で検索可能
DB,EXTENDED SYS.AUD$ + SQL テキスト・バインド値 詳細な情報を記録(ストレージ注意)
OS OS ファイル(audit_file_dest) DBA でもログ改ざんが困難(セキュリティ重視)
XML XML ファイル OS + XML 形式で構造化
統合監査モードの確認
12c 以降では、デフォルトで「混合モード」(伝統的 + 統合の両方が動作)です。完全に統合監査に移行するには以下を実行します。
SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';
結果が TRUE なら統合監査が有効です。

伝統的監査の設定(AUDIT 文)

ログオン / ログオフの監査

SQL(ログオン監査)
-- 全ユーザーのログオンを監査
AUDIT SESSION;

-- 特定ユーザーのログオンのみ監査
AUDIT SESSION BY hr, scott;

-- 失敗したログオンのみ記録(不正アクセス検出)
AUDIT SESSION WHENEVER NOT SUCCESSFUL;

文レベルの監査(DDL / DML)

SQL(DDL / DML 監査)
-- CREATE TABLE / DROP TABLE を監査
AUDIT CREATE TABLE;
AUDIT DROP TABLE;

-- 全 DDL を監査
AUDIT CREATE ANY TABLE;
AUDIT ALTER ANY TABLE;
AUDIT DROP ANY TABLE;

-- 特定ユーザーの DDL のみ
AUDIT CREATE TABLE BY hr;

オブジェクトレベルの監査

SQL(特定テーブルへのアクセスを監査)
-- employees テーブルへの SELECT を監査
AUDIT SELECT ON hr.employees;

-- employees テーブルへの全 DML を監査
AUDIT INSERT, UPDATE, DELETE ON hr.employees;

-- 成功した操作のみ記録
AUDIT SELECT ON hr.employees WHENEVER SUCCESSFUL;

-- 失敗した操作のみ記録(権限不足エラー等)
AUDIT SELECT ON hr.employees WHENEVER NOT SUCCESSFUL;

監査の解除(NOAUDIT)

SQL(監査の解除)
-- ログオン監査を解除
NOAUDIT SESSION;

-- 特定テーブルの監査を解除
NOAUDIT SELECT ON hr.employees;

-- 全監査設定を確認
SELECT * FROM dba_stmt_audit_opts;   -- 文レベル
SELECT * FROM dba_obj_audit_opts;    -- オブジェクトレベル

統合監査(Unified Audit)の設定(12c 以降)

統合監査はポリシーベースで設定します。ポリシーを作成してから有効化する 2 ステップです。

SQL(統合監査ポリシーの作成と有効化)
-- (1) ポリシーを作成
CREATE AUDIT POLICY pol_logon_audit
    ACTIONS LOGON, LOGOFF;

-- (2) ポリシーを有効化(全ユーザー対象)
AUDIT POLICY pol_logon_audit;

-- 特定ユーザーのみ対象
AUDIT POLICY pol_logon_audit BY hr, scott;

-- 失敗のみ記録
AUDIT POLICY pol_logon_audit WHENEVER NOT SUCCESSFUL;
SQL(DML 監査ポリシー)
-- 特定テーブルへの DML を監査
CREATE AUDIT POLICY pol_emp_dml
    ACTIONS INSERT ON hr.employees,
            UPDATE ON hr.employees,
            DELETE ON hr.employees;

AUDIT POLICY pol_emp_dml;
SQL(権限監査ポリシー)
-- DBA 権限の使用を監査
CREATE AUDIT POLICY pol_dba_actions
    PRIVILEGES CREATE ANY TABLE, DROP ANY TABLE, ALTER USER;

AUDIT POLICY pol_dba_actions;
SQL(条件付きポリシー: 12c R2 以降)
-- 特定の IP アドレスからのアクセスのみ監査
CREATE AUDIT POLICY pol_external_access
    ACTIONS SELECT ON hr.employees
    WHEN 'SYS_CONTEXT(''USERENV'', ''IP_ADDRESS'') NOT IN (''10.0.0.1'', ''10.0.0.2'')'
    EVALUATE PER SESSION;

AUDIT POLICY pol_external_access;

ポリシーの無効化と削除

SQL
-- ポリシーを無効化
NOAUDIT POLICY pol_logon_audit;

-- ポリシーを削除
DROP AUDIT POLICY pol_logon_audit;

-- 現在のポリシー一覧を確認
SELECT policy_name, enabled_option, entity_name
FROM audit_unified_enabled_policies
ORDER BY policy_name;

監査ログの確認

伝統的監査: DBA_AUDIT_TRAIL

SQL(伝統的監査ログの確認)
-- 直近 24 時間の監査ログ
SELECT username, action_name, obj_name,
       timestamp, returncode, os_username, userhost
FROM dba_audit_trail
WHERE timestamp >= SYSDATE - 1
ORDER BY timestamp DESC;

-- ログイン失敗の一覧(不正アクセス調査)
SELECT username, userhost, os_username, timestamp, returncode
FROM dba_audit_trail
WHERE action_name = 'LOGON'
  AND returncode <> 0   -- 0 = 成功、それ以外 = 失敗
  AND timestamp >= SYSDATE - 7
ORDER BY timestamp DESC;

統合監査: UNIFIED_AUDIT_TRAIL

SQL(統合監査ログの確認)
-- 直近 24 時間の監査ログ
SELECT dbusername, action_name, object_name, object_schema,
       event_timestamp, return_code, os_username, userhost,
       unified_audit_policies
FROM unified_audit_trail
WHERE event_timestamp >= SYSDATE - 1
ORDER BY event_timestamp DESC;

-- 特定ポリシーのログだけ確認
SELECT dbusername, action_name, object_name, event_timestamp
FROM unified_audit_trail
WHERE unified_audit_policies LIKE '%POL_EMP_DML%'
  AND event_timestamp >= SYSDATE - 7
ORDER BY event_timestamp DESC;
列名(統合監査) 内容
DBUSERNAME 操作を実行した DB ユーザー名
ACTION_NAME 操作の種類(LOGON / SELECT / INSERT / CREATE TABLE 等)
OBJECT_SCHEMA / OBJECT_NAME 操作対象のスキーマ / オブジェクト名
EVENT_TIMESTAMP 操作の日時
RETURN_CODE 結果コード(0 = 成功、1017 = パスワード不正、942 = テーブル不在 等)
OS_USERNAME / USERHOST OS ユーザー名 / 接続元ホスト
SQL_TEXT 実行された SQL(DB,EXTENDED 設定時)
UNIFIED_AUDIT_POLICIES 該当した監査ポリシー名

FGA(ファイングレイン監査)の概要

FGA(Fine-Grained Auditing)は、「特定の列が参照された」「特定の条件に合致する行がアクセスされた」など、行/列レベルの細かい監査が可能です。

SQL(FGA ポリシーの作成)
-- 給与列が参照されたときだけ監査
BEGIN
    DBMS_FGA.ADD_POLICY(
        object_schema  => 'HR',
        object_name    => 'EMPLOYEES',
        policy_name    => 'FGA_SALARY_ACCESS',
        audit_column   => 'SALARY',
        audit_condition => 'DEPARTMENT_ID = 10',  -- 部門 10 のみ
        statement_types => 'SELECT, UPDATE'
    );
END;
/

-- FGA ログの確認
SELECT db_user, object_name, policy_name,
       sql_text, timestamp
FROM dba_fga_audit_trail
ORDER BY timestamp DESC;

FGA の詳しい活用方法は「ファイングレイン監査(FGA)と PL/SQL の活用」を参照してください。

監査ログのクリーンアップ

SQL(伝統的監査ログの削除)
-- 90 日以前の監査ログを削除
DELETE FROM sys.aud$ WHERE ntimestamp# < SYSDATE - 90;
COMMIT;
SQL(統合監査ログの削除: DBMS_AUDIT_MGMT)
-- クリーンアップの初期設定(初回のみ)
BEGIN
    DBMS_AUDIT_MGMT.INIT_CLEANUP(
        audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
        default_cleanup_interval => 720  -- 時間(30 日)
    );
END;
/

-- 手動クリーンアップ(90 日以前を削除)
BEGIN
    DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
        audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
        last_archive_time => SYSDATE - 90
    );
    DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
        audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
        use_last_arch_timestamp => TRUE
    );
END;
/
監査ログを放置するとテーブルが肥大化する
特に audit_trail=DB,EXTENDED では SQL テキストも記録されるため、監査ログテーブル(SYS.AUD$ / AUDSYS.AUD$UNIFIED)が急速に肥大化します。定期的なクリーンアップジョブの設定は必須です。詳細は「監査ログの保存先とローテーション」を参照。

監査ポリシーの設計例

監査対象 目的 設定例
ログオン / ログオフ 不正アクセス検出・アクセス記録 AUDIT SESSION / AUDIT POLICY pol_logon
ログイン失敗 ブルートフォース攻撃の検出 AUDIT SESSION WHENEVER NOT SUCCESSFUL
機密テーブルの SELECT 情報漏洩の追跡 AUDIT SELECT ON hr.employees
DBA 権限の行使 特権ユーザーの操作記録 AUDIT POLICY pol_dba_actions PRIVILEGES …
DDL(構造変更) テーブルの誤削除の追跡 AUDIT CREATE TABLE, DROP TABLE, ALTER TABLE
特定列へのアクセス(FGA) 給与・個人情報の参照追跡 DBMS_FGA.ADD_POLICY(audit_column => ‘SALARY’)
最低限設定すべき監査
(1) ログオン/ログオフ: 誰がいつ接続したかの基本記録
(2) ログイン失敗: 不正アクセスの早期検出
(3) DDL: テーブルの誤削除・構造変更の追跡
(4) 機密テーブルの DML: 個人情報や金融データへのアクセス記録
最初はこの 4 つから始め、コンプライアンス要件に応じて拡張してください。

実務パターン集

パターン(1): セキュリティ基本セット(統合監査)

SQL(基本的な監査ポリシーセット)
-- ログオン監査(全ユーザー + 失敗のみ別ポリシー)
CREATE AUDIT POLICY pol_logon ACTIONS LOGON;
AUDIT POLICY pol_logon;

CREATE AUDIT POLICY pol_logon_fail ACTIONS LOGON;
AUDIT POLICY pol_logon_fail WHENEVER NOT SUCCESSFUL;

-- DDL 監査
CREATE AUDIT POLICY pol_ddl
    ACTIONS CREATE TABLE, ALTER TABLE, DROP TABLE,
            CREATE INDEX, DROP INDEX, CREATE USER, DROP USER;
AUDIT POLICY pol_ddl;

-- 機密テーブルの DML 監査
CREATE AUDIT POLICY pol_sensitive_dml
    ACTIONS SELECT ON hr.employees,
            UPDATE ON hr.employees,
            DELETE ON hr.employees,
            SELECT ON finance.transactions;
AUDIT POLICY pol_sensitive_dml;

パターン(2): 不正アクセスの調査

SQL(ログイン失敗の分析)
-- 過去 7 日間のログイン失敗を IP 別に集計
SELECT userhost, dbusername,
       COUNT(*) AS fail_count,
       MIN(event_timestamp) AS first_attempt,
       MAX(event_timestamp) AS last_attempt
FROM unified_audit_trail
WHERE action_name = 'LOGON'
  AND return_code <> 0
  AND event_timestamp >= SYSDATE - 7
GROUP BY userhost, dbusername
ORDER BY fail_count DESC;

パターン(3): 特定ユーザーの操作履歴

SQL(ユーザーの全操作を時系列で確認)
-- 特定ユーザーの直近 24 時間の操作
SELECT event_timestamp, action_name,
       object_schema || '.' || object_name AS object,
       sql_text, return_code
FROM unified_audit_trail
WHERE dbusername = 'HR'
  AND event_timestamp >= SYSDATE - 1
ORDER BY event_timestamp;

よくある質問

Q監査を有効にするとパフォーマンスに影響しますか?
A監査はログの書き込みが発生するため、わずかなオーバーヘッドがあります。ただし統合監査はキュー方式で書き込むため影響は最小限です。全 SQL を audit_trail=DB,EXTENDED で記録すると影響が大きくなるため、必要な対象だけを監査するのがベストプラクティスです。
Q伝統的監査と統合監査はどちらを使うべきですか?
AOracle 12c 以降であれば統合監査(Unified Audit)を推奨します。ポリシーベースで管理しやすく、FGA / SYS 監査 / RMAN 監査を統合管理できます。11g 以前では伝統的監査(AUDIT 文)が唯一の選択肢です。
QSYS ユーザーの操作も監査できますか?
A伝統的監査では audit_sys_operations = TRUE に設定するとSYS / SYSDBA の操作が OS ファイルに記録されます。統合監査では SYS の操作もデフォルトで UNIFIED_AUDIT_TRAIL に記録されます。
Q監査ログはどのくらい保持すべきですか?
Aコンプライアンス要件によりますが、一般的には 90 日〜1 年 が目安です。PCI DSS では 1 年間の保持(直近 3 か月はすぐ参照可能)が要求されます。古いログはアーカイブして削除し、テーブルの肥大化を防いでください。
QWHENEVER SUCCESSFUL と WHENEVER NOT SUCCESSFUL の違いは?
AWHENEVER SUCCESSFUL: 操作が成功した場合のみ記録
WHENEVER NOT SUCCESSFUL: 操作が失敗した場合のみ記録(権限エラー等)
省略(デフォルト): 成功・失敗の両方を記録
不正アクセス検出にはログイン失敗(NOT SUCCESSFUL)の監査が特に重要です。
QFGA と通常の監査の違いは?
A通常の監査は「テーブルへの SELECT があった」というレベルで記録しますが、FGA は「特定の列にアクセスした」「特定の条件の行にアクセスした」という行/列レベルの細かい監査が可能です。機密情報(給与、個人情報等)の列アクセスを追跡する場合に使います。

まとめ

Oracle 監査機能の要点をまとめます。

やりたいこと 方法
ログオンを監査 伝統的: AUDIT SESSION / 統合: CREATE AUDIT POLICY … ACTIONS LOGON
特定テーブルの DML を監査 伝統的: AUDIT SELECT ON table / 統合: CREATE AUDIT POLICY … ACTIONS SELECT ON table
DDL を監査 伝統的: AUDIT CREATE TABLE / 統合: ACTIONS CREATE TABLE
権限の使用を監査 統合: PRIVILEGES CREATE ANY TABLE, …
列レベルの監査 FGA: DBMS_FGA.ADD_POLICY(audit_column => …)
監査ログの確認 伝統的: DBA_AUDIT_TRAIL / 統合: UNIFIED_AUDIT_TRAIL
監査ログのクリーンアップ DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL
監査ポリシーの一覧 AUDIT_UNIFIED_ENABLED_POLICIES

監査ログの保存先とローテーションは「監査ログの保存先とローテーションの設定方法」、FGA の詳細は「ファイングレイン監査と PL/SQL の活用」も併せて参照してください。