3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Oracle Database@AzureのADB-S 19cからAzure Blob Storageへ監査ログを定期エクスポートしてみた

3
Posted at

はじめに

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の構成画面から確認しておきます。
image.png

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

image.png
image.png
image.png
image.png

DNSレコード登録後、「変更の公開」を実施します。
image.png
image.png

また、OCI側のNSGでAzure Blob Private Endpoint宛てTCP 443の通信が許可されていることを確認します。
今回の検証環境では、ADB-Sに関連付けられたNSGに宛先 0.0.0.0/0・全プロトコルを許可するエグレスルールがあり、TCP 443も許可されていたため、ルールの追加・変更は行っていません。
image.png

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へのアクセス権を付与します。
image.png

3-2. Azure RBACロールを割り当てる

AzureポータルでStorage Accountの「アクセス制御(IAM)」を開き、次のロールを割り当てます。

項目 設定値
ロール Storage Blob Data Contributor
メンバー azure_app_nameで取得したアプリケーション
スコープ Storage Account

image.png
image.png

メンバーの画面では先ほどSQLで確認したazure_app_nameを検索して追加します。
image.png
image.png
image.png

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記事

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?