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
テーブルの select
と delete
で監査が有効になっています。テーブルに対して挿入、選択、削除が実行されます。監査対象は select
と delete
のみです。挿入オペレーションは監査テーブルに記録されません。
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_trail
は DB
に設定されています。これは、データベースが混合モードの監査を使用していることを意味します。
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_SECURECONFIG
と ORA_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_SECURECONFIG
と ORA_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_TIMESTAMP
、DAILY_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