Audit Trailについての検証 その5

投稿日: 2003年9月03日

Oracleデータベースの監査機能である、Audit Trail に関する性能検証、機能検証をLevel1-4でまとめた人気コンテンツのeBook版。標準監査機能の基本から応用まで全8回で解説。

Level 1)Audit sessionなどによる文監査
Level 2)オブジェクト監査
Level 3)ファイングレイン監査 Basic
Level 4)ファイングレイン監査 Advanced

*eBook版のダウンロードをご希望の方は、画像をクリック

<Audit Trailについての検証 ~その5~>
ペンネーム ベロ

先週はちょっと寄り道をしてしまいましたが、今週は気を取り直しては9iから
の新機能「ファイングレイン監査」を見ていきたいと思います。

今までの監査では監査対象としてオブジェクトの指定しかできませんでした。
しかし、ファイングレイン監査を用いるとアクセスに対する監査で今までより
も、より細かな監査条件を設定することができます。
具体的な監査条件として、オブジェクトの指定に加えて以下の条件を指定する
ことができます。

□ 列の指定
   ファイングレイン監査では指定した列に対するアクセスのみを監査するこ
   とができます。

□ 条件の指定
   ファイングレイン監査ではSQL文の条件句(WHERE句)の形式で監査条件を指
   定することができます。

また、ファイングレイン監査では詳細な監査結果を記録することができます。

□ SYS.DBA_FGA_AUDIT_TRAILビュー
   監査結果は監査レコードとしてSYS.DBA_FGA_AUDIT_TRAILビューに記録さ
   れます。

□ イベント・ハンドラ
   SYS.DBA_FGA_AUDIT_TRAILビューとは別に、監査を行なった際にどのような
   記録を残すかをイベント・ハンドラとして自由に定義することができます。

ファイングレイン監査で用いられる監査ポリシーを設定するためにSYS.DBMS_FGA
パッケージが用意されています。監査ポリシーを定義することによって監査イ
ベントをトリガーするデータ・アクセス条件を指定することができます。

■ ADD_POLICYプロシージャ — 監査ポリシーを表やビューに設定します。
■ DROP_POLICYプロシージャ — 監査ポリシーを削除します。
■ ENABLE_POLICYプロシージャ — 監査ポリシーを有効化します。
■ DISABLE_POLICYプロシージャ — 監査ポリシーを無効化します。

注1) ファイングレイン監査ではCBOを利用した問合せのみがサポート対象となります。
^^^^^^^^^^^^^^^^^^^^^^^
RBOを利用した問合せを行なうと不要な監査レコードが発生します。
注2)監査機能の初期化パラメータ「AUDIT_TRAIL」とは無関係に監査を実施します。

今回はORABMユーザのCUSTOMER表に対し、C_IDカラムを以下の条件でSELECTした
場合に監査を行うような監査ポリシーを定義する。さらに、イベント・ハンドラ
として、詳細情報をファイルに出力するプロシージャを定義してみる。

【監査ポリシー】
  ORABM.CUSTOMER表に対してC_ID=30をWHERE句で指定したSELECT文に対して監査
  レコードを生成するとともに、詳細情報を監査ファイルに出力する。

【イベント・ハンドラ】
  監査ファイル「aud_obj.aud」に以下の内容を出力する。
    ファイル作成日付
    監査対象になったDBユーザ名
    監査対象になったOSユーザ名
    SQLを発行したホスト名
    SQLを発行したホストのIPアドレス
    実行したSQL
    FGAのポリシー名
    監査対象のスキーマ名
    監査対象のオブジェクト名
    
  ※ 初期化パラメータのutl_file_dirに適切な値を設定しておいてください。

では早速監査ポリシーの定義を行ってみよう。

analyze table customer compute statistics;

表が分析されました。

1. イベント・ハンドラの作成
^^^^^^^^^^^^^^^^^^^^^^^^^^^

create or replace procedure aud_obj_proc( ←(1)
   schema_name varchar2,
   table_name  varchar2,
   policy_name varchar2)
is
   file_id       utl_file.file_type;
   sdate         varchar2(19) := to_char(sysdate,'yyyy/mm/dd hh24:mi:ss');
   aud_file_path varchar2(64) := '/home/oracle/OraHome1/rdbms/audit';
   file_name     varchar2(20) := 'audit_obj.aud';
begin
   file_id := utl_file.fopen(aud_file_path,file_name,'A');

   utl_file.put_line(file_id,'');
   utl_file.put_line(file_id,sdate);
   utl_file.put_line(file_id,'ACTION : SELECT');
   utl_file.put_line(file_id,'DB USER: '||SYS_CONTEXT('USERENV','SESSION_USER'));
   utl_file.put_line(file_id,'OS USER: '||SYS_CONTEXT('USERENV','OS_USER'));
   utl_file.put_line(file_id,'HOST   : '||SYS_CONTEXT('USERENV','HOST'));
   utl_file.put_line(file_id,'IPADDR : '||SYS_CONTEXT('USERENV','IP_ADDRESS'));
   utl_file.put_line(file_id,'SQL_TXT: '||SYS_CONTEXT('USERENV','CURRENT_SQL'));
   utl_file.put_line(file_id,'POLICY : '||policy_name);
   utl_file.put_line(file_id,'SCHEMA : '||schema_name);
   utl_file.put_line(file_id,'OBJECT : '||table_name);

   utl_file.fclose(file_id);
end;
/

2. 監査ポリシーの定義
^^^^^^^^^^^^^^^^^^^^^

execute dbms_fga.add_policy(-             ←(2)
   object_schema   => 'orabm',-           --監査対象スキーマ指定
   object_name     => 'customer',-        --監査対象オブジェクト指定
   policy_name     => 'aud_obj_policy',-  --監査ポリシー指定
   audit_condition => 'c_id=30',-         --監査条件指定
   audit_column    => 'c_id',-            --監査カラム指定
   handler_schema  => 'orabm',-           --ハンドラプロシージャのスキーマ指定
   handler_module  => 'aud_obj_proc',-    --ハンドラプロシージャ名指定
   enable          => true);              --監査ポリシーを有効にする

(1)のイベント・ハンドラとして定義するプロシージャは3つの引数をとります。
それぞれの引数は順に、監査オブジェクトのスキーマ名、監査オブジェクト名、
監査ポリシー名です。

(2)の監査ポリシーの定義で、ポリシー名を「aud_obj_policy」として定義し、
イベント・ハンドラとして(1)で作成した「aud_obj_proc」を設定しています。

それでは、SQLをいくつか実行してみる・・・

(1).select c_id from customer where c_id = 30;
(2).select c_id from customer where c_id = 1;
(3).select c_data from customer where c_id = 30;
(4).select c_data from customer where c_id = 1;

実際に監査対象となったSQLをDBA_FGA_AUDIT_TRAILより検索

select to_char(timestamp,'yyyy/mm/dd hh24:mi:ss') timestamp
       ,db_user
       ,os_user
       ,object_schema
       ,object_name
       ,policy_name
       ,sql_text
from   dba_fga_audit_trail
order by timestamp;
TIMESTAMP            DB_US OS_US OBJECT_SCH OBJECT_NAM POLICY_NAM SQL_TEXT
-------------------- ----- ----- ---------- ---------- ---------- ----------
2003/09/01 18:09:42  ORABM kshin ORABM      CUSTOMER   AUD_OBJ_PO select c_i
                           kub                         LICY       d from cus
                                                                  tomer wher
                                                                  e c_id = 3
                                                                  0

2003/09/01 18:10:02  ORABM kshin ORABM      CUSTOMER   AUD_OBJ_PO select c_d
                           kub                         LICY       ata from c
                                                                  ustomer wh
                                                                  ere c_id =
                                                                   30

監査ポリシーとして定義したWHERE句の条件以外のSQLは監査されていないことが
わかる。(監査対象となるのは上記SQLの内(1)、(3)のみ)

更に先ほど設定したイベント・ハンドラにより作成されたファイルを確認してみる。

$ cat $ORACLE_HOME/rdbms/audit/aud_obj.aud
2003/09/01 18:09:42
ACTION : SELECT
DB USER: ORABM
OS USER: kshinkub
HOST   : INSIGHTKSHINKUB
IPADDR : xxx.xxx.xxx.xxx
SQL_TXT: select c_id from customer where c_id = 30
POLICY : AUD_OBJ_POLICY
SCHEMA : ORABM
OBJECT : CUSTOMER

2003/09/01 18:10:02
ACTION : SELECT
DB USER: ORABM
OS USER: kshinkub
HOST   : INSIGHTKSHINKUB
IPADDR : xxx.xxx.xxx.xxx
SQL_TXT: select c_data from customer where c_id = 30
POLICY : AUD_OBJ_POLICY
SCHEMA : ORABM
OBJECT : CUSTOMER

今回はイベント・ハンドラとして外部ファイルに監査履歴を残すプロシージャ
を定義しましたが、このプロシージャにより柔軟な監査が可能となります。

特定の重要なデータに対してこのような監査を実施し、定期的にファイルを監視
することが大事。システム初期段階は通常のAUDIT監査を実施し、もっと詳細かつ
柔軟に監査を行いたいという状況が発生した場合には有効な機能ではないでしょうか。

食欲の秋が待ち遠しい、茅ヶ崎より