ログマイナー再び!! その8
<ログマイナー再び!! その8>
ペンネーム: ぽっちゃりメタボン
読者の皆様こんにちは!!
あまりの寒さのため、震えが止まらないぽっちゃりメタボンです。
筆者は雪国出身ですが寒いのは大の苦手です。
サムサニモ、ネムケニモマケズ今週もはりきってはじめましょう。
▼ 前回のおさらい
ログマイナーをどのようなシチュエーションで使う事が効果的であるかを
2つの例をご紹介しながら実践的に考えてみました。
今回も、前回からの続きとなりますが、ログマイナーを使用した事後監査の
ポイントを探っていきます。
▼ 環境のおさらい
OS:Red Hat Enterprise Linux ES release 3
DB:10gR2(10.2.0.1)
▼ ログマイナーで解決しちゃう。パート2
★ テストデータ
以下のような表があるとします。
SQL> select * from 会計; A B ---------- ---------- 1 200199 2 407560 3 19355283 4 801240 5 1668690 6 1284900 7 16077355 8 20368920 9 1800486 10 2354990
★ 要件その3
「Audit Trailで取得している監査証跡とログマイナーの取得情報と結び
つけたい」
● ポイント
まずは監査証跡とお馴染みのv$logmnr_contentsで結合可能なキーがあるか
確認してみることにします。
SQL> desc v$logmnr_contents 名前 NULL? 型 ----------------------------------------- -------- ------------------ SCN NUMBER CSCN NUMBER TIMESTAMP DATE COMMIT_TIMESTAMP DATE THREAD# NUMBER LOG_ID NUMBER XIDUSN NUMBER XIDSLT NUMBER XIDSQN NUMBER PXIDUSN NUMBER PXIDSLT NUMBER PXIDSQN NUMBER RBASQN NUMBER RBABLK NUMBER RBABYTE NUMBER UBAFIL NUMBER UBABLK NUMBER UBAREC NUMBER UBASQN NUMBER ABS_FILE# NUMBER REL_FILE# NUMBER DATA_BLK# NUMBER DATA_OBJ# NUMBER DATA_OBJD# NUMBER SEG_OWNER VARCHAR2(32) SEG_NAME VARCHAR2(256) TABLE_NAME VARCHAR2(32) SEG_TYPE NUMBER SEG_TYPE_NAME VARCHAR2(32) TABLE_SPACE VARCHAR2(32) ROW_ID VARCHAR2(18) SESSION# NUMBER SERIAL# NUMBER USERNAME VARCHAR2(30) SESSION_INFO VARCHAR2(4000) TX_NAME VARCHAR2(256) ROLLBACK NUMBER OPERATION VARCHAR2(32) OPERATION_CODE NUMBER SQL_REDO VARCHAR2(4000) SQL_UNDO VARCHAR2(4000) RS_ID VARCHAR2(32) SEQUENCE# NUMBER SSN NUMBER CSF NUMBER INFO VARCHAR2(32) STATUS NUMBER REDO_VALUE NUMBER UNDO_VALUE NUMBER SQL_COLUMN_TYPE VARCHAR2(30) SQL_COLUMN_NAME VARCHAR2(30) REDO_LENGTH NUMBER REDO_OFFSET NUMBER UNDO_LENGTH NUMBER UNDO_OFFSET NUMBER DATA_OBJV# NUMBER SAFE_RESUME_SCN NUMBER XID RAW(8) (★) PXID RAW(8) AUDIT_SESSIONID NUMBER SQL> desc desc dba_audit_trail 名前 NULL? 型 ----------------------------------------- -------- ------------------ OS_USERNAME VARCHAR2(255) USERNAME VARCHAR2(30) USERHOST VARCHAR2(128) TERMINAL VARCHAR2(255) TIMESTAMP DATE OWNER VARCHAR2(30) OBJ_NAME VARCHAR2(128) ACTION NOT NULL NUMBER ACTION_NAME VARCHAR2(28) NEW_OWNER VARCHAR2(30) NEW_NAME VARCHAR2(128) OBJ_PRIVILEGE VARCHAR2(16) SYS_PRIVILEGE VARCHAR2(40) ADMIN_OPTION VARCHAR2(3) GRANTEE VARCHAR2(30) AUDIT_OPTION VARCHAR2(40) SES_ACTIONS VARCHAR2(19) LOGOFF_TIME DATE LOGOFF_LREAD NUMBER LOGOFF_PREAD NUMBER LOGOFF_LWRITE NUMBER LOGOFF_DLOCK VARCHAR2(40) COMMENT_TEXT VARCHAR2(4000) SESSIONID NOT NULL NUMBER ENTRYID NOT NULL NUMBER STATEMENTID NOT NULL NUMBER RETURNCODE NOT NULL NUMBER PRIV_USED VARCHAR2(40) CLIENT_ID VARCHAR2(64) ECONTEXT_ID VARCHAR2(64) SESSION_CPU NUMBER EXTENDED_TIMESTAMP TIMESTAMP(6) WITH TIME ZONE PROXY_SESSIONID NUMBER GLOBAL_UID VARCHAR2(32) INSTANCE_NUMBER NUMBER OS_PROCESS VARCHAR2(16) TRANSACTIONID RAW(8) (★) SCN NUMBER SQL_BIND NVARCHAR2(2000) SQL_TEXT NVARCHAR2(2000)
ふむ、どちらにも、トランザクション識別子
(dba_audit_trail.transactionid,v$logmnr_contents.xid)があることが確認
できます。
この値はインスタンス内では一意になりますので使えそうですね。
これをキーにdba_audit_trailとv$logmnr_contentsを結合できそうです。
期待通りの結果を得ることができるのか、実際にやってみましょう。
▼ 検証前の下ごしらえ
検証環境の audit_trail の設定は「DB_EXTENDED」です。
通常の監査証跡に加えて、SQL文やバインド変数も監査証跡へ書き込みます。
SQL> show parameter audit_trail NAME TYPE VALUE ------------------------------------ ----------- -------------------- audit_trail string DB_EXTENDED
また、現在の監査設定は以下のようになっており、会計テーブルに対して、DML
が発行された場合には監査対象となります。
SQL> select OWNER,OBJECT_NAME,DEL,INS,UPD from DBA_OBJ_AUDIT_OPTS; OWNER OBJECT_NAME DEL INS UPD ---------- ------------ ------- ------- ------- METABON 会計 A/A A/A A/A
▼ 検証開始
この状態から、会計.A = 1 のレコードに対して更新を行います。
SQL> update 会計 set b=b*2 where a=1;
いつものとおりログマイナーを起動し、v$logmnr_contentsと監査証跡を確認
可能なビュー dba_audit_trailをトランザクション識別子をキーに結合します。
SQL> select a.OS_USERNAME,a.USERNAME,b.TIMESTAMP, a.OBJ_NAME,a.USERHOST,a.SQL_TEXT, DBMS_LOGMNR.MINE_VALUE(REDO_VALUE,'METABON.会計.B') REDO_VALUE, DBMS_LOGMNR.MINE_VALUE(UNDO_VALUE,'METABON.会計.B') UNDO_VALUE from v$logmnr_contents b ,dba_audit_trail a where b.operation != 'INTERNAL' and b.seg_name = '会計' and b.xid = a.transactionid OS_USERNAME USERNAME TIMESTAMP OBJ_NAME USERHOST ------------ ---------- ----------------- ---------- ---------- ora102 METABON 07/11/12 06:27:00 会計 VMRH30 SQL_TEXT REDO_VALUE UNDO_VALUE ------------------------------- ------------ ------------ update 会計 set b=b*2 where a=1 400398 200199
ふむふむ。 ばっちり、結合ができました。
上記の結果を見ればお分かりいただけることと思いますが、「誰が」「いつ」
「どのオブジェクトに対して」「どこから」プラス(+)監査証跡のみでは取得
できない「更新前後の値」、ログマイナーデータのみでは取得できない「実行
SQL文」を確認することができました。監査または悪意のあるユーザによる
データ改ざんの追跡においても十分な力を発揮してくれそうです。
▼ まとめ
2回に渡って、より実践的な内容をお送りしてきましたがいかがでしたでし
ょうか。これによりログマイナーの活用シーンなど、新たに浮かんだ読者の方
がいらっしゃいましたら幸いです。
実装に当たっては負荷的な考慮など含め、充分な検証を行った上で使用される
ことをお勧め致します。
本シリーズも残り回数が少なくなってきました。
次回は本シリーズの総括の予定です。
今回はここまで!!
「オキヅケ」がなくなってしまった 茅ヶ崎より