トップ > DBA中級 > 6章
6章 統合監査
本章では統合監査についてご紹介していきます。

前章では今までOracleが提供していた監査についてご紹介してきました。
本章では12cでの新機能となる統合監査について学んでいきましょう。

統合監査と混在監査


従来の監査方法は、必須監査、標準監査、ファイングレイン監査など様々な監視方法があり、監視の設定もそれぞれの監視方法で異なり、監視の設定は複雑化しやすい傾向にありました。
12cでは、同じ監視の設定、監査結果も同じビューを参照することで監査方法が統合されました。

統合監査は従来の必須監査、標準監査、ファイングレイン監査に加え、DataPumpやRMANなどのツールを使用した場合にも監査を取得することが出来るようになりました。

現在の構成は以前の監査も使用できる混在監査モードとなっています。標準監査など
の従来の監査ではなく統合監査のみを使用するモードを統合監査モードと言います。

必須監査

混在監査モードから統合監査モードへの移行


現在12cでは混在監査モードがデフォルトですが、統合監査のみ使用できるように
変更が可能です。

  SQL> SELECT value FROM v$option
    2  WHERE parameter='Unified Auditing';

  VALUE
  -------------------
  FALSE
  

FALSEの場合、混在監査モードです。TRUEの場合は、統合監査モードです。

統合監査


統合監査の流れは以下の通りです。

1.監査ポリシーの作成
2.作成した監査ポリシーの監査を有効化
3.監査ログを確認

統合監査は監査ポリシーを作成し、有効化し、監査を開始します。
また事前定義されているポリシーが存在する為、そのポリシーを使用することも可能です。ファイングレン監査は詳細レベルでの監査が可能であり、イベントハンドラなども設定が出来る監査ですが、こちらも使用可能です。

監査ログへの書き込み方式


監査を有効にすると、ログを都度書き込む処理を行うため、パフォーマンス低下の懸念があります。
しかし、統合監査はデフォルトで監査レコードをシステム・グローバル領域(SGA)キューに書き込むことで、 パフォーマンスを向上させています。
キューにたまった監査レコードは一定時間経過するとSYSAUX表領域のAUDSYSスキーマ監査表に書き込みます。

性能は向上しますが、インスタンスがクラッシュした場合や、SHUTDOWN ABORT操作を実施した場合、監査レコードの一部が失われる場合があります。
監査レコードが消失することを望まない場合は、監査レコードがAUDSYSスキーマ監査表に即座に書き込まれるように監査証跡を構成できます。

使用可能な監査の書き込みモードは次のとおりです。

即時書込み
モード
すべての監査レコードが監査証跡に即座に書き込む。
データベースのパフォーマンスに影響する場合があり。
3秒に1度、SGAキューの85%を超えた場合に書き込む。
キュー書込み
モード
(デフォルト)
監査レコードをメモリーにキューし、AUDSYSスキーマ監査表に定期的に書き込む。SGAのキューサイズは、UNIFIED_AUDIT_SGA_QUEUE_SIZE初期化パラメータで指定可能。デフォルトのサイズは1MBで、1から30の範囲。


統合監査の権限


統合監査の管理には管理者権限(SYSDBA,DBAロール)で実施する必要がありますが、
監査用のロールを付与し、管理者でなくても権限管理を行うことができます。
ロールは以下の通りです。

AUDIT_ADMIN 監査ポリシーの作成、削除、変更、結果の確認
DBMS_AUDIT_MGMT,DBMS_FGAのEXECUTE権限
AUDIT_VIEWER 監査結果の確認


監査ポリシーの作成


監査ポリシーとは監査を行いたいアクティビティ(動作)を指定します。
どのようなことが実行されたら監査ログを取得するかをポリシーを設定し、決めます。
監査ポリシーの作成はCREATE AUDIT POLICY文で作成します。

[構文] 統合監査ポリシーの作成
 SQL> CREATE AUDIT POLICY ポリシー名
  2 [ PRIVILEGES システム権限,システム権限… |
  3  ACTIONS オブジェクト・アクション | ROLES ロール, ロール…]
  4 [WHEN 条件式 EVALUATE PER {STATEMENT|SESSION|INSTANCE}];

PRIVILEGES句は監視したい権限を指定します。その権限を使用したユーザの
監査レコードを取得します。

ACTIONS句は監視したいオブジェクト権限やアクションを指定します。例えば対象のテーブルをSELECTした場合などはこの句を使用します。

EVALUATE PER [STATEMENT|SESSION|INSTANCE]は以下の通り
STATEMENT 実行されるたびに監査ログを取得
SESSION 1セッションで1度だけ監査ログを取得
INSTANCE インスタンスが起動中1度だけ監査ログを取得

WHEN句には条件式を使用し、監査対象を絞り込むことができます。

WHEN 関数 演算子 値 [[OR|AND] 関数 演算子 値…]

使用可能な関数
数値関数: BITAND、CEIL、FLOOR、LN POWERなど
文字関数: CONCAT、LOWER、UPPER、LENGTH、INSTRなど
環境および識別子関数: SYS_CONTEXT、UIDなど

では実行例を見ていきましょう。

■CREATE SESSION,DROP ANY TABLE権限の監査

  SQL> CREATE AUDIT POLICY test1_policy
    2  PRIVILEGES CREATE SESSION,DROP ANY TABLE;

  Audit policy created.
  


■HR.EMPLOYEESに対しSELECT,DELETEを実行したときの監査

  SQL> CREATE AUDIT POLICY test2_policy
    2> ACTIONS SELECT,DELETE ON HR.EMPLOYEES
    3> WHEN 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''HR'''
    4> EVALUATE PER SESSION;

  Audit policy created.
  

その他のSYS_CONTEXT関数の使い方はマニュアル参照
Oracle DatabaseSQL言語リファレンス

■ IMP_FULL_DATABASE,EXP_FULL_DATABASEロールを監査

  SQL> CREATE AUDIT POLICY test3_policy
    2> ROLES IMP_FULL_DATABASE, EXP_FULL_DATABASE;

  Audit policy created.
  


■ すべて盛り込んだポリシーを作成

  SQL> CREATE AUDIT POLICY test4_policy
    2  PRIVILEGES CREATE SESSION,DROP ANY TABLE
    3  ACTIONS SELECT,DELETE ON HR.EMPLOYEES
    4  ROLES IMP_FULL_DATABASE, EXP_FULL_DATABASE
    5  WHEN 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''HR'''
    6  EVALUATE PER SESSION;

  Audit policy created.
  


作成ポリシー確認


作成したポリシーはAUDIT_UNIFIED_POLICIESビューで確認できます。

  SQL> SELECT policy_name,audit_condition,audit_option 
    2  FROM audit_unified_policies 
    3  WHERE policy_name LIKE '%TEST4%' ORDER BY 1;

  POLICY_NAME   AUDIT_CONDITION                             AUDIT_OPTION
  ------------- ------------------------------------------- -----------------
  TEST4_POLICY  SYS_CONTEXT('USERENV','SESSION_USER')='HR'  IMP_FULL_DATABASE
  TEST4_POLICY  SYS_CONTEXT('USERENV','SESSION_USER')='HR'  CREATE SESSION
  TEST4_POLICY  SYS_CONTEXT('USERENV','SESSION_USER')='HR'  DROP ANY TABLE
  TEST4_POLICY  SYS_CONTEXT('USERENV','SESSION_USER')='HR'  DELETE
  TEST4_POLICY  SYS_CONTEXT('USERENV','SESSION_USER')='HR'  SELECT

  6 rows selected.
  


監査ポリシーの有効化


作成した監査ポリシーはまだ有効化する必要があります。 有効化するとその監査ポリシーに従って監査レコードが取得されるようになります。
[構文] 統合監査ポリシー有効
 SQL> AUDIT POLICY ポリシー名
   2 [ BY ユーザ名 | EXCEPT ユーザ名 ]
   3 [ WHENEVER SUCCESSFUL | WHENEVER NOT SUCCESSFUL ];

BYは監査したいユーザ名を絞りたい場合に設定します。EXCEPTは指定したユーザを監査対象外とします。WHENEVERは監査ポリシーで指定した監査内容が失敗した場合、
もしくは成功した場合のみ監査ログを取得します。

  SQL> AUDIT POLICY TEST4_POLICY BY hr WHENEVER SUCCESSFUL;

  Audit succeeded.
  

無効化する場合はNOAUDITコマンドで実施可能です。

現在有効になっているポリシーはAUDIT_UNIFIED_ENABLED_POLICIESビュー
で確認できます。

  SQL> SELECT * FROM AUDIT_UNIFIED_ENABLED_POLICIES;

  USER_NAME  POLICY_NAME                    ENABLED_ SUC FAI
  ---------- ------------------------------ -------- --- ---
  HR         TEST4_POLICY                   BY       YES NO
  ALL USERS  ORA_SECURECONFIG               BY       YES YES
  

ORA_SECURECONFIGは事前定義済みのポリシーで、デフォルトで有効となっています。

事前定義済みのORA_SECURECONFIGポリシーは以下権限を監視するポリシーです。
ORA_SECURECONFIGポリシー
SESSION ALTER ANY TABLE, CREATE ANY TABLE, DROP ANY TABLE,
CREATE ANY PROCEDURE, DROP ANY PROCEDURE,
ALTER ANY PROCEDURE, GRANT ANY PRIVILEGE,
GRANT ANY OBJECT PRIVILEGE,GRANT ANY ROLE,
AUDIT SYSTEM, CREATE EXTERNAL JOB, CREATE ANY JOB,
CREATE ANY LIBRARY, EXEMPT ACCESS POLICY,
CREATE USER, DROP USER, ALTER DATABASE,
ALTER SYSTEM, CREATE PUBLIC SYNONYM,
DROP PUBLIC SYNONYM, CREATE SQL TRANSLATION PROFILE, CREATE ANY SQL TRANSLATION PROFILE, DROP ANY SQL TRANSLATION PROFILE, ALTER ANY SQL TRANSLATION PROFILE, TRANSLATE ANY SQL, EXEMPT REDACTION POLICY, PURGE DBA_RECYCLEBIN, LOGMINING, ADMINISTER KEY MANAGEMENT
ACTIONS ALTER USER, CREATE ROLE, ALTER ROLE, DROP ROLE,
SET ROLE, CREATE PROFILE, ALTER PROFILE,
DROP PROFILE, CREATE DATABASE LINK, ALTER DATABASE LINK, DROP DATABASE LINK, CREATE DIRECTORY, DROP DIRECTORY, CREATE PLUGGABLE DATABASE, DROP PLUGGABLE DATABASE, ALTER PLUGGABLE DATABASE, EXECUTE ON DBMS_RLS;


監査ポリシーの削除


ポリシーの削除はDROP AUDITで削除が可能です。
不要になったポリシーは削除しましょう。

[構文] 統合監査ポリシーの削除
 SQL> DROP AUDIT POLICY ポリシー名;

監査結果の確認


監査結果はUNIFIED_AUDIT_TRAILで確認できます。

  SQL> SELECT ACTION_NAME,EVENT_TIMESTAMP 
    2  FROM UNIFIED_AUDIT_TRAIL;

  ACTION_NAME              EVENT_TIMESTAMP
  ------------------------ ---------------------------------
  LOGOFF                   10-JAN-14 02.21.51.129079 AM
  LOGOFF                   10-JAN-14 02.20.10.001567 AM
  LOGOFF                   10-JAN-14 02.13.26.770127 AM
  …
  
  38580 rows selected.
  

既にすごい監査レコードの量となっていました。事前定義済みのポリシー
ORA_SECURECONFIGはログイン、ログアウトを取得するので、これだけの量になるんですね。。

監査結果の削除


不要な監査ログは削除しましょう。手動で削除する方法はパッケージを使用します。

1.削除対象のログ時間を設定し、削除。設定した時間より前の監査ログが削除対象。

  SQL> BEGIN
    2  DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
    3  AUDIT_TRAIL_TYPE     =>  DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
    4  LAST_ARCHIVE_TIME    =>  '17-02-06 01:00:00');
    5  END;
    6  /
    
    PL/SQL procedure successfully completed.
    

2.1.の内容に従って、監査ログを削除。

  SQL> BEGIN
    2  DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
    3  AUDIT_TRAIL_TYPE     =>  DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED);
    4  END;
    5  /

    PL/SQL procedure successfully completed.
    

自動削除する場合は以下のパッケージを使用。

  SQL> BEGIN
    2  DBMS_AUDIT_MGMT.CREATE_PURGE_JOB (
    3  AUDIT_TRAIL_TYPE            => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, 
    4  AUDIT_TRAIL_PURGE_INTERVAL  => 12,
    5  AUDIT_TRAIL_PURGE_NAME      => 'Audit_Trail_PJ',
    6  USE_LAST_ARCH_TIMESTAMP     => TRUE,
    7  CONTAINER                   => DBMS_AUDIT_MGMT.CONTAINER_CURRENT);
    8  END;
    9  /

    PL/SQL procedure successfully completed.
    

レコードが大量になってしまう前に削除処理は定期的に実施しましょう。


統合監査の有効化、従来監査の無効化


統合監査のみ使用したい場合は、従来方法を無効にすることができます。

  $ cd $ORACLE_HOME/rdbms/lib
  $ make -f ins_rdbms.mk uniaud_on ioracle
  

統合監査を無効化する場合は

  $ cd $ORACLE_HOME/rdbms/lib
  $ make -f ins_rdbms.mk uniaud_off ioracle
  

上記設定後、DB再起動します。
統合監査が有効となっているかどうかはV$OPTIONで確認できます。

  SQL> SELECT value FROM v$option
    2  WHERE parameter='Unified Auditing';

  VALUE
  -------------------
  FALSE
  

以上が、統合監査についてのご紹介となります。