Bare Metal Solution Oracle での Oracle データベースの監査

概要

データベースの監査とは、データベースで行われたアクションの記録、モニタリング、報告を行うプロセスです。これにより、セキュリティ監査者は、決められたポリシーに従ってデータベース ユーザーがデータベースを使用しているかどうか、また、ポリシー違反がないかどうかを確認できます。

Bare Metal Solution サーバーにホストされている Oracle データベースは、オンプレミス環境のすべての Oracle 標準監査手順をサポートします。制限はありません。監査ポリシーはビジネス要件に従って設定する必要があります。

このページでは、Oracle Bare Metal Solution でサポートされる監査ポリシーと、監査ログのハウスキーピングについて説明します。また、必要に応じて Cloud Storage バケットを使用して古い監査ログをアーカイブする方法についても説明します。

1. SYS ユーザーによる操作の監査

このセクションは、SYS / SYSDBA / SYSOPER によって実行されたアクティビティを監査するデータベース管理者を対象としています。

audit_sys_operations パラメータを使用すると、SYS / SYSDBA / SYSOPER によって発行されたすべてのステートメントを OS 監査証跡ファイルで監査できます。SYS ユーザーの監査を有効にするには、audit_sys_operations パラメータを TRUE に設定する必要があります。

SQL> show parameter audit

NAME                     TYPE                VALUE
------------------------------------ ------------------------------
audit_file_dest              string  /apps/oracle/oracle_base/admin
                         /dbrman/adump
audit_sys_operations             boolean     TRUE
audit_syslog_level           string
audit_trail              string  DB
unified_audit_common_systemlog       string
unified_audit_sga_queue_size         integer     1048576
unified_audit_systemlog          string

audit_sys_operations パラメータを設定すると、audit_file_dest に指定したディレクトリの監査ログファイルに sys レベルのすべての監査情報が記録されます。

次の例では、sys からサンプル ユーザーを作成しています。

[oracle@svr002 adump]$ sqlplus / as sysdba

SQL> create user audit_test identified by abcd1234;

関連する監査ログが audit_file_dest ディレクトリにあるかどうか確認します。この例では、データベース ユーザー /(OS ユーザー oracle、権限 sysdba)によって実行された 2 つの監査対象操作(接続とユーザーの作成)があります。

[oracle@svr002 ~]$ cd /apps/oracle/oracle_base/admin/dbrman/adump
[oracle@svr002 adump]$ ls -ltr
[oracle@svr002 adump]$ more dbrman_ora_12088_20211113064923842865549602.aud
Fri Nov 13 06:49:23 2021 +00:00
LENGTH : '268'
ACTION :[7] 'CONNECT'
DATABASE USER:[1] '/'
PRIVILEGE :[6] 'SYSDBA'
CLIENT USER:[6] 'oracle'
CLIENT TERMINAL:[5] 'pts/4'
STATUS:[1] '0'
DBID:[10] '3990895662'
SESSIONID:[10] '4294967295'
USERHOST:[17] 'svr002'
CLIENT ADDRESS:[0] ''
ACTION NUMBER:[3] '100'

Fri Nov 13 06:49:55 2021 +00:00
LENGTH : '299'
ACTION :[38] 'create user audit_test identified by *'
DATABASE USER:[1] '/'
PRIVILEGE :[6] 'SYSDBA'
CLIENT USER:[6] 'oracle'
CLIENT TERMINAL:[5] 'pts/4'
STATUS:[1] '0'
DBID:[10] '3990895662'
SESSIONID:[10] '4294967295'
USERHOST:[17] 'svr002'
CLIENT ADDRESS:[0] ''
ACTION NUMBER:[2] '51'

2. データベース標準監査

11g 以降では、デフォルトで監査が有効になっています。データベース監査を構成するには、audit_trail パラメータに次の表のいずれかの値を設定します。

パラメータ 説明
なし 監査が無効になっている
DB 監査が有効で、監査データが SYS.AUD$ テーブルに書き込まれます。
DB,EXTENDED DB として動作するが、SQL_TEXT 列と SQL_BIND 列にもデータを入力する
OS 監査が有効になります。Unix の場合、監査データは audit_file_dest に指定したディレクトリにあるテキスト ファイルに書き込まれます。Windows の場合、監査データはイベント ビューアに送信されます。
XML 監査が有効になり、監査データが audit_file_dest に指定したディレクトリにある XML ファイルに書き込まれます。これは、Windows と Unix の場合に使用できます。
XML,EXTENDED XML として動作しますが、SQL_TEXT 列と SQL_BIND 列にも値が取り込まれます。

必要に応じて、上記のいずれかのオプションを audit_trail に設定し、SYS.AUD$ テーブルまたは audit_file_dest ディレクトリに生成された監査ログファイルで監査対象のアクティビティを確認できます。

次の例では、ユーザー audit_test によってすべてのステートメントの監査が有効になり、ユーザーが行ったすべての操作がログに記録されます。

SQL> audit create table by audit_test;
Audit succeeded.
SQL> audit all by audit_test by access;

Audit succeeded.

SQL> conn audit_test
Enter password:
Connected.
SQL> show user
USER is "AUDIT_TEST"
SQL>
SQL> create table test (name char);

Table created.

SQL> insert into test values ('a');

1 row created.

SQL> exit

[oracle@svr002 adump]$ sqlplus / as sysdba

SQL> SELECT username,extended_timestamp,owner,obj_name,action_name FROM   dba_audit_trail where owner='AUDIT_TEST' order by timestamp;

USERNAME   EXTENDED_TIMESTAMP                OWNER      OBJ_NAME   ACTION_NAME
---------  -------------------            -----------   ---------  ------------
AUDIT_TEST 13-NOV-20 07.43.19.361519 AM +    AUDIT_TEST   TEST     CREATE TABLE
             00:00

AUDIT_TEST 13-NOV-20 07.43.34.679913 AM +    AUDIT_TEST   TEST       INSERT
              00:00

また、特定の権限を持つ特定のオブジェクトの監査を有効にすることもできます。その場合、そのオブジェクトに固有の監査情報のみがログに記録されます。次の例では、AUDIT1.abcd テーブルの selectdelete で監査が有効になっています。テーブルに対して挿入、選択、削除が実行されます。監査対象は selectdelete のみです。挿入オペレーションは監査テーブルに記録されません。

SQL> create user audit1 identified by abcd1234;
User created.
SQL> conn audit1
Enter password:
Connected.

SQL> create table abcd (id char);
Table created.
SQL> exit
[oracle@svr002 adump]$ sqlplus / as sysdba

SQL> audit select,delete on audit1.abcd;

Audit succeeded.
SQL> conn audit1
Enter password:
Connected.
SQL> insert into abcd values ('a');

1 row created.

SQL> /

1 row created.

SQL> select * from abcd;

I
-
a
a
SQL> delete from abcd;

2 rows deleted.

SQL> column username format a9
column owner format a5
column obj_name format a10
column action_name format a11
column sql_text format a40SQL> SQL> SQL> SQL>
SQL> select username, owner, obj_name,action_name from dba_audit_trail where owner='AUDIT1';

USERNAME     OWNER    OBJ_NAME   ACTION_NAME
-------------------  ----------   --------------
AUDIT1       AUDIT1     ABCD      SELECT
AUDIT1       AUDIT1     ABCD      DELETE

3. Oracle Database 統合監査

統合監査は Oracle 12c の新機能です。12c 以降の Oracle データベースでは混合モードの監査がデフォルトで使用されます。これにより、Oracle の標準監査に加え、統合監査の一部の監査ポリシーを使用できます。

デフォルトでは、新しい Oracle 12c データベースをインストールすると、V$option で統合監査が False として設定されますが、unified auditing が無効になっているわけではありません。統合監査は False に設定され、audit_trailDB に設定されています。これは、データベースが混合モードの監査を使用していることを意味します。

SQL> select parameter , value from v$option where PARAMETER = 'Unified Auditing';

PARAMETER              VALUE
-------------------- --------------------
Unified Auditing       FALSE

SQL> show parameter audit_trail

NAME                     TYPE    VALUE
------------------------------------ -----------
audit_trail              string  DB

混合モードの監査を使用すると、統合監査に習熟してから統合監査に完全に移行し、データベースの標準監査を無効にすることができます。混合モードの監査では、ORA_SECURECONFIGORA_LOGON_FAILURES の 2 つの統合監査ポリシーがデフォルトで有効になります。これらのポリシーは、統合監査が有効で、混合モードになっていることを示しています。

SQL> select policy_name,enabled_option from AUDIT_UNIFIED_ENABLED_POLICIES;

POLICY_NAME      ENABLED_OPTION
-------------------- ---------------
ORA_SECURECONFIG     BY USER
ORA_LOGON_FAILURES   BY USER

3.1 混合モードで統合監査を無効にする

混合モードでは、2 つのポリシー(ORA_SECURECONFIGORA_LOGON_FAILURES)を使用して統合監査を有効にします。統合監査を無効にして、データベースの標準監査を使用できるようにするには、次のコマンドを実行します。

SQL> noaudit policy ORA_SECURECONFIG;

Noaudit succeeded.

SQL> noaudit policy ORA_LOGON_FAILURES;

Noaudit succeeded.

SQL> select policy_name,enabled_option from AUDIT_UNIFIED_ENABLED_POLICIES;

no rows selected

3.2 統合監査のみを有効にする

デフォルトの混合モードの監査を終了し、統合監査のみを使用する場合は、次のコマンドを実行します。

SQL> alter system set audit_trail='NONE' scope=spfile;

System altered.

QL> shu immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

[oracle@svr002 ~]$ cd $ORACLE_HOME/rdbms/lib
[oracle@svr002 lib]$ make -f ins_rdbms.mk uniaud_on ioracle

SQL> startup
ORACLE instance started.

Total System Global Area 6442448984 bytes
Fixed Size          8910936 bytes
Variable Size        1140850688 bytes
Database Buffers     5284823040 bytes
Redo Buffers            7864320 bytes
Database mounted.
Database opened.

SQL> SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';

VALUE
----------------------------------------------------------------
TRUE

3.3 Oracle 統合監査を使用する

統合監査を使用すると、監査オプションをシンプルな監査ポリシーにまとめることができます。複数の権限を使用して独自の監査ポリシーを作成することもできます。次の例では、create table 権限でユーザーを監査するシンプルな監査ポリシーを作成しています。

SQL> create AUDIT POLICY policy_for_auditor PRIVILEGES create table WHEN    'SYS_CONTEXT(''USERENV'', ''SESSION_USER'') = ''UNIFIED_AUDIT''' EVALUATE PER SESSION;

Audit policy created.

SQL> audit policy policy_for_auditor;

Audit succeeded.

SQL> conn unified_audit
Enter password:
Connected.

SQL> create table test (id char);

SQL> exit

[oracle@svr002 lib]$ sqlplus / as sysdba

SQL> COLUMN event_timestamp FORMAT A30
SQL> COLUMN dbusername FORMAT A10
SQL> COLUMN action_name FORMAT A20
SQL> COLUMN object_schema FORMAT A10
SQL> COLUMN object_name FORMAT A20
SQL> SELECT event_timestamp,dbusername,action_name,object_schema,object_name FROM unified_audit_trail WHERE  dbusername ='UNIFIED_AUDIT';

EVENT_TIMESTAMP                DBUSERNAME    ACTION_NAME   OBJECT_SCHEMA  OBJECT_NAME
------------------------------ ---------- ---------------  --------------- ----------
19-NOV-20 06.03.40.001665 AM   UNIFIED_AUDIT  CREATE TABLE  UNIFIED_AUDIT    TEST

4. Oracle BMS での監査ログのメンテナンス

audit_trail パラメータが DB または DB,EXTENDED に設定されている場合、監査ログは SYSTEM Tablespace にある SYS.AUD$ テーブルに書き込まれます。SYS.AUD$ テーブルのサイズが増加すると、SYSTEM tablespace で使用可能なスペースが減少します。audit_trail パラメータを OS,XML に設定している場合、audit_file_dest ディレクトリに保存されている OS ファイルに監査ログが書き込まれます。

監査ログの蓄積や不適切なクリーンアップにより、ファイル システムがいっぱいになることもあります。SYS.AUD$ テーブルまたは audit_file_dest ディレクトリは定期的にクリーンアップする必要があります。統合監査では、AUD$UNIFIED にも監査レコードが書き込まれます。クリーンアップするには、次のいずれかを行います。

  • audit_trail テーブルを新しい表領域に移動して、SYSTEM 表領域内の空き領域を増やします。
  • DBMS_AUDIT_MGMT.create_purge_job プロセスを使用して、表領域と監査ログのあるディレクトリを定期的にクリーンアップします。

4.1 audit_trail テーブルを新しい表領域に移動する

SQL> select table_name, tablespace_name from dba_tables where table_name='AUD$';

TABLE_NAME                TABLESPACE_NAME
-------------------- ------------------------------
AUD$                           SYSTEM

SQL> create tablespace audit_trail datafile '/apps/oracle/oracle_base/oradata/DBRMAN/audit.dbf' size 5M autoextend on;

Tablespace created.

SQL> begin
 dbms_audit_mgmt.set_audit_trail_location(
  audit_trail_type            => dbms_audit_mgmt.audit_trail_aud_std,
  audit_trail_location_value  => 'AUDIT_TRAIL');
end;
/  2    3    4    5    6

PL/SQL procedure successfully completed.

SQL> Select table_name, tablespace_name from dba_tables where table_name='AUD$';

TABLE_NAME                 TABLESPACE_NAME
-------------------- ------------------------------
AUD$                         AUDIT_TRAIL

4.2 古い監査証跡データをパージする

監査ログをパージする前に、ユースケースに応じてログをアーカイブしておく必要があります。特定の期間の監査記録を維持する場合は、記録をアーカイブする必要はありません。その代わりに、パージジョブをスケジューリングします。

以下の手順は、標準監査と統合監査の両方に対応しています。

10 日以上前の監査ログを GCS バケットにコピーする(省略可)

Audit_Trail=OS を使用している場合、すべての監査ログは audit_file_dest ディレクトリに保存されます。カスタム スクリプトと一緒に gcloud storage cp を使用すると、10 日以上経過したファイルを検索して Cloud Storage バケット バケットに移動できます。次にスクリプトの例を示します。

#!/bin/sh
find /apps/oracle/oracle_base/admin/dbrman/adump -type f -mtime +10 | while read line
do
gcloud storage cp $line gs://oracle_backup_psoracle/audit
done

上述のスクリプトを使用することも、カスタム スクリプトを準備することもできます。また、cron を使用して、アーカイブ プロセスを毎日実行するようにスケジューリングできます。古い監査レコードを保持しない場合は、このプロセスをスキップできます。

次の例に、10 日を経過した監査ログを消去する自動パージジョブを作成し、このジョブを毎日実行する方法を示します。

ステップ 1: 監査インフラストラクチャを初期化してデフォルトの間隔を 10 日に設定する

SQL> begin
  DBMS_AUDIT_MGMT.init_cleanup(
    audit_trail_type         => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL,
    default_cleanup_interval => 240 /* hours */);
END;
/

PL/SQL procedure successfully completed.

SQL > select * from dba_audit_mgmt_config_params where PARAMETER_NAME='DEFAULT CLEAN UP INTERVAL';

PARAMETER_NAME            PARAM    AUDIT_TRAIL
------------------------- ----- --------------------
DEFAULT CLEAN UP INTERVAL  240   STANDARD AUDIT TRAIL
DEFAULT CLEAN UP INTERVAL  240   FGA AUDIT TRAIL
DEFAULT CLEAN UP INTERVAL  240   OS AUDIT TRAIL
DEFAULT CLEAN UP INTERVAL  240   XML AUDIT TRAIL

ステップ 2: 毎日実行するアーカイブ タイムスタンプ ジョブを作成する

このジョブでは、タイムスタンプを 10 日に設定し、古い監査レコードをパージします。

SQL> begin
  DBMS_SCHEDULER.CREATE_JOB (
    job_name   => 'DAILY_AUDIT_ARCHIVE_TIMESTAMP',
    job_type   => 'PLSQL_BLOCK',
    job_action => 'BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(AUDIT_TRAIL_TYPE =>
                   DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,LAST_ARCHIVE_TIME => sysdate-10); END;',
    start_date => sysdate,
    repeat_interval => 'FREQ=HOURLY;INTERVAL=24',
    enabled    =>  TRUE,
    comments   => 'Create an archive timestamp'
  );
END;
/  2    3    4    5    6    7    8    9   10   11   12   13

PL/SQL procedure successfully completed.

SQL > select AUDIT_TRAIL, LAST_ARCHIVE_TS, DATABASE_ID from dba_audit_mgmt_last_arch_ts;

AUDIT_TRAIL             LAST_ARCHIVE_TS                    DATABASE_ID
-------------------- -----------------------------------   -----------
STANDARD AUDIT TRAIL 07-NOV-20 07.37.34.000000 AM +00:00    3990895662

ステップ 3: LAST_ARCHIVE_TS より古いすべてのデータを毎日パージするジョブを作成する

SQL> begin
  DBMS_AUDIT_MGMT.CREATE_PURGE_JOB(
    AUDIT_TRAIL_TYPE           => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
    AUDIT_TRAIL_PURGE_INTERVAL => 24 /* hours */,
    AUDIT_TRAIL_PURGE_NAME     => 'Daily_Audit_Purge_Job',
    USE_LAST_ARCH_TIMESTAMP    => TRUE
  );
END;
/

Commit;

SQL> col JOB_NAME FOR a30
SQL> col JOB_FREQUENCY FOR a40
SQL> select JOB_NAME,JOB_STATUS,AUDIT_TRAIL,JOB_FREQUENCY from DBA_AUDIT_MGMT_CLEANUP_JOBS;

JOB_NAME               JOB_STAT AUDIT_TRAIL          JOB_FREQUENCY
---------------------- -------- -------------------- ------------------------
DAILY_AUDIT_PURGE_JOB  ENABLED  STANDARD AUDIT TRAIL FREQ=HOURLY;INTERVAL=24

ステップ 4: 新しく作成された DAILY_AUDIT_ARCHIVE_TIMESTAMPDAILY_AUDIT_PURGE_JOB とそのスケジュールを表示して dba_scheduler_jobs を確認する

SQL> col next_run_date FOR a50
SQL> select job_name, next_run_date, state, enabled from dba_scheduler_jobs where job_name like '%AUDIT%';

JOB_NAME                          NEXT_RUN_DATE                STATE     ENABLED
------------------------------ ------------------------------  --------- --------
DAILY_AUDIT_ARCHIVE_TIMESTAMP  18-NOV-20 07.37.33.000000 AM +  SCHEDULED    TRUE
                   00:00

DAILY_AUDIT_PURGE_JOB          18-NOV-20 07.44.35.744657 AM    SCHEDULED    TRUE
                   TC/UTC