Oracle Databaseの監査機能(Unified Audit)について

Oracle Databaseの監査機能は、従来からの監査機能(DBA監査、標準監査)と12cから使用できるUnified Auditの２種類に大きく分けることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/f25f8331-2c50-b4c6-825d-d56d2315909f.png)

12cから使用可能なUnified Auditは、従来の監査の問題点を解決するために新しいアーキテクチャで開発した監査機能として提供しており、基本的にUnified Auditの使用が推奨されています。とはいえ、OSファイルやXML形式による監査ログの運用を好むデータベースも多々あるかと思います。
両方の監査機能は変わらず併用することができましたが、23cからは正式に<font color="red"> 非サポート</font>となりますので、改めてUnified Auditの特徴や使い方に改めてご紹介します。

## Unified Auditとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/1ec33bb2-d2cb-4037-a529-cc06c2cc3650.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/b0d3e86c-9e74-4556-9218-28f5bd8282f2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/fc86f5ad-6bab-4780-8c87-ab7966b33f82.png)



## Unified Auditの特徴
Unified Auditの大きな特徴としては、

 - 監査レコードは、DB表(AUDSYS.AUD$UNIFIED)に格納される (※18cからはsyslog出力が可能)
 - 書き込み不可の場合は、$ORACLE_BASE/audit/ORACLE_SIDにファイルとして出力
 - DBA監査、Recovery Manager, Data Pump, SQL*Loaderなどのユーティリティ系のログも統合
 - 監査が起動する条件を細かく指定できる
 - Unified_Audit_Trailビューでログ・レコードを参照する

## 条件による監査対象の絞り込み
Unified Auditの監査ポリシーには、データベースやユーザーのすべてのアクションを対象にするActions Allという定義が作成できますが、ログ・レコードが膨大になるため安易な使用は控えたほうが無難です。
また、Unified Auditは、ログレコードをDB内に格納するという性質上、監査対象を絞り込むことは、監査ログのストレージ領域の削減とデータベースへのパフォーマンスへの影響を最小化する大きなメリットがあります。監査ポリシーの作成方法については、[こちら](https://docs.oracle.com/cd/F19136_01/dbseg/configuring-audit-policies.html#GUID-5E618BEF-A197-4A9F-B856-5D2941DFB4E5)を確認して下さい。

下記は、いくつか条件指定の例を紹介します。

- 特定のユーザーのUPDATEとDELETE文のDMLを監査

```
CREATE AUDIT POLICY audPolicy1 
  ACTIONS UPDATE ON SecretTbl, DELETE ON SecretTbl
  EVALUATE PER STATEMENT;
AUDIT POLICY audPolicy1 BY UserX, UserY;

# ユーザー指定しない場合は、全ユーザーが対象
AUDIT POLICY audPolicyl;
# EXCEPTを指定すると指定ユーザー以外が対象
AUDIT POLICY audPolicy1 EXCEPT UserX, UserY;
```

- WHEN句で、IPアドレスがNULL(ローカル接続)の場合のみの条件を追加
```
CREATE AUDIT POLICY audPolicy2 
  ACTIONS UPDATE ON SecretTbl, DELETE ON SecretTbl
  WHEN 'SYS_CONTEXT(''USERENV'',''IP_ADDRESS'') IS NULL'
  EVALUATE PER STATEMENT;
AUDIT POLICY audPolicy2;
```

- Actions ALLだけれども、JDBC接続のAPサーバのアクセスを除く条件を指定
```
CREATE AUDIT POLICY audPolicy3 
  ACTIONS ALL on SecretTbl
  WHEN 'SYS_CONTEXT(''USERENV'',''HOST'') IN ''dbsec01.jp.oracle.com,dbsec02.jp.oracle.com'' and SYS_CONTEXT(''USERENV'',''MODULE'') NOT IN ''JDBC Thin Client'''
  EVALUATE PER STATEMENT;
AUDIT POLICY audPolicy3;
```

- DATAPUMPのエクスポートを監査
```
CREATE AUDIT POLICY audPolicy3 ACTIONS COMPONENT=DATAPUMP EXPORT;
AUDIT POLICY audPolicy3 BY SYSTEM;
```

- 23aiでは、表の列を対象にした指定が可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/b05adda9-7d2a-4e67-bc3c-52ad6f4e7af4.png)

## Mixed Mode (混合モード)
- Mixed Modeは、従来の監査機能とUnified Auditの両方が使用可能
- 12c以降、Mixed Modeがデフォルト設定になっている  ※Autonomous DBはUnified Auditのみ
- DBCAでDBを作成した場合、または、Oracle Cloud Database ServicesのDBは ORA_LOGON_FAILURESとORA_SECURECONFIGの[事前定義ポリシー](https://docs.oracle.com/cd/F19136_01/dbseg/configuring-audit-policies.html#GUID-C43651C6-A35C-4EEF-BEA7-EADA408BFF67)がデフォルト有効化される。
- Mixed Modeの場合は、以下の制限事項に注意
    - SYS,SYSASM等の監査ログファイルは、audit_file_destパラメータで指定されたディレクトリにOSファイルとして出力される
    - RMANやDatapump等のユーティリティのログはUnified Auditに出力されない
- Mixed ModeからPure Unified Auditに完全移行すると、上記のログはUnfired Auditへ集約される

## Unified Auditの確認方法

```
SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';
-------------------------------------------
TRUE   -->  Unified Auditing
FALSE -->   Mixed Mode
```

## Mixed ModeからPure Unified Auditの移行手順
Pure Unified Auditの完全移行は必須ではない
従来の監査機能は廃止して、完全にUnified Auditだけを使用したい場合は以下で移行する

```
データベースのシャットダウン、リスナーの停止
$ORACLE_HOME/rdbms/libに移動
(Unix) make -f ins_rdbms.mk uniaud_on ioracle ORACLE_HOME=$ORACLE_HOME
(Windows) %ORACLE_HOME%/rdbms/bin/orauniaud12.dll.optionファイルをorauniaud12.dllにリネーム
リスナー、データベースの起動
```

## Unified Auditの削除
- すべてのUnified Auditを無条件ですべて削除する
 
```
EXEC DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL (audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,  use_last_arch_timestamp => FALSE);
```
- 指定した日時以前のUnified Auditを削除する

```
最終日付を指定するプロシージャ
EXEC
  DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
   AUDIT_TRAIL_TYPE     =>  DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
   last_archive_time => TO_TIMESTAMP('2020-01-01:00:00.00','YYYY-MM-HH24:MI:SS.FF'));
END;
/

EXEC DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL (audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,  use_last_arch_timestamp => False);
```

## Unified Auditのデフォルト表領域の変更
監査ログによるSYSAUXの肥大化を避けたい場合は別の表領域に予め移動しておく

```
表領域の作成
CREATE BIGFILE TABLESPACE AUDIT DATAFILE SIZE 500G AUTOEXTEND ON NEXT 100G MAXSIZE 1000G;

表領域の移動
BEGIN
DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION (
audit_trail_type   => DBMS_AUDIT_MGMT. AUDIT_TRAIL_UNIFIED,
audit_trail_location_value => ‘AUDIT’);
END;
```


# Unified Auditとログサービスとの連携

Unified Auditには、SQLでUnified Audit Trailビューから監査レコードにアクセスすることができますが、見やすくビジュアライスしてレポートしたり、細かくログ分析する場合には、ログ製品やBIツールと連携するのが実用的です。

従来では、Audit Vault and Database FirewallというDB監査のオンプレミス製品がありますが、クラウドには、Data SafeまたはLogging Analyticsというサービスがあります。これらのサービスにログを取り込ませた後は、DB側のUnified Auditのログレコードを削除して軽くするすることができるので、監査ログの長期保存には、必要なストレージを柔軟に追加できるクラウドのストレージと相性が良いかと思います。


[OCI DataSafeでBaseDB/ExaDB-Dの監査ログを取り込んで分析する](https://qiita.com/western24/items/235400f4a553ce53f066)
[OCI Logging AnalyticsでOracle Databaseの関連ログを取り込んで分析する](https://qiita.com/western24/items/409d93b911c7094f5137)
[OCI Logging AnalyticsでDatabaseの監査表やユーザー表を分析する](https://qiita.com/western24/items/ab8344ed9d5361998a5b)
[Audit Vault and Database Firewallでデータベースの監査ログを記録する①](https://qiita.com/Western24/items/5f858fcc5c0e95dec8da)