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

監査とはデータベースの監視です。ログインした情報や実行したSQL文のログを
取得することができます。昨今セキュリティはデータベースでも重要視されており、
監査を残すことが必要となってきています。

この章を通して監視の種類や監査の取得方法を学んでいきましょう。

監査の種類


監査とはデータベースでユーザがどのような操作を行っていたのかを記録し、
セキュリティ問題が発生した時に記録から足跡を追えるようにすることです。

昨今、作業者がデータを持ち出して、情報漏えいなどの事件が発生しているので、
監査を行っていくことも多くなるかもしれません。
監査は操作ログを残すことができますが、パフォーマンスは若干低下しますので
ご注意ください。

また監査はOracle 12cで新機能が追加されました。

統合監査:12cからの監査方法。従来の複数ある監視を統合した監査方式
混合監査:11g以前からの複数の監視と統合監査の両方が使用可能。デフォルトの監査

Oracleが提供する監視方法は複数の種類があり、監視の捜査方法もそれぞれ異なります。12cからの統合監査は監査設定も監視結果の確認も同じコマンドで監視できるようになっている為、少し使い方が簡単になっています。

Oracleが従来から提供する監視方法は以下の方法があります。

・必須監査
・標準監査
・ファイングレン監査

色々な監査があり、少しとっつきにくいイメージはありますが、
絵を踏まえて、わかりやすくご紹介していきます。


必須監査


DB起動、停止、SYSDBA,SYSOPERでのログインは監査ファイルに記録されます。
監査ファイルはAUDIT_FILE_DEST初期化パラメータで設定されており、
デフォルトでは$ORACLE_BASE/admin/$ORACLE_SID/adumpに格納されます。

必須監査
この監査は必須であり無効化にすることはできません。
管理者のログインやDB起動停止の監査ログは必ず取得されます。

標準監査


標準監査は一般ユーザのログインやログアウト、使用した権限、
実行したSQLの監査ログを記録することができます。

必須監査


1. AUDIT_TRAIL初期化パラメータを設定


AUDIT_TRAILパラメータを設定します。AUDIT_TRAILパラメータは監査を有効
にし、監査ログをDB上のテーブルかOSファイルかを選ぶことができます。

AUDIT_TRAIL初期化パラメータ一覧
DB DBテーブルに監査ログを記録
DB,EXTENDED DBテーブルにSQL文を含めた監査ログを記録
OS OSファイルに監査ログを記録
OS,EXTENDED OSファイルにSQL文を含めた監査ログを記録
XML XMLファイルに監査ログを記録
XML,EXTENDED XMLファイルにSQL文を含めた監査ログを記録
NONE 監査を無効

AUDIT_TRAILパラメータの変更はDBを再起動する必要があります。

  SQL> alter system set audit_trail = DB,EXTENDED scope=spfile;

  System altered.

  SQL> shutdown immediate
  Database closed.
  Database dismounted.
  ORACLE instance shut down.

  SQL> startup
  
  ORACLE instance started.

  Total System Global Area  524288000 bytes
  Fixed Size                  2926320 bytes
  Variable Size             390072592 bytes
  Database Buffers          125829120 bytes
  Redo Buffers                5459968 bytes
  Database mounted.
  Database opened.
  
  SQL> show parameter audit_trail

  NAME                       TYPE        VALUE
  -------------------------- ----------- -----------------------
  audit_trail                string      DB, EXTENDED
  


2. AUDITコマンドで監査したい操作(監査ポリシー)を設定


次に監査を行いたい操作をAUDITコマンドで設定します。

  ■ ログイン失敗時に監査を取得
  SQL> AUDIT SESSION WHENEVER NOT SUCCESSFUL;
 
  Audit succeeded.
  
上記はログイン失敗時に監査を取得します。
SUCCESSFULを指定した場合はログイン成功時に監査を取得します。

  ■ hrスキーマのemployees表にSELECTした時に監査を取得
  SQL> AUDIT SELECT ON hr.employees BY ACCESS;

  Audit succeeded.
  
BY ACCESSは実行されるたびにログを取得します。
同じセッションで一度だけ取得したい場合は、BY SESSIONで取得します。

  ■DROP ANY TABLE権限を使用した場合に監査を取得
  SQL> AUDIT DROP ANY TABLE;

  Audit succeeded.
  

また設定した監査ポリシーを無効にしたい場合は、NOAUDITコマンドを使用して監査ポリシーを削除することができます。

設定した監査ポリシーはDBA_OBJ_AUDIT_OPTS,DBA_PRIV_AUDIT_OPTSで
確認できます。

  SQL> select * from DBA_PRIV_AUDIT_OPTS;

  USER_NAME  PROXY_NAME     PRIVILEGE              SUCCESS    FAILURE
  ---------- -------------- ---------------------- ---------- ----------
                            CREATE SESSION         NOT SET    BY ACCESS
                            DROP ANY TABLE         BY ACCESS  BY ACCESS     


上記はシステム権限の監査ポリシー設定の情報を表示します。
CREATE SESSION権限はログイン時に使用する権限です。

  SQL> select * from DBA_OBJ_AUDIT_OPTS;

  OWNER      OBJECT_NAME          OBJECT_TYPE    
  ---------- -------------------- --------------
  HR         EMPLOYEES            TABLE          

  ALT   AUD    INS   LOC   REN   SEL   UPD   REF EXE   CRE    FBK
  ----- -----  ----- ----- ----- ----- ----- --- ----- -----  -----
  -/-   -/-    -/-   -/-   -/-   A/A   -/-   -/- -/-   -/-    -/-
  

SEL列にA/Aとなっている為、SELECT文が実行された時、成功、失敗ともログを取得します。-/Aの場合は、失敗時のみとなります。A/-は成功時のみとなります。

これで設定は完了です。あとはユーザが操作時に監査を取得することができます。

3. DBA_AUDIT_TRAILビューで監査結果を確認


では監査ログを確認してみましょう。
監査ログはDBA_AUDIT_TRAILビューで確認することができます。

  SQL> SELECT username,timestamp,action_name,sql_text
    2  FROM dba_audit_trail;

  USER TIMESTAMP ACTION_NAME        SQL_TEXT
  ---- --------- ------------------ ------------------------------------------
  HR   10-SEP-17 SELECT             select * from employees where emp_id = 10
  HR   10-JAN-17 LOGOFF BY CLEANUP
  

AUDIT_TRAILパラメータをDB,EXTENDEDにするとSQL文も表示できます。

4. 不要な監査ログの削除


DBA_AUDIT_TRAILはビューであり、ログ(レコード)は自動的に削除されません。
実表はSYS.AUD$である為、不要なレコードは実表に対し、DELETEコマンドで削除
します。

  SQL> SELECT sessionid,sqltext FROM sys.aud$;

   SESSIONID SQLTEXT
  ---------- ----------------------------------------
     1680030
     1690029 select * from employees where id = 10

  SQL> delete from sys.aud$;

  2 rows deleted.

  SQL> commit;

  Commit complete.

  SQL> SELECT * FROM dba_audit_trail;

  no rows selected
  

以上が標準監査となります。標準監査はログインやSQL文まで監査ログとして取得できることがわかりました。

ファイングレイン監査


次はファイングレイン監査です。ファイングレイン監査も標準監査のオブジェクトアクセスに関する監査ログを取得することができます。

ファイングレイン監査のメリットはより絞り込みを行った監査が可能です。
例えばHRスキーマのEMPLOYEES表のEMP_IDが10のSALARY列にSELECTした場合は監査ログを取得するといったことが可能です。

また監査ログ取得後に、プログラムを実行させることもできるので、例えば監査取得時に管理者にメール通知を行うといったことも可能です。

1. 監査のポリシー設定


ファイングレイン監査を行う為にはファイングレンの監査ポリシーを設定します。
監査ポリシーの設定にはDBMS_FGAというOracleが提供しているPL/SQLパッケージを使用します。

[構文] ファイングレイン監査のポリシー設定
 SQL> BEGIN
  1>   DBMS_FGA.ADD_POLICY(
  2>   OBJECT_SCHEMA => 'HR',
  3>   OBJECT_NAME => 'EMPLOYEES',
  4>   POLICY_NAME => 'log_hr_employees',
  5>   ENABLE => TRUE,
  7>   HANDLER_MODULE => 'NOTICE_MAIL',
  6>   STATEMENT_TYPES => 'SELECT, DELETE',
  7>   AUDIT_CONDITION => 'EMP_ID = 10',
  8>   AUDIT_COLUMN => 'SALARY');
  9> END;
  10> /

ファイングレイン監査ポリシーの設定項目一覧
OBJECT_SCHEMA 監査するオブジェクトのスキーマを指定。
OBJECT_NAME 監査するオブジェクトの名前を指定。
POLICY_NAME 作成するポリシーの名前を指定。ポリシー名は一意にする。
ENABLE TRUEまたはFALSEを使用してポリシーを有効、無効に設定。デフォルトはTRUE
HANDLER_MODULE イベント・ハンドラの名前を指定。監査ログ取得と同時に実行するプログラムを指定。
STATEMENT_TYPES 監査対象のSQL文のタイプを指定。INSERT、UPDATE、DELETEまたはSELECTのみ。デフォルト値はSELECT
AUDIT_CONDITION 該当する行の条件を指定。
AUDIT_COLUMN 監査対象の1つ以上の列(非表示列も含む)を指定。

設定したポリシーはDBA_AUDIT_POLICIESで確認できます。

  SQL> SELECT * FROM DBA_AUDIT_POLICIES;

  OBJECT_SCH OBJECT_NAM POLICY_NAME       POLICY_TEXT     POLICY_COLUMN  
  ---------- ---------- ----------------- --------------- ---------------
  HR         EMPLOYEES  LOG_HR_EMPLOYEES  EMP_ID = 10     SALARY         

  ENA SEL   INS   UPD   DEL   AUDIT_TRAIL
  --- ----- ----- ----- ----- ------------
  YES YES   NO    NO    YES   DB+EXTENDED 
  

ファイングレン監査ポリシーを削除する場合は、DBMS_FGA.DROP_POLICYを使用します。

  SQL> BEGIN
    1>  DBMS_FGA.DROP_POLICY(
    2>   object_schema      => 'HR',
    3>   object_name        => 'EMPLOYEES',
    4>   policy_name        => 'log_hr_employees');
    5> END;
    6> /
    
  PL/SQL procedure successfully completed.
  

今までの標準監査とは違い設定方法がパッケージを使用しているため、
難しく感じますが、このファイングレイン監査は細かい設定や監査取得時のプログラム実行など様々なことを行うことができます。


2. 監査結果の確認


ファイングレン監査の結果はDBA_FGA_AUDIT_TRAILで確認ができます。
では、実際に確認してみます。まずは監査が取得されるようSQLを実行します。

  SQL> select salary from hr.employees where emp_id = 10;

      SALARY
  ----------
     6400000
     
  SQL> select salary from hr.employees where emp_id = 20;

      SALARY
  ----------
     4000000

今回はemp_idが10という制限で監査を行っているのでemp_id=10のSELECT文のみ監査に残っているはずです。
では次にDBA_FGA_AUDIT_TRAILを確認してみましょう。

  SQL> SELECT OS_USER,USERHOST,TIMESTAMP,DB_USER,SQL_TEXT
    2  FROM DBA_FGA_AUDIT_TRAIL;

  OS_USER    USERHOST        TIMESTAMP DB_USER   
  ---------- --------------- --------- ----------
  oracle     linux           XX-XXX-15 HR        
  
  SQL_TEXT
  --------------------------------------------------
  select salary from hr.employees where emp_id = 10
  

監査結果が残されていることを確認できました。


3. ファイングレイン監査ログの削除


ファイングレイン監査の結果も標準監査と同様自動的には削除されません。
ファイングレイン監査の結果を確認するDBA_FGA_AUDIT_TRAILビューの実表はSYS.FGA_LOG$となりますので、 不要なレコードは実表から削除してください。

監査ログが取得されていました。以上がファイングレイン監査についてのご紹介となります。本章では11g以前(12cでもデフォルト)の監査方法について学んできました。

監査によってビューが違っていたり、監査ポリシー設定もやり方が違い、監査を行うことのハードルが少し高く思います。 12cからの統合監査に移行することで監査ポリシー、監査結果の確認方法も同じ方法で出来るようになり、より監査を行いやすく変更されています。次章では統合監査について学んでいきます。