Oracle Database 統合監査データを SYSLOG 転送する（Oracle Database 19c)

Oracle Database 18c 以降のバージョンでは統合監査のデータを SYSLOG (RSYSLOG) に転送する機能を持っています。

# 統合監査
統合監査は、Oracle Database 11g までの監査（標準監査と呼びます）、ファイングレイン監査、DBA監査等複数あった監査方式を一本化（=UNIFIED）した監査方法です。Oracle Database 19c では標準の監査方法になっています。標準では統合監査の出力結果は AUDSYS スキーマの AUD$UNIFIED テーブルに保存されます。このテーブルは時間隔パーティション・テーブル（INTERVAL PARTITION TABLE）になっています。

```SQL: AUD$UNIFIED テーブルの確認
SQL> SELECT TABLE_NAME, PARTITIONING_TYPE, PARTITION_COUNT FROM DBA_PART_TABLES WHERE TABLE_NAME='AUD$UNIFIED';

TABLE_NAME                     PARTITION PARTITION_COUNT
------------------------------ --------- ---------------
AUD$UNIFIED                    RANGE             1048575

SQL> SELECT TABLE_NAME, PARTITION_NAME, TABLESPACE_NAME FROM DBA_TAB_PARTITIONS WHERE TABLE_OWNER='AUDSYS';

TABLE_NAME                     PARTITION_NAME                 TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
AUD$UNIFIED                    AUD_UNIFIED_P0                 SYSAUX
AUD$UNIFIED                    SYS_P1035                      SYSAUX
AUD$UNIFIED                    SYS_P1062                      SYSAUX
AUD$UNIFIED                    SYS_P1122                      SYSAUX
AUD$UNIFIED                    SYS_P1162                      SYSAUX
AUD$UNIFIED                    SYS_P561                       SYSAUX
AUD$UNIFIED                    SYS_P825                       SYSAUX
AUD$UNIFIED                    SYS_P881                       SYSAUX

8行が選択されました。
```

データベース管理者は監査データを確認するために UNIFIED_AUDIT_TRAIL ビューを参照します。実行計画を確認すると AUDSYS.AUD$UNIFIED テーブルを参照していることがわかります。

```SQL: UNIFIED_AUDIT_TRAIL ビュー参照の実行計画
SQL> SELECT COUNT(*) FROM UNIFIED_AUDIT_TRAIL;

  COUNT(*)
----------
      2009

実行計画
----------------------------------------------------------
Plan hash value: 1799673015

----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                  | Name                    | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |                         |     1 |       |    74   (0)| 00:00:01 |       |            |
|   1 |  SORT AGGREGATE            |                         |     1 |       |            |          |       |            |
|   2 |   VIEW                     | UNIFIED_AUDIT_TRAIL     |  1967 |       |    74   (0)| 00:00:01 |       |            |
|   3 |    UNION-ALL               |                         |       |       |            |          |       |            |
|   4 |     NESTED LOOPS OUTER     |                         |     1 |    68 |     2   (0)| 00:00:01 |       |            |
|   5 |      NESTED LOOPS OUTER    |                         |     1 |    64 |     1   (0)| 00:00:01 |       |            |
|   6 |       NESTED LOOPS         |                         |     1 |    59 |     0   (0)| 00:00:01 |       |            |
|   7 |        FIXED TABLE FULL    | X$UNIFIED_AUDIT_TRAIL   |     1 |    52 |            |          |       |            |
|*  8 |        INDEX UNIQUE SCAN   | I_UNIFIED_AUDIT_ACTIONS |     1 |     7 |     0   (0)| 00:00:01 |       |            |
|*  9 |       INDEX RANGE SCAN     | I_SYSTEM_PRIVILEGE_MAP  |     1 |     5 |     1   (0)| 00:00:01 |       |            |
|* 10 |      INDEX RANGE SCAN      | I_STMT_AUDIT_OPTION_MAP |     1 |     4 |     1   (0)| 00:00:01 |       |            |
|  11 |     NESTED LOOPS           |                         |  1966 | 53082 |    72   (0)| 00:00:01 |       |            |
|* 12 |      HASH JOIN RIGHT OUTER |                         |  1966 | 39320 |    72   (0)| 00:00:01 |       |            |
|  13 |       INDEX FAST FULL SCAN | I_STMT_AUDIT_OPTION_MAP |   337 |  1348 |     2   (0)| 00:00:01 |       |            |
|* 14 |       HASH JOIN RIGHT OUTER|                         |  1966 | 31456 |    70   (0)| 00:00:01 |       |            |
|  15 |        INDEX FAST FULL SCAN| I_SYSTEM_PRIVILEGE_MAP  |   257 |  1285 |     2   (0)| 00:00:01 |       |            |
|  16 |        PARTITION RANGE ALL |                         |  1966 | 21626 |    68   (0)| 00:00:01 |     1 |1048575|
|  17 |         TABLE ACCESS FULL  | AUD$UNIFIED             |  1966 | 21626 |    68   (0)| 00:00:01 |     1 |1048575|
|* 18 |      INDEX UNIQUE SCAN     | I_UNIFIED_AUDIT_ACTIONS |     1 |     7 |     0   (0)| 00:00:01 |       |            |
----------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   8 - access("AUDIT_TYPE"="ACT"."TYPE" AND "ACTION"="ACT"."ACTION")
   9 - access("SPX"."PRIVILEGE"(+)=(-"SYSTEM_PRIVILEGE"))
  10 - access("AUDIT_OPTION"="AOM"."OPTION#"(+))
  12 - access("AUDUNI"."AUDIT_OPTION"="AOM1"."OPTION#"(+))
  14 - access("SPX1"."PRIVILEGE"(+)=(-"AUDUNI"."SYSTEM_PRIVILEGE"))
  18 - access("AUDUNI"."AUDIT_TYPE"="ACT1"."TYPE" AND "AUDUNI"."ACTION"="ACT1"."ACTION")
```

現在有効な統合監査のポリシーは AUDIT_UNIFIED_ENABLED_POLICIES ビューから確認できます。下記の例では Oracle Database 19c 標準の監査ポリシーが確認できます。

```SQL: 有効な統合監査ポリシーの一覧
SQL> SELECT * FROM AUDIT_UNIFIED_ENABLED_POLICIES;

POLICY_NAME                    ENABLED_OPTION  ENTITY_NAME                    ENTITY_ SUC FAI
------------------------------ --------------- ------------------------------ ------- --- ---
ORA_SECURECONFIG               BY USER         ALL USERS                      USER    YES YES
ORA_LOGON_FAILURES             BY USER         ALL USERS                      USER    NO  YES
```

本記事では Linux 環境で統合監査の設定を SYSLOG (RSYSLOG) に転送する方法と出力例について記載しています。

# SYSLOGへの転送
統合監査情報を SYSLOG へ転送するには以下の２つの初期化パラメーターを使います。

- UNIFIED_AUDIT_COMMON_SYSTEMLOG
マニュアルの記載は以下の通りです。
> UNIFIED_AUDIT_COMMON_SYSTEMLOGには、共通監査ポリシーによって生成された統合監査レコードのキー・フィールドがSYSLOGユーティリティに書き込まれるかどうかを指定します。

共通監査ポリシーは「CONTAINER=ALL」を指定したポリシーを指します。

- UNIFIED_AUDIT_SYSTEMLOG
マニュアルの記載は以下の通りです。
> UNIFIED_AUDIT_SYSTEMLOGには、統合監査レコードのキー・フィールドをSYSLOGユーティリティ(UNIXプラットフォームの場合)に書き込むのか、Windowsイベントビューア(Windowsの場合)に書き込むのかを指定します。CDBでは、このパラメータはPDBごとの静的初期化パラメータです。

こちらはPDB単位に出力する設定です。

## PDBに対する設定例
特定の PDB に対して統合監査データを SYSLOG 転送する例です。
監査設定は変わらないので、統合監査ポリシーを設定します。ここでは SCOTT ユーザーの DATA1 テーブルに対する DML アクセスの監査を行います。

```SQL: PDB の統合監査設定
SQL> ALTER SESSION SET CONTAINER=pdb1;

セッションが変更されました。

SQL> CREATE AUDIT POLICY policy1 ACTIONS ALL ON scott.data1;

監査ポリシーが作成されました。

SQL> AUDIT POLICY policy1;

監査が成功しました。

SQL> SELECT * from audit_unified_enabled_policies;

POLICY_NAME                    ENABLED_OPTION  ENTITY_NAME                    ENTITY_ SUC FAI
------------------------------ --------------- ------------------------------ ------- --- ---
ORA_SECURECONFIG               BY USER         ALL USERS                      USER    YES YES
ORA_LOGON_FAILURES             BY USER         ALL USERS                      USER    NO  YES
POLICY1                        BY USER         ALL USERS                      USER    YES YES
```

PDB の初期化パラメーター unified_audit_systemlog を変更します。ファシリティ名とプライオリティをドット（.）で接続した文字列を指定します。以下の例ではファシリティに「LOCAL3」、プライオリティに「INFO」を指定しています。PDB の再起動を行い、初期化パラメーターを有効化しています。

```SQL: 初期化パラメーターの設定
SQL> ALTER SYSTEM SET unified_audit_systemlog = 'LOCAL3.INFO' SCOPE=SPFILE;

システムが変更されました。

SQL> ALTER PLUGGABLE DATABASE pdb1 CLOSE;

プラガブル・データベースが変更されました。

SQL> ALTER PLUGGABLE DATABASE pdb1 OPEN;

プラガブル・データベースが変更されました。
```

出力された監査設定例を確認します。以下の例では監査設定は /var/log/oradbaudit.log ファイルに出力される設定になっています（/etc/rsyslog.conf ファイルで設定）。

```shell: 監査データの確認
# grep -i local3 /etc/rsyslog.conf
local3.info                     /var/log/oradbaudit.log
# cat /var/log/oradbaudit.log
Jan 31 16:33:31 rel88-1 journal: Oracle Unified Audit[17345]: LENGTH: '210' TYPE:"4" DBID:"1623664111" SESID:"1736818950" CLIENTID:"" ENTRYID:"1" STMTID:"7" DBUSER:"SCOTT" CURUSER:"SCOTT" ACTION:"3" RETCODE:"0" SCHEMA:"SCOTT" OBJNAME:"DATA1" PDB_GUID:"00384AF2A3D4C878E0638401A8C0E37E"
Jan 31 16:34:00 rel88-1 journal: Oracle Unified Audit[17345]: LENGTH: '210' TYPE:"4" DBID:"1623664111" SESID:"1736818950" CLIENTID:"" ENTRYID:"2" STMTID:"8" DBUSER:"SCOTT" CURUSER:"SCOTT" ACTION:"2" RETCODE:"0" SCHEMA:"SCOTT" OBJNAME:"DATA1" PDB_GUID:"00384AF2A3D4C878E0638401A8C0E37E"
Jan 31 16:40:13 rel88-1 journal: Oracle Unified Audit[36323]: LENGTH: '197' TYPE:"4" DBID:"1623664111" SESID:"1200097683" CLIENTID:"" ENTRYID:"1" STMTID:"1" DBUSER:"SYS" CURUSER:"SYS" ACTION:"49" RETCODE:"0" SCHEMA:"" OBJNAME:"" PDB_GUID:"00384AF2A3D4C878E0638401A8C0E37E"
Jan 31 16:40:34 rel88-1 journal: Oracle Unified Audit[36323]: LENGTH: '202' TYPE:"4" DBID:"1623664111" SESID:"4200562405" CLIENTID:"" ENTRYID:"2" STMTID:"3" DBUSER:"SYS" CURUSER:"SYS" ACTION:"227" RETCODE:"0" SCHEMA:"" OBJNAME:"PDB1" PDB_GUID:"00384AF2A3D4C878E0638401A8C0E37E"
```

SYSLOG 転送設定を行ったからといって、監査証跡が保存されないわけではありません。SYSLOG 転送されるのはキー部分のみになります。このため unified_audit_trail ビューを検索すると作成したポリシーの監査データが取得できます。

```SQL: POLICY1 ポリシーのデータ検索
SQL> SELECT OBJECT_NAME,DBUSERNAME,ACTION_NAME FROM unified_audit_trail WHERE UNIFIED_AUDIT_POLICIES='POLICY1';

OBJECT_NAME          DBUSERNAME                     ACTION_NAME
-------------------- ------------------------------ --------------------
DATA1                SCOTT                          INSERT
DATA1                SCOTT                          SELECT
DATA1                SYS                            SELECT
```

Author: Noriyoshi Shinoda / Date: January 31, 2024