はじめに
Oracle Database@Azure(以下、ODAA)のAutonomous AI Database Serverless(以下、ADB-S)には、監査ログを外部ストレージへ定期的にエクスポートできる組込みパイプライン ORA$AUDIT_EXPORT が用意されています。
今回は、ADB-S 19cからAzure Blob Storageへ、プライベート接続およびMicrosoft Entra IDのサービスプリンシパル認証を使用して、Unified Auditログを15分間隔で定期出力できるか検証しました。
参考:Oracle公式:Azure Blob Storageへの監査ログのエクスポート
1. 検証環境
今回使用した環境は以下のとおりです。
| 項目 | 設定 |
|---|---|
| データベース | ODAA ADB-S |
| DBバージョン | 19c(19.33.0.1.0) |
| Azureリージョン | Japan East |
| ADB-S名 | adbs19c |
| ECPU / ストレージ | 2 ECPU / 20GB |
| ADB-Sアクセス | プライベート接続のみ |
| Azure VNet | ADBVnet |
| Storage Account | adbauditpoc |
| Blobコンテナー | adb-audit-poc |
| 認証方式 | Microsoft Entra IDサービスプリンシパル |
SQL操作は、踏み台VMを作成するのが手間だったのでOCI Cloud ShellからPrivate Networkingを利用して、SQL*PlusでADB-Sに接続しています。
接続方法については以下の記事を参考にしています。
プライベート・エンドポイント構成のAutonomous AI Databaseにお金と手間をかけずにSQL*Plusから接続する
まず、ADB-S 19cに組込みパイプラインが存在することを確認します。
SELECT pipeline_name, pipeline_type, status
FROM user_cloud_pipelines;
実行結果:
PIPELINE_NAME PIPELINE_TYPE STATUS
---------------------------- ------------- -------
ORA$APEX_ACTIVITY_EXPORT EXPORT STOPPED
ORA$AUDIT_EXPORT EXPORT STOPPED
ADB-S 19cでも ORA$AUDIT_EXPORT が利用できることを確認できました。
2. Azure Blob Storageの準備
AzureポータルからStorage AccountとBlobコンテナーを作成します。
今回、パブリックネットワークアクセスは無効化し、Private Endpoint経由で接続する構成としました。
| 項目 | 設定値 |
|---|---|
| Storage Account | adbauditpoc |
| Blobコンテナー | adb-audit-poc |
| パブリックネットワークアクセス | 無効 |
| Private Endpoint | adbBlobEndpoint |
| VNet / Subnet | ADBVnet / OtherSubnet |
| Private Endpoint IP | 10.0.1.4 |
Private Endpoint経由でADBからBlob StorageへアクセスするためにOCI側のDNSの設定が必要なため、対応するFQDNとIPアドレスをAzureのPrivate EndpointのDNSの構成画面から確認しておきます。

2-1. OCI側のプライベートDNS設定
ADB-SからAzure Blob StorageのFQDNをプライベートIPへ名前解決できるように、OCI側VCNのDNSリゾルバにプライベートDNSゾーンを作成します。
今回は、ADB-Sが参照するOCI VCNのプライベートDNSビューに blob.core.windows.net ゾーンを作成し、対象Storage AccountのFQDNをPrivate EndpointのIPアドレスへ解決するAレコードを登録しました。標準のDNS動作では、このゾーンに未登録の別Storage Account名の名前解決に影響するため、既存環境への適用時は注意してください。
| 項目 | 設定値 |
|---|---|
| プライベートゾーン | blob.core.windows.net |
| Aレコード | adbauditpoc |
| IPアドレス | 10.0.1.4 |
adbauditpoc.blob.core.windows.net
↓
10.0.1.4
また、OCI側のNSGでAzure Blob Private Endpoint宛てTCP 443の通信が許可されていることを確認します。
今回の検証環境では、ADB-Sに関連付けられたNSGに宛先 0.0.0.0/0・全プロトコルを許可するエグレスルールがあり、TCP 443も許可されていたため、ルールの追加・変更は行っていません。

2-2. ADB-Sのアウトバウンド設定
ADB-Sからのアウトバウンド通信にプライベート側のルーティングを適用します。
DBMS_CLOUD/DBMS_CLOUD_PIPELINE の通信にVCN側の名前解決とプライベート・エンドポイントのエグレス制御を適用するため、ENFORCE_PRIVATE_ENDPOINT を設定します。
ALTER DATABASE PROPERTY SET
ROUTE_OUTBOUND_CONNECTIONS = 'ENFORCE_PRIVATE_ENDPOINT';
Database altered.
確認:
SELECT property_name, property_value
FROM database_properties
WHERE property_name = 'ROUTE_OUTBOUND_CONNECTIONS';
PROPERTY_NAME PROPERTY_VALUE
-------------------------- -------------------------------
ROUTE_OUTBOUND_CONNECTIONS ENFORCE_PRIVATE_ENDPOINT
続いて、接続先FQDNに対するネットワークACLを設定します。
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'adbauditpoc.blob.core.windows.net',
ace => xs$ace_type(
privilege_list => xs$name_list('connect', 'resolve'),
principal_name => 'ADMIN',
principal_type => xs_acl.ptype_db
)
);
END;
/
ODAAからAzure Blobへのプライベート接続については、以下の記事も参考になります。
Oracle Database@Azure:Blob Storageにあるdmpファイルをプライベートネットワーク経由でAutonomous AI Databaseにインポートする
3. Azureサービスプリンシパル認証の設定
今回はStorage Account Keyを使用せず、Microsoft Entra IDのサービスプリンシパルで認証します。
3-1. ADB-Sでサービスプリンシパルを有効化
BEGIN
DBMS_CLOUD_ADMIN.ENABLE_PRINCIPAL_AUTH(
provider => 'AZURE',
username => 'ADMIN',
params => JSON_OBJECT(
'azure_tenantid' VALUE '<AzureテナントID>'
)
);
END;
/
PL/SQL procedure successfully completed.
生成されたAzureアプリケーションの情報を確認します。
SELECT param_name, param_value
FROM CLOUD_INTEGRATIONS
WHERE param_name LIKE 'azure%';
PARAM_NAME PARAM_VALUE
------------------ ---------------------------------
azure_tenantid <AzureテナントID>
azure_consent_url https://login.microsoftonline.com/...
azure_app_name ADBS_APP_OCID1.AUTONOMOUSDATABASE...
azure_consent_url をブラウザで開き、必要な権限を持つ管理者がアプリケーションへの同意を行います。続いて、対象サービスプリンシパルにBlobへのアクセス権を付与します。

3-2. Azure RBACロールを割り当てる
AzureポータルでStorage Accountの「アクセス制御(IAM)」を開き、次のロールを割り当てます。
| 項目 | 設定値 |
|---|---|
| ロール | Storage Blob Data Contributor |
| メンバー | azure_app_nameで取得したアプリケーション |
| スコープ | Storage Account |
メンバーの画面では先ほどSQLで確認したazure_app_nameを検索して追加します。



3-3. Azure Blobへの接続確認
サービスプリンシパル認証では、Credentialとして AZURE$PA を指定します。
SELECT object_name
FROM DBMS_CLOUD.LIST_OBJECTS(
'AZURE$PA',
'https://adbauditpoc.blob.core.windows.net/adb-audit-poc/'
);
実行結果:
no rows selected
空のコンテナーのため0件ですが、エラーなく実行できており、サービスプリンシパル経由でのアクセスに成功しています。
参考:Oracle公式:Azureサービスプリンシパルを使用したAzureリソースへのアクセス
4. 監査ログの定期エクスポート設定
4-1. パイプライン属性の設定
ORA$AUDIT_EXPORT に出力先と認証情報、実行間隔を設定します。
BEGIN
DBMS_CLOUD_PIPELINE.SET_ATTRIBUTE(
pipeline_name => 'ORA$AUDIT_EXPORT',
attribute_name => 'credential_name',
attribute_value => 'AZURE$PA'
);
DBMS_CLOUD_PIPELINE.SET_ATTRIBUTE(
pipeline_name => 'ORA$AUDIT_EXPORT',
attribute_name => 'location',
attribute_value =>
'https://adbauditpoc.blob.core.windows.net/adb-audit-poc/'
);
DBMS_CLOUD_PIPELINE.SET_ATTRIBUTE(
pipeline_name => 'ORA$AUDIT_EXPORT',
attribute_name => 'interval',
attribute_value => '15'
);
END;
/
PL/SQL procedure successfully completed.
今回は15分間隔で、JSON形式の監査ログをエクスポートします。
4-2. 検証用の監査ログを生成
今回は CREATE TABLE 操作を監査するポリシーを作成します。
CREATE AUDIT POLICY POC_AUDIT_POL
ACTIONS CREATE TABLE;
AUDIT POLICY POC_AUDIT_POL BY ADMIN;
Audit policy created.
Audit succeeded.
監査ポリシーを設定後、SQL*Plusを一度切断し、ADMINで再接続します。
続いてテスト用テーブルを作成します。
CREATE TABLE AUDIT_POC_TEST (
ID NUMBER
);
監査ログを確認します。
SELECT event_timestamp_utc,
dbusername,
action_name,
object_name
FROM unified_audit_trail
WHERE object_name = 'AUDIT_POC_TEST';
実行結果:
EVENT_TIMESTAMP_UTC DBUSERNAME ACTION_NAME OBJECT_NAME
------------------------- ---------- ------------ --------------
21-OCT-26 10:15:09 UTC ADMIN CREATE TABLE AUDIT_POC_TEST
4-3. 監査ログを手動エクスポート
RUN_PIPELINE_ONCE で1回だけエクスポートします。
BEGIN
DBMS_CLOUD_PIPELINE.RUN_PIPELINE_ONCE(
pipeline_name => 'ORA$AUDIT_EXPORT'
);
END;
/
PL/SQL procedure successfully completed.
Azure Blobのファイル一覧を確認します。
SELECT object_name, bytes
FROM DBMS_CLOUD.LIST_OBJECTS(
'AZURE$PA',
'https://adbauditpoc.blob.core.windows.net/adb-audit-poc/'
)
WHERE object_name LIKE 'DBMS_CLOUD_PIPELINE$%.json';
実行結果:
OBJECT_NAME BYTES
------------------------------------------------------ ----------
DBMS_CLOUD_PIPELINE$1_1_20261021T101635307295Z.json 9482
監査ログのJSONファイルが生成されました。
4-4. JSONファイルの内容を確認
DBMS_CLOUD.GET_OBJECT でBlob上のJSONファイルを読み取り、内容を表示します。
SET LINESIZE 200
SELECT UTL_RAW.CAST_TO_VARCHAR2(
DBMS_LOB.SUBSTR(
DBMS_CLOUD.GET_OBJECT(
credential_name => 'AZURE$PA',
object_uri =>
'https://adbauditpoc.blob.core.windows.net/adb-audit-poc/DBMS_CLOUD_PIPELINE$1_1_20261021T101635307295Z.json'
),
2000,
1
)
) AS JSON_PREVIEW
FROM dual;
取得されたJSONの監査レコード部分(抜粋・一部マスク):
{
"REGION": "ap-tokyo-1",
"TENANT_OCID": "***MASKED***",
"DATABASE_OCID": "***MASKED***",
"DATABASE_NAME": "ADBS19C",
"DBUSERNAME": "ADMIN",
"EVENT_TIMESTAMP_UTC": "2026-10-21T10:15:09.385265",
"ACTION_NAME": "CREATE TABLE",
"RETURN_CODE": 0,
"OBJECT_SCHEMA": "ADMIN",
"OBJECT_NAME": "AUDIT_POC_TEST",
"SQL_TEXT": "CREATE TABLE AUDIT_POC_TEST (\n ID NUMBER\n)\u0000",
"UNIFIED_AUDIT_POLICIES": "POC_AUDIT_POL"
}
※実際のJSONから一部の項目を抜粋しています。
CREATE TABLE操作の実行日時、実行ユーザー、SQL文などがAzure Blobへ正常に出力されていることを確認できました。
5. 15分間隔の定期エクスポート検証
5-1. パイプラインの開始
BEGIN
DBMS_CLOUD_PIPELINE.START_PIPELINE(
pipeline_name => 'ORA$AUDIT_EXPORT'
);
END;
/
次に、追加の監査ログを生成します。
CREATE TABLE AUDIT_POC_TEST_2 (
ID NUMBER
);
5-2. 実行履歴を確認
SELECT start_date, status, error_message
FROM user_cloud_pipeline_history
WHERE pipeline_name = 'ORA$AUDIT_EXPORT'
ORDER BY start_date DESC
FETCH FIRST 5 ROWS ONLY;
実行結果:
START_DATE STATUS ERROR_MESSAGE
--------------------------- ------------ -------------
21-OCT-26 10:34:40 UTC SUCCEEDED
21-OCT-26 10:19:40 UTC SUCCEEDED
15分間隔で正常実行されていることを確認できました。
5-3. Azure Blobのファイル確認
SELECT object_name, bytes
FROM DBMS_CLOUD.LIST_OBJECTS(
'AZURE$PA',
'https://adbauditpoc.blob.core.windows.net/adb-audit-poc/'
)
WHERE object_name LIKE 'DBMS_CLOUD_PIPELINE$%.json'
ORDER BY object_name;
実行結果:
OBJECT_NAME BYTES
------------------------------------------------------ ----------
DBMS_CLOUD_PIPELINE$1_1_20261021T101635307295Z.json 9482
DBMS_CLOUD_PIPELINE$1_1_20261021T103441095342Z.json 3165
2つ目のJSONファイルが追加されています。
続いて DBMS_CLOUD.GET_OBJECT で新しいJSONファイルの中身を確認します。
取得されたJSONの監査レコード部分(抜粋・一部マスク):
{
"REGION": "ap-tokyo-1",
"TENANT_OCID": "***MASKED***",
"DATABASE_OCID": "***MASKED***",
"DATABASE_NAME": "ADBS19C",
"DBUSERNAME": "ADMIN",
"EVENT_TIMESTAMP_UTC": "2026-10-21T10:19:57.003845",
"ACTION_NAME": "CREATE TABLE",
"RETURN_CODE": 0,
"OBJECT_SCHEMA": "ADMIN",
"OBJECT_NAME": "AUDIT_POC_TEST_2",
"SQL_TEXT": "CREATE TABLE AUDIT_POC_TEST_2 (\n ID NUMBER\n)\u0000",
"UNIFIED_AUDIT_POLICIES": "POC_AUDIT_POL"
}
※実際のJSONから一部の項目を抜粋しています。
1回目と2回目のCREATE TABLE操作が、それぞれ別のJSONファイルに出力されました。
15分間隔の定期実行と、新しい監査ログの増分エクスポートが動作していることを確認できました。
なお、パイプラインは15分ごとに実行されますが、監査レコードが存在しなければ毎回必ずJSONファイルが生成されるわけではありません。
5-4. パイプラインの停止
検証終了後はパイプラインを停止します。
BEGIN
DBMS_CLOUD_PIPELINE.STOP_PIPELINE(
pipeline_name => 'ORA$AUDIT_EXPORT'
);
END;
/
まとめ
今回の検証では、ODAAのADB-S 19cから、Azure Blob Storageへの監査ログの定期・増分エクスポートが可能であることを確認できました。
-
ORA$AUDIT_EXPORTにより、監査ログをJSON形式でエクスポート可能 - Azure Blobへのプライベート接続に対応
- Microsoft Entra IDのサービスプリンシパル認証に対応
- 15分間隔の定期実行と差分出力を確認
- 外部のバッチサーバーや独自スクリプトを用意せずに実現可能
Azure側に監査ログを保管・集約して、Azure側の各サービスと連携する用途などでの活用が考えられますね。
是非お試しください。
参考情報
Oracle公式ドキュメント
Qiita記事







