35
DML AUDITING 株株株株株株株株株株株株株株株 株株株株株株株株株 株株 株株 1

Oracle DML Auditing Technique

  • Upload
    -

  • View
    775

  • Download
    5

Embed Size (px)

DESCRIPTION

Database Technology Showcase 2013発表資料

Citation preview

Page 1: Oracle DML Auditing Technique

DML AUDITING 株式会社インサイトテクノロジーコンサルティング部岸本 拓也

1

Page 2: Oracle DML Auditing Technique

DML = Data Manupilation Language

Insert,

Update,

Delete

2

Page 3: Oracle DML Auditing Technique

emp表に不正なデータがあったとしたら…

SQL> select * from emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ------------------------------ --------------------------- ---------- ---------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-DEC-80 800 20 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30 7566 JONES MANAGER 7839 02-APR-81 2975 20 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30 7698 BLAKE MANAGER 7839 01-MAY-81 2850 30 7782 CLARK MANAGER 7839 09-JUN-81 2450 10 7788 SCOTT ANALYST 7566 19-APR-87 3000 20 7839 KING PRESIDENT 17-NOV-81 5000 10 7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30 7876 ADAMS CLERK 7788 23-MAY-87 1100 20 7900 JAMES CLERK 7698 03-DEC-81 950 30 7902 FORD ANALYST 7566 03-DEC-81 3000 20 7934 MILLER CLERK 7782 23-JAN-82 1300 10 9999 KISHIMOTO CONS 01-MAY-03 5000000 10

3

Page 4: Oracle DML Auditing Technique

QUIZ?

4

Page 5: Oracle DML Auditing Technique

Agenda

•V$sql•Logmnr•Trigger•Audit•FGA

Unified Auditing

5

12c 新機能

Page 6: Oracle DML Auditing Technique

今日は DB 監査製品” PISO” の話はありません

6

Page 7: Oracle DML Auditing Technique

v$sql の特徴1. 共有プールに蓄積されている SQL 情報を参照する

V$ ビュー2. 取得できる情報 = 実行時間 ( キャッシュにロードされた

時間 ) 、実行した Oracle ユーザ、 SQL 文3. LRU アルゴリズムにより、最近使われていない SQL 情

報はキャッシュアウトされる (Aged-out)

select * from v$sql;

7

Page 8: Oracle DML Auditing Technique

v$sql やってみたSelect a.username,s.first_load_time,s.sql_fulltext from v$sql s,all_users a

where a.user_id=s.PARSING_USER_ID

and lower(sql_fulltext) like ‘%emp%’;

USERNAME

------------------------------------------------------------------------------------------

FIRST_LOAD_TIME

-----------------------------------------------------------------------------------------------SQL_FULLTEXT

------------------------------------------------------------------------------------------------------XPRT

2011-10-12/11:35:39

insert into EMP(EMPNO,ENAME,JOB,HIREDATE,SAL,DEPTNO) values (9999,'KISHIMOTO','CONS',TO_DATE('20030501','YYYYMMDD'),5000000,10)

8

Page 9: Oracle DML Auditing Technique

Logmnr1. REDO ログや Archivelog ファイルから更新トランザク

ション情報を捕捉する機能2. 取得できるデータ : 実行時間 ,Oracle ユーザ名 ,SQL 文 ,

変更前後データ

9

Page 10: Oracle DML Auditing Technique

Logmnr 利用手順1. 対象の REDO ログ or Archivelog を指定するSQL> EXEC DBMS_LOGMNR.ADD_LOGFILE('+DISK_TABLE/lx50/onlinelog/group_1.257.730315617',DBMS_LOGMNR.NEW);

2. ディクショナリの指定SQL> EXEC dbms_logmnr.start_logmnr(OPTIONS=>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);

3. V$logmnr_contents によるデータ取得select * from v$logmnr_contents where seg_name='EMP‘

4. Logmnr の終了SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR;

10

Page 11: Oracle DML Auditing Technique

Logmnr やってみたSQL> select * from v$logmnr_contents where seg_name='EMP'; 88915714 10/11 14:43:00 10 31 10732 0A001F00EC290000 10 31 10732 0A001F00EC290000

DDL 5 0 XPRTEMPEMP 2 TABLE AAAAAAAAAAAAAAAAABUNKNOWNUNKNOWNUNKNOWN 0 0 0UNKNOWN 1 1 161 6 172 3 0 0 0 0 0 0 41891 1 0create table emp as select * from scott.emp;

0x0000a1.00000006.00ac 0 0 USER DDL (PlSql=0 RecDep=0) 0 16520 16521

88915958 10/11 14:45:06 7 3 10744 07000300F8290000 7 3 10744 07000300F8290000

INSERT 1 0 XPRTEMPEMP 2 TABLEXPRT AAAKOjAAHAAAD+5AAAUNKNOWNUNKNOWNUNKNOWN 0 0 0UNKNOWN 1 1 161 44 444 3 12583784 26 7098 7 7 16313 41891 0 41891insert into "XPRT"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('9999','KISHIMOTO','CONS',NULL,TO_DATE('05/01 00:00:00', 'mm/dd hh24:mi:ss'),'5000000',NULL,'10');delete from "XPRT"."EMP" where "EMPNO" = '9999' and "ENAME" = 'KISHIMOTO' and "JOB" = 'CONS' and "MGR" IS NULL and "HIREDATE" = TO_DATE('05/01 00:00:00', 'mm/dd hh24:mi:ss') and "SAL" = '5000000' and "COMM" IS NULL and "DEPTNO" = '10' and ROWID = 'AAAKOjAAHAAAD+5AAA'; 0x0000a1.0000002c.01bc 0 0 no supplemental log data found 3 16592 16593

11

Page 12: Oracle DML Auditing Technique

本番機で logmnrぐりぐりやったら怒られるよね(多分 )

1. ディクショナリを出力するディレクトリを指定 --初期化パラメタutl_file_dirにディレクトリの指定が必要BEGIN

DBMS_LOGMNR_D.build (

dictionary_filename => 'logmnr.log',

dictionary_location => '/tmp');

END;

/

1. ftp で redo log or archivelog を get

2. ftp でディクショナリファイルを get

3. 分析対象ログファイルを指定SQL> EXEC DBMS_LOGMNR.ADD_LOGFILE('/tmp/redo1.log',DBMS_LOGMNR.NEW);

4. ディクショナリファイルの指定SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'/tmp/logmnr.log');

5. v$logmnr_contents でデータ取得SQL> select * from v$logmnr_contents where seg_name='EMP';

対象 database

分析 database

対象 DB 分析 DB-ログデータ-ディクショナリデータ

対象 DB#2

12

Page 13: Oracle DML Auditing Technique

あのうち asmに REDO logあるんだけどSQL> select GROUP#,MEMBER from v$logfile;

GROUP# MEMBER

---------- ----------------------------------------------------------------------------------------------------

1 +DISK_TABLE/lx50/onlinelog/group_1.257.730315617

2 +DISK_TABLE/lx50/onlinelog/group_2.258.730315849

3 +DISK_TABLE/lx50/onlinelog/group_3.259.730316073

4 +DISK_TABLE/lx50/onlinelog/group_4.260.730316305

5 +DISK_TABLE/lx50/onlinelog/group_5.267.730320225

6 +DISK_TABLE/lx50/onlinelog/group_6.268.730320515

7 +DISK_TABLE/lx50/onlinelog/group_7.269.730320789

8 +DISK_TABLE/lx50/onlinelog/group_8.270.730321081

-asmcmd にてファイルシステムに COPY して下さい。ASMCMD> cp '+DISK_TABLE/lx50/onlinelog/group_1.257.730315617' /tmp/redo2.log

copying +DISK_TABLE/lx50/onlinelog/group_1.257.730315617 -> /tmp/redo2.log

13

Page 14: Oracle DML Auditing Technique

Logmnr   - ログファイル転送時の注意点 -

1. 分析対象と同じデータベース・キャラクタ・セットを使用している。    JA16EUCTILDE->AL32UTF8 はできた2. 同じハードウェアプラットフォームで稼動している。 3. DB_BLOCK_SIZE が同一である。 4. バージョンが R8.0 以上である。    10gR2->11gR2 でもできた

14

Page 15: Oracle DML Auditing Technique

↑ ここまで作りこみ不要

ここから作りこみ必要↓

15

Page 16: Oracle DML Auditing Technique

AuditOracle が提供する DB アクセス監査機能

設定手順# 初期化パラメタ audit_trail の設定 audit_trail=DB

# 監査の設定 audit insert,update,delete on xprt.emp; sys.aud$

監査ログAudit_file_destディレクトリ配下のファイル

or

16

Page 17: Oracle DML Auditing Technique

Audit やってみた -AUD$ 出力編 -# 初期化パラメタ audit_trail の設定  #audit_trail 変更時は DB 再起動が必要SQL> sho parameter audit_trail

NAME TYPE VALUE------------------------------------ --------------------------------- ------------------------------audit_trail string DB# 監査の設定SQL> audit insert,update,delete on xprt.emp;

Audit succeeded.

# 監査ログの確認 (DB アクセスの Who,Where,When,How が取得される )SQL> Select OS_USERNAME,USERNAME,USERHOST,TERMINAL,TIMESTAMP,OWNER,OBJ_NAME,SES_ACTIONS,SQL_TEXT from dba_audit_object;

oracle XPRT INSIGHT10-db1pts/110/13 15:42:31 XPRTEMP------S---------

oracleSCOTTINSIGHT10-db1pts/110/13 16:03:48 XPRTEMP------F---------

, EXTENDED

# 失敗したアクセスも取得されるconnect scottSQL> insert into xprt.emp(EMPNO,ENAME,JOB,HIREDATE,SAL,DEPTNO) …ORA-01031: insufficient privileges

insert into EMP(EMPNO,ENAME,JOB,HIREDATE,SAL,DEPTNO) values (9999,'KISHIMOTO','CONS',TO_DATE('20030501','YYYYMMDD'),5000000,10)

insert into xprt.EMP(EMPNO,ENAME,JOB,HIREDATE,SAL,DEPTNO) values (8888,'OBATA','CONS',TO_DATE('20030501','YYYYMMDD'),50,10)

17

Page 18: Oracle DML Auditing Technique

Auditやってみた -OSファイル出力編 -# 初期化パラメタ audit_trail の設定SQL> sho parameter audit

NAME TYPE VALUE------------------------------------ --------------------------------- ------------------------------audit_trail string OSaudit_file_dest string /u01/app/oracle/admin/ora112d/adump

# 監査の設定SQL> audit select on scott.emp;

Audit succeeded.

# 監査ログの確認 (DB アクセスの Who,Where,When が取得される )Audit file /u01/app/oracle/admin/ora112d/adump/ora112d1_ora_27606_1.audOracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit ProductionWith the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,Data Mining and Real Application Testing optionsORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1System name: LinuxNode name: RH5-64-112-node1-pRelease: 2.6.18-92.el5Version: #1 SMP Tue Apr 29 13:16:15 EDT 2008Machine: x86_64VM name: VMWare Version: 6Instance name: ora112d1Redo thread mounted by this instance: 1Oracle process number: 53Unix process pid: 27606, image: oracle@RH5-64-112-node1-p (TNS V1-V3)

Thu Oct 13 19:11:54 2011 +09:00LENGTH: "317"SESSIONID:[6] "163305" ENTRYID:[1] "1" STATEMENT:[2] "11" USERID:[5] "SCOTT" USERHOST:[18] "RH5-64-112-node1-p" TERMINAL:[5] "pts/1" ACTION:[3] "103" RETURNCODE:[1] "0" OBJ$CREATOR:[5] "SCOTT" OBJ$NAME:[3] "EMP" SES$ACTIONS:[16] "---------S------" SES$TID:[5] "75335" OS$USERID:[7] "ora112d" DBID:[10] "3195200308"

aud$ 表出力 or OS ファイル出力でもSelect 文によるアクセスでもログ取得が可能

18

Page 19: Oracle DML Auditing Technique

Audit やってみた  - 注意点 -監査ログ出力のオーバーヘッドにより、 DB アクセスが遅くなります。#audit 設定なしSQL> select * from scott.dept;Elapsed: 00:00:00.31

#audit 設定ありSQL> select * from xprt.dept;Elapsed: 00:00:00.72

19

Page 20: Oracle DML Auditing Technique

Audit 負荷検証 20

Page 21: Oracle DML Auditing Technique

Audit CPU 負荷検証結果 21

Page 22: Oracle DML Auditing Technique

Audit CPU 負荷検証結果 22

Page 23: Oracle DML Auditing Technique

FGA1. FGA(Fine Grained Auditing 機能 ) は

Audit よりきめ細やかな監査設定が可能2. EE 版限定機能3. Audit と同じで負荷は考慮する必要あり

23

Page 24: Oracle DML Auditing Technique

FGA やってみたSQL> BEGIN

DBMS_FGA.ADD_POLICY(

OBJECT_SCHEMA => 'SCOTT',

OBJECT_NAME => 'EMP',

STATEMENT_TYPES => 'INSERT,UPDATE,DELETE,SELECT',

AUDIT_COLUMN => 'SAL',

AUDIT_CONDITION => 'SAL>1000000 ,

POLICY_NAME => 'AUDIT_ACCESS_TO_EMP');

END;

/

SQL> SELECT * FROM dba_fga_audit_trail;

170557 11-10-17 SCOTT

piso112d

RH5-64-112-node1-p

piso112d

SCOTT

EMP

AUDIT_ACCESS_TO_EMP 6981053

insert into EMP(EMPNO,ENAME,JOB,HIREDATE,SAL,DEPTNO) values (9997,'KISHIMOTO','CONS',TO_DATE('20030501','YYYYMMDD'),5000000,10)

INSERT 11-10-17 10:49:16.906690 +09:00

1

16859 08000D0012090000 26 8

3195200308

24

Page 25: Oracle DML Auditing Technique

FGA やってみたBEGIN

DBMS_FGA.ADD_POLICY(

OBJECT_SCHEMA => 'SCOTT',

OBJECT_NAME => 'EMP',

STATEMENT_TYPES => 'INSERT,UPDATE,DELETE,SELECT',

AUDIT_COLUMN => 'SAL',

AUDIT_CONDITION => 'SAL>1000000 ,

POLICY_NAME => 'AUDIT_ACCESS_TO_EMP');

END;

/

SQL> select * from emp;

SQL> select timestamp,sql_text from dba_fga_audit_trail:

TIMESTAMP SQL_TEXT-------------- ----------------------------------------------------------------------------------------------10/17 11:08:19 select * from emp

SQL> insert into emp(empno,sal) values(8888,1000);SQL> insert into emp(empno,sal) values(7777,1000001);

10/17 11:33:21 insert into emp(empno,sal) values(7777,1000001)

⇦ 監査条件に合致しないので監査ログは取得されない

25

Page 26: Oracle DML Auditing Technique

DML Trigger1. DML trigger を作成し、セッション情報を捕捉することが

できる2. 自律型トランザクションの宣言をすればトランザクショ

ンに負荷を与えずにログ取得が可能 

Insert into emp values(…);

Commit/Roleback

トランザクション開始

トランザクション終了

Commit/Roleback

Trigger によりストアドプロシージャが実行される

トランザクション開始

トランザクション終了

~自律型トランザクション~

Insert into emp values(…);

Commit/Roleback

Trigger によりストアドプロシージャが実行される

トランザクション開始

トランザクション終了

~通常のトランザクション~

26

Page 27: Oracle DML Auditing Technique

DML Trigger やってみたcreate table audit_emp

( SDATE DATE

, USERNAME VARCHAR2(30)

, OSUSER VARCHAR2(30)

, TERMINAL VARCHAR2(30)

, MODULE VARCHAR2(48)

, EVENT VARCHAR2(10))

/

create or replace TRIGGER audit_emp_dml

before insert or update or delete on scott.emp

declare

PRAGMA AUTONOMOUS_TRANSACTION; -- 自律型トランザクションの宣言v_event varchar2(6);

begin

case

when inserting then

v_event := 'INSERT';

when updating then

v_event := 'UPDATE';

when deleting then

v_event := 'DELETE';

end case;

insert into scott.audit_emp values(

sysdate

,SYS_CONTEXT(‘USERENV’,‘SESSION_USER’) –Oracle ユーザ情報,SYS_CONTEXT(‘USERENV’,‘OS_USER’) --OS ユーザ情報,SYS_CONTEXT(‘USERENV’,‘TERMINAL’) - 端末情報,SYS_CONTEXT(‘USERENV’,‘MODULE’) -- モジュール情報,v_event);

commit;

end;

/

SQL> insert into EMP(EMPNO,ENAME,JOB,HIREDATE,SAL,DEPTNO) values (9999,'KISHIMOTO','CONS',TO_DATE('20030501','YYYYMMDD'),5000000,10);

SQL> select * from audit_emp

SDATE USERNAME OSUSER TERMINAL MODULE EVENT

-------------- ------------------------------ ------------------------------ ------------------------------ ------------------------------------------------ ----------

10/17 21:51:32 SCOTT oracle pts/3 SQL*Plus INSERT

27

Page 28: Oracle DML Auditing Technique

まとめ 1v$sql Logmnr DML Trigger

特徴共有プールにキャッシュされている SQL情報を v$sqlビューで取得

REDOログ ,Archivelogに記録されているトランザクションログを取得

DML Triggerを作成し、監査証跡をデータ出力

取得可能な監査証跡

実行時間Oracleユーザ名

SQL文

実行時間Oracleユーザ名

SQL文変更前データ変更後データ

実行時間Oracleユーザ名クライアント情報

(OSユーザ名 ,プログラム名 ,端末情報 )

イベント名(insert,update,delete,truncate,alter)

変更前データ変更後データ

メリット データ取得に際し、事前準備は不要データ取得に際し、事前準備は不要REDOログ ,Archivelogをコピーすれば別サーバ上で分析が可能

自律型トランザクションによりログを取得するようにすればトランザクションに直接影響を与えずにログ取得が可能

デメリット

監査証跡として取得できるデータは限られているインスタンス再起動もしくは時間が経つとキャッシュアウトされデータが取得ができなくなる

監査証跡として取得できるデータは限られている

データ量が多いので長期保存するには向かない

select文は取得できないsql文は取得できない

28

Page 29: Oracle DML Auditing Technique

まとめ 2  Audit FGA

特徴初期化パラメタ audit_trailを設定後、表単位で監査対象を選択

DBMS_FGAパッケージにて表のカラム ,

条件指定で監査対象データを指定

取得可能な監査証跡

実行時間Oracleユーザ名クライアント情報

(OSユーザ名 ,プログラム名 ,端末情報 )

SQL文

実行時間Oracleユーザ名クライアント情報

(OSユーザ名 ,プログラム名 ,端末情報 )

SQL文

メリット監査証跡データとして必要なアクセス記録(Who,When,Where,How)が取得できる

監査証跡データとして必要なアクセス記録(Who,When,Where,How)が取得できるカラム ,条件指定を利用すれば Auditより、きめ細やかな監査対象の指定ができる

デメリット Oracleの負荷を懸念する必要有Oracleの負荷を懸念する必要有EE版でないと機能は使えない

29

Page 30: Oracle DML Auditing Technique

12c 新機能 :Unified Auditing1. Audit 文で表毎に監査設定をする必要がない

-- ポリシの作成CREATE AUDIT POLICY dml_pol ACTIONS DELETE on hr.employees1,

INSERT on hr.employees2,UPDATE on hr.employees3, ALL on hr.departments;

-- 監査の開始Audit policy dml_pol except scott;

2. 事前設定は不要1) 初期化パラメタ audit_trail は設定不要2) ネットの記事などには以下のコマンドを実行する手順が掲載されているが、実行しなくても利用可能make -f ins_rdbms.mk uniaud_on ioracle ORACLE_HOME=$ORACLE_HOME※ デフォルト設定は下位互換性サポート=Mixed Mode Auditing• 12c のデータヘースは、従来の Audit と Unified Auditing の両方が使用可能• インストール時は、いすれも使用可能な Mixed モードで動作• Mixed モードの場合は、 AUDIT_SYS_OPERATION の SYSDBA のログファイルは 従来通り OS のディレクトリ上に

出力される• また、 RMAN や Datapump 等のユーティリティのログは、 Unified Auditing に統合されない

3. 監査情報の拡張RMAN,Datapump など

4. FGA の機能は統合され、監査条件、除外条件の指定が可能5. 監査ログへの書込みはキュー書込みモードが採用され、パフォーマンスが向

30

Page 31: Oracle DML Auditing Technique

Unified auditing監査ログ書込み方式

31

Page 32: Oracle DML Auditing Technique

Unified auditingの新アーキテクチャ

32

Page 33: Oracle DML Auditing Technique

負荷検証 in 12c on RHEL6.433

1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 410

20

40

60

80

100

No Audit

CPU使用率

1 5 9 13 17 21 25 29 33 37 41 45 49 53 570

102030405060708090

100

Immediate ModeCPU使用率

1 4 7 10 13 16 19 22 25 28 31 34 37 400

102030405060708090

100

Queue ModeCPU使用率

Page 34: Oracle DML Auditing Technique

ご清聴ありがとうございました

34

Page 35: Oracle DML Auditing Technique

35