COL: CSS:



DB 操作の監査

不正なアクセスへの考慮

監査とは,ユーザのデータベース・アクションを監視 / 記録する処理のことを言う。実行された SQL 文の個々のアクション / ユーザー名 / アプリケーション / 時間などの様々な要因の組合せをベースとして使用できる。

指定したオブジェクト内の内容も含め,Oracle Database の指定の要素がアクセスまたは変更された場合,セキュリティ・ポリシーに基づき監査をトリガーすることができる。

監査のタイプには,以下のようなものがある。

  • 標準監査
  • 値ベース監査
  • ファイングレイン監査

標準監査

標準監査により取得できる情報には,監査対象イベントに関して例えば以下のようなものがある。

  • 発生したイベント
  • イベントの発生時間
  • イベントを起こしたユーザ情報

標準監査を有効にするためには以下の手順を実行する。

  1. 初期化パラメータファイル AUDIT_TRAIL 初期化パラメータに,監査証跡の取得方法を書く。
    /* Code060301: 監査証跡の取得方法に関する設定 */
    
    AUDIT_TRAIL = { none | os | db }
    
                 └← none: DB の監査を使用禁止
                        os: DB の監査を使用可能にし,監査レコードを OS の監査証跡に記載
                        db: DB の監査を使用可能にし,監査レコードを DB の監査証跡に記載
    
  2. AUDIT コマンドにより,監査オプションを構成する。

監査オプションのタイプは以下のように分けられる。

Table060301: 監査オプションのタイプ一覧
監査タイプ詳細
文監査タイプ別に SQL 文を監査する。例えば “AUDIT TABLE” とした場合,特定の表に対しての監査ではなく,数種類の DDL 文 (CREATE TABLE / DROP TABLE / TRUNCATE TABLE など) を発行した場合全てに,監査証跡が生成される。
権限監査システム権限の使用に関する監査。監査対象は文監査より限定されていて,特定のアクションだけを監査証跡に残す。
オブジェクト監査特定のスキーマ・オブジェクトに対する文を監査する。指定したスキーマ・オブジェクトに対する,指定した単一の文だけしか監査できない。
セッション監査ユーザ・セッションを監査する。ユーザ名や,接続の成功 / 失敗等の条件で絞り込むこともできる。

以下に監査オプションの使用例を挙げる。

/* Code060302: 文監査 */

SQL> AUDIT TABLE;    ← TABLE 操作に関する DDL イベントを監査

SQL> AUDIT TABLE
        BY mike WHENEVER NOT SUCCESSFUL;
                   └←ユーザ "mike" が TABLE 操作に関する DDL イベントを起こし,
                       かつ,その操作に失敗した場合のみ,監査証跡に情報生成
/* Code060303: 権限監査 */

SQL> AUDIT SELECT ANY TABLE;
           └← "SELECT ANY TABLE" システム権限を持つユーザが発行した文全てが監査対象
/* Code060304: オブジェクト監査 */

SQL> AUDIT UPDATE ON mike.hoge;
           └← ユーザ "mike" の表 "hoge" に対しての UPDATE 操作をセッション毎に監査
                (= AUDIT UPDATE ON mike.hoge BY SESSION)

SQL> AUDIT UPDATE ON mike.hoge BY ACCESS;
           └← ユーザ "mike" の表 "hoge" に対しての UPDATE 操作をアクセス毎に監査
/* Code060305: セッション監査 */

SQL> AUDIT SESSION WHENEVER NOT SUCCESSFUL;
           └← セッションの確立に失敗したら監査

設定した監査オプションを確認するためのデータ・ディクショナリは以下の通り。

Table060302: 監査オプションのデータ・ディクショナリ一覧
データ・ディクショナリ詳細
ALL_DEF_AUDIT_OPTSデフォルトのオブジェクト監査オプションを表示
DBA_STMT_AUDIT_OPTS文監査オプションをユーザー別に表示
DBA_PRIV_AUDIT_OPTS権限監査オプションをユーザ別に表示
DBA_OBJ_AUDIT_OPTS全てのオブジェクト監査オプションを表示

監査の設定を済ませると Oracle Database のサーバプロセスは,監査オプションに合致した監査情報を記録し始める。記録した監査証跡を確認するためのデータ・ディクショナリは以下の通り。

Table060303: 監査証跡の記録されたデータ・ディクショナリ一覧
データ・ディクショナリ詳細
DBA_AUDIT_TRAIL全ての監査証跡の記録情報を確認
DBA_AUDIT_STATEMENTGRANT / REVOKE / AUDIT / NOAUDIT / ALTER SYSTEM 文の監査証跡レコードリスト
DBA_AUDIT_OBJECTオブジェクトの監査証跡レコードリスト
DBA_AUDIT_SESSIONCONNECT / DISCONNECT に関する監査証跡レコードリスト。

値ベース監査

DML 文によるデータ変更 (INSERT / UPDATE / DELETE) が行われた際の監査をするには,値ベース監査を行う。値ベース監査では,データベーストリガーを使用し,データ変更を監査証跡に格納する。

データの変更が行われる度にトリガーを呼び出すため,標準監査より負荷が高く,パフォーマンスへの影響が大きい。

/* Code060306: 値ベース監査 */

[ユーザ] ─→ [データの変更]                          ← 更新操作
             (INS / UPD / DEL)
                    
          [データベーストリガー]  [監査証跡]        ← 監査挙動

ファイングレイン監査 (FGA 監査)

ファイングレイン監査 (Fine-Grained Auditing)”を使用すると,値ベース監査よりもさらに細かく,表の行や列毎に監査を行うことができる。

監査対象できる SQL 文は,SELECT / INSERT / UPDATE / DELETE で,DBMS_FGA パッケージを使って監査対象の表 / ビューに対し “監査ポリシー” を設定し,独自の監査証跡に格納することができる。

/* Code060307: DBMS_FGA.ADD_POLICY プロシージャによる監査ポリシーの追加処理 */

SQL> DBMS_FGA.ADD_POLICY(                      ← 監査ポリシー追加プロシージャ
       OBJECT_SCHEMA => 'bar',                 ← 監査するオブジェクト・スキーマ
         OBJECT_NAME => 'hogehoge',            ← 監査するオブジェクトの名前
         POLICY_NAME => 'audit_bar_hoge',      ← 監査ポリシーの名前 (一意)
     AUDIT_CONDITION => 'FOO_CODE = 100'       ← 監査対象の条件
        AUDIT_COLUMN => 'FOO_ID');             ← アクセスチェックする列

PL/SQL プロシージャが正常に完了しました。
       └← 要約すると…
                  - 'FOO_CODE = 100 という条件を含む問合せがなされ,
                  - 操作対象列に 'FOO_ID' を含む SQL 文に関して監査する
/* Code060308: ex1 の監査ポリシーに引っかかる SQL 文 */

- SELECT FOO_ID FROM hogehoge WHERE FOO_CODE = 100;

- SELECT COUNT(*) FROM hogehoge WHERE FOO_CODE = 100;

- SELECT * FROM hogehoge;
/* Code060309: ex1 の監査ポリシーに引っかからない SQL 文 */

- SELECT FOO_NAME FROM hogehoge WHERE FOO_CODE = 100;
            └← 操作対象列に 'FOO_ID' を含まない

- SELECT FOO_ID FROM hogehoge WHERE FOO_CODE = 101;
            └← 問合せ条件が 'FOO_CODE = 100' を含まない

データベース管理者の監査

SYSDBA / SYSOPER システム権限を持つデータベース管理者ユーザは,データベースの起動 / 停止を行う権限を持つため,データベースが OPEN 以外の状態でも監視できなくてはならないので,管理者ユーザの監査証跡は Oracle Database の外部に用意する。

Oracle Database では,データベース管理者ユーザによるログインイベントは自動で取得される。

ログイン以外のイベントを監査に記録するには,AUDIT_SYS_OPERATIONS 初期化パラメータに TRUE を指定する。

監査ログは以下の場所に保存される。

  • Windows の場合,イベントログに保存される。
  • Linux の場合,以下の場所に保存される。
    /* Code060310: 監査ログの配置先 (Linux) */
    
    $ORACLE_HOME/rdbms/audit