データに対して Azure OpenAI を安全に使用する

この記事では、Microsoft Entra ID のロールベースのアクセス制御、仮想ネットワーク、プライベート エンドポイントを使用してデータとリソースを保護することで Azure OpenAI On Your Data を安全に使用する方法について説明します。

この記事は、テキストを含むデータに対して Azure OpenAI を使用する場合にのみ適用されます。 画像を含むデータに対して Azure OpenAI を使用する場合には適用されません。

データ インジェスト アーキテクチャ

データに対して Azure OpenAI を使用して、Azure Blob Storage、ローカル ファイル、または URL から Azure AI 検索にデータを取り込む場合、データを処理するために次のプロセスが使用されます。

データを取り込むプロセスを示す図。

  • ステップ 1 と 2 は、ファイルのアップロードにのみ使用されます。
  • この図には、URL の実際の BLOB ストレージへのダウンロードは示されていません。 Web ページがインターネットからダウンロードされ、BLOB ストレージにアップロードされた後、ステップ 3 以降は同じです。
  • Azure AI 検索リソースには、2 つのインデクサー、2 つのインデックス、2 つのデータ ソース、1 つのカスタム スキルが作成されます。
  • チャンク コンテナーは BLOB ストレージ内に作成されます。
  • スケジュールされた更新によってインジェストがトリガーされた場合、インジェスト プロセスはステップ 7 から始まります。
  • Azure OpenAI の preprocessing-jobs API は、Azure AI 検索カスタマー スキル Web API プロトコル を実装し、キュー内のドキュメントを処理します。
  • Azure OpenAI により次が行われます。
    1. 内部的に、以前に作成した最初のインデクサーを使用してドキュメントを解読します。
    2. ヒューリスティック ベースのアルゴリズムを使用してチャンクを実行し、チャンク境界内のテーブル レイアウトやその他の書式設定要素を考慮して、最適なチャンク品質を確保します。
    3. ベクトル検索を有効にした場合、Azure OpenAI は選択した埋め込みデプロイを使用してチャンクを内部的にベクトル化します。
  • サービスが監視しているすべてのデータが処理されると、Azure OpenAI によって 2 番目のインデクサーがトリガーされます。
  • インデクサーにより、処理されたデータが Azure AI 検索サービスに格納されます。

サービス呼び出しで使用されるマネージド ID では、システム割り当てマネージド ID のみがサポートされます。 ユーザー割り当てマネージド ID はサポートされていません。

推論アーキテクチャ

推論 API を使用するプロセスを示す図。

データに対する Azure OpenAI モデルとチャットするために API 呼び出しを送信する際に、フィールド マッピングが要求で明示的に設定されていない場合は、サービスは推論中にインデックス フィールドを取得してフィールド マッピングを自動的に実行する必要があります。 そのため、このサービスでは、推論中であっても、Azure OpenAI ID に検索サービスの Search Service Contributor ロールが必要です。

推論要求で埋め込みデプロイが指定された場合、書き換えられたクエリは Azure OpenAI によってベクトル化され、クエリとベクターの両方がベクトル検索のために Azure AI 検索に送信されます。

ドキュメント レベルのアクセス制御

Note

ドキュメント レベルのアクセス制御は、Azure AI 検索でのみサポートされています。

データ上で Azure OpenAI を使用すると、Azure AI Search セキュリティ フィルターを使用するさまざまなユーザーの応答で使用できるドキュメントを制限できます。 ドキュメント レベルのアクセスを有効にすると、Azure AI Search から返されて応答の生成に使用された検索結果は、ユーザーの Microsoft Entra グループ メンバーシップに基づいてトリミングされます。 ドキュメント レベルのアクセスは、既存の Azure AI Search インデックスに対してのみ有効にすることができます。 ドキュメント レベルのアクセスを有効にするには、次の手順を実行します。

  1. Azure AI Search のドキュメントの手順に従って、アプリケーションを登録し、ユーザーとグループを作成します。

  2. 許可されたグループでドキュメントにインデックスを付けます。 新しいセキュリティ フィールドに次のスキーマがあることを確認します。

    {"name": "group_ids", "type": "Collection(Edm.String)", "filterable": true }
    

    group_ids は既定のフィールド名です。 my_group_ids のような別のフィールド名を使用する場合は、インデックス フィールド マッピングでフィールドをマップできます。

  3. インデックス内の各機密ドキュメントの値が、そのドキュメントの許可されたグループを示すように、このセキュリティ フィールドに正しく設定されていることを確認します。

  4. Azure OpenAI Studio にデータ ソースを追加します。 [インデックス フィールド マッピング] セクションでは、スキーマに互換性がある限り、"許可されたグループ" フィールドに 0 または 1 の値をマップできます。 "許可されたグループ" フィールドがマップされていない場合、ドキュメント レベルのアクセスは有効になりません。

Azure OpenAI Studio

Azure AI Search インデックスが接続されると、ログインしているユーザーの Microsoft Entra アクセス許可に基づいて、スタジオ内の応答からドキュメントにアクセスできるようになります。

Web アプリケーション

発行された Web アプリを使用している場合は、最新バージョンにアップグレードされるようにそれを再デプロイする必要があります。 最新バージョンの Web アプリには、ログインしているユーザーの Microsoft Entra アカウントのグループを取得して、それをキャッシュし、各 API 要求にグループ ID を含める機能が含まれています。

API

API を使用する場合は、各 API 要求で filter パラメーターを渡します。 次に例を示します。

{
    "messages": [
        {
            "role": "user",
            "content": "who is my manager?"
        }
    ],
    "dataSources": [
        {
            "type": "AzureCognitiveSearch",
            "parameters": {
                "endpoint": "'$AZURE_AI_SEARCH_ENDPOINT'",
                "key": "'$AZURE_AI_SEARCH_API_KEY'",
                "indexName": "'$AZURE_AI_SEARCH_INDEX'",
                "filter": "my_group_ids/any(g:search.in(g, 'group_id1, group_id2'))"
            }
        }
    ]
}
  • my_group_ids は、許可されたグループに対して、フィールド マッピング中に選択したフィールド名です。
  • group_id1, group_id2 は、ログインしているユーザーに属性付けされたグループです。 クライアント アプリケーションを使用すると、ユーザーのグループを取得してキャッシュできます。

リソース構成

以降のセクションを使用して、リソースを最適かつ安全に使用できるように構成します。 リソースの一部のみをセキュリティで保護する場合でも、以下のすべての手順に従う必要があります。

この記事では、Azure OpenAI リソース、Azure AI 検索リソース、ストレージ アカウントのパブリック ネットワークの無効化に関連するネットワーク設定について説明します。 選択したネットワークと IP ルールの使用はサポートされていません。サービスの IP アドレスは動的であるためです。

ヒント

GitHub に用意されている bash スクリプトを使用してセットアップを検証し、ここに記載されているすべての要件が満たされているかどうかを判断できます。

リソース グループの作成

関連するすべてのリソースを整理できるように、リソース グループを作成します。 リソース グループ内のリソースには次のものが含まれますが、これらに限定されません。

  • 1 つの仮想ネットワーク
  • 3 つの主要サービス: Azure OpenAI、Azure AI 検索、ストレージ アカウントが各 1 つ
  • 3 つのプライベート エンドポイント (それぞれが 1 つのキー サービスにリンクされている)
  • 3 つのネットワーク インターフェイス (それぞれが 1 つのプライベート エンドポイントに関連付けられている)
  • 1 つの仮想ネットワーク ゲートウェイ (オンプレミスのクライアント マシンからのアクセス用)
  • 仮想ネットワークが統合された 1 つの Web アプリ
  • 1 つのプライベート DNS ゾーン (Web アプリがお使いの Azure OpenAI の IP をみつけられるようにするため)

Create virtual network

仮想ネットワークには 3 つのサブネットが含まれています。

  1. 1 番目のサブネットは、3 つのプライベート エンドポイントのプライベート IP に使用されます。
  2. 仮想ネットワーク ゲートウェイを作成すると、2 番目のサブネットが自動的に作成されます。
  3. 3 番目のサブネットは空で、Web アプリの送信仮想ネットワーク統合に使用されます。

仮想ネットワーク アーキテクチャを示す図。

Microsoft のマネージド仮想ネットワークは Microsoft によって作成されており、表示できないことに注意してください。 Microsoft のマネージド仮想ネットワークは、Azure AI 検索に安全にアクセスするために Azure OpenAI によって使用されます。

Azure OpenAI の構成

有効になっているカスタム サブドメイン

Azure portal 経由で Azure OpenAI を作成した場合は、カスタム サブドメインがすでに作成されているはずです。 カスタム サブドメインは、Microsoft Entra ID ベースの認証とプライベート DNS ゾーンに必要です。

マネージド ID の有効化

ご利用の Azure OpenAI サービスが Microsoft Entra ID 認証を介して Azure AI 検索とストレージ アカウントで認識されるようにするには、その Azure OpenAI サービスにマネージド ID を割り当てる必要があります。 Azure portal でシステム割り当てマネージド ID をオンに切り替えるのが最も簡単な方法です。 Azure portal のシステム割り当てマネージド ID オプションを示すスクリーンショット。

管理 API を使用してマネージド ID を設定するには、管理 API リファレンス ドキュメントを参照してください。


"identity": {
  "principalId": "12345678-abcd-1234-5678-abc123def",
  "tenantId": "1234567-abcd-1234-1234-abcd1234",
  "type": "SystemAssigned, UserAssigned", 
  "userAssignedIdentities": {
    "/subscriptions/1234-5678-abcd-1234-1234abcd/resourceGroups/my-resource-group",
    "principalId": "12345678-abcd-1234-5678-abcdefg1234", 
    "clientId": "12345678-abcd-efgh-1234-12345678"
  }
}

信頼されたストレージを有効にする

Azure OpenAI にパブリック ネットワーク アクセスがない場合に、Azure AI 検索でご利用の Azure OpenAI preprocessing-jobs をカスタム スキル Web API として呼び出せるようにするには、マネージド ID に基づいて信頼できるサービスとして Azure AI 検索をバイパスするように Azure OpenAI を設定する必要があります。 Azure OpenAI は、JSON Web Token (JWT) 内の要求を検証して、Azure AI 検索からのトラフィックを識別します。 Azure AI 検索では、システム割り当てマネージド ID 認証を使用して、カスタム スキル Web API を呼び出す必要があります。

管理 API から networkAcls.bypassAzureServices に設定します。 詳細については、仮想ネットワークに関する記事を参照してください。

この手順は、Azure AI 検索リソースの共有プライベート リンクがある場合にのみスキップできます。

パブリック ネットワーク アクセスの無効化

Azure portal で Azure OpenAI リソースのパブリック ネットワーク アクセスを無効にすることができます。

Azure OpenAI Studio の使用など、クライアント コンピューターから Azure OpenAI サービスへのアクセスを許可するには、ご利用の Azure OpenAI リソースに接続するプライベート エンドポイント接続を作成する必要があります。

以下の構成では、Basic 価格レベル以上を使用できます。 これは必要ありませんが、S2 価格レベルを使用している場合は、選択可能な追加のオプションが表示されます。

マネージド ID の有効化

Microsoft Entra ID 認証を使用して他のリソースが Azure AI 検索を認識できるようにするには、Azure AI 検索にマネージド ID を割り当てる必要があります。 Azure portal でシステム割り当てマネージド ID をオンに切り替えるのが最も簡単な方法です。

Azure portal での Azure AI 検索のマネージド ID 設定を示すスクリーンショット。

ロールベースのアクセス制御を有効にする

Azure OpenAI ではマネージド ID を使用して Azure AI 検索にアクセスするため、お使いの Azure AI 検索でロールベースのアクセス制御を有効にする必要があります。 Azure portal でこれを行うには、Azure portal の [キー] タブで [両方] を選択してください。

Azure portal での Azure AI 検索のマネージド ID オプションを示すスクリーンショット。

REST API を介してロールベースのアクセス制御を有効にするには、authOptionsaadOrApiKey として設定します。 詳細については、Azure AI 検索の RBAC に関する記事を参照してください。

"disableLocalAuth": false,
"authOptions": { 
    "aadOrApiKey": { 
        "aadAuthFailureMode": "http401WithBearerChallenge"
    }
}

Azure OpenAI Studio を使用するには、Azure AI 検索の API キー ベースの認証を無効にすることはできません。これは、Azure OpenAI Studio により API キーを使用してブラウザーから Azure AI 検索 API が呼び出されるためです。

ヒント

セキュリティを最大限に高めるために、運用環境の準備が整い、テスト用の Azure OpenAI Studio を使用する必要がなくなった場合は、API キーを無効にすることをお勧めします。 詳細については、Azure AI 検索の RBAC に関する記事を参照してください。

パブリック ネットワーク アクセスの無効化

Azure portal で Azure AI 検索リソースのパブリック ネットワーク アクセスを無効にすることができます。

Azure OpenAI Studio の使用など、クライアント コンピューターから Azure AI 検索リソースへのアクセスを許可するには、ご利用の Azure AI 検索リソースに接続するプライベート エンドポイント接続を作成する必要があります。

Note

Azure OpenAI リソースから Azure AI 検索リソースへのアクセスを許可するには、申請フォームを送信する必要があります。 申請は 5 営業日以内に確認され、結果のお知らせはメールで届きます。 適格と判定された場合は、Microsoft のマネージド仮想ネットワークにプライベート エンドポイントがプロビジョニングされ、ご利用の検索サービスにプライベート エンドポイント接続要求が送信されますので、この要求を承認する必要があります。

プライベート エンドポイントの承認画面を示すスクリーンショット。

プライベート エンドポイント リソースが Microsoft の管理するテナントにプロビジョニングされている一方で、リンクされたリソースがテナント内にあるためです。 [ネットワーク] ページ の [プライベート アクセス] タブにある プライベート エンドポイント リンク (青いフォントで) をクリックするだけでは、プライベート エンドポイント リソースにアクセスできません。 代わりに、行の別の場所をクリックすると、上にある [承認] ボタンがクリックできるようになります。

詳しくは、手動での承認ワークフローをご覧ください。

ヒント

Basic 価格レベルまたは Standard 価格レベルを使用している場合や、すべてのリソースを安全にセットアップするのが初めての場合、この高度なトピックはスキップしてください。

このセクションは、スキル セットがあるインデクサーに対するプライベート エンドポイントのサポートが必要であるため、S2 価格レベルの検索リソースにのみ適用できます。

Azure OpenAI リソースに接続している検索リソースから共有プライベート リンクを作成するには、検索ドキュメントを参照してください。 [リソースの種類]Microsoft.CognitiveServices/accounts を、[グループ ID]openai_account を選択します。

共有プライベート リンクを使用すると、データ インジェスト アーキテクチャ ダイアグラムの手順 8 が、バイパスの信頼できるサービスからプライベート エンドポイントに変更されます。

データを取り込むプロセスと S2 検索リソースを示す図。

作成した Azure AI 検索の共有プライベート リンクは、仮想ネットワークではなく、Microsoft マネージド仮想ネットワークにも含まれています。 前に作成した他のマネージド プライベート エンドポイントとの違いは、Azure OpenAI から Azure Cognitive Search へのマネージド プライベート エンドポイント [1]フォーム アプリケーションを通じてプロビジョニングされている一方で、Azure Cognitive Search から Azure OpenAI へのマネージド プライベート エンドポイント [2] が Azure portal または Azure Cognitive Search の REST API 経由でプロビジョニングされていることです。

仮想ネットワーク アーキテクチャと S2 検索リソースを示す図。

ストレージ アカウントを構成する

信頼されたストレージを有効にする

ストレージ アカウントにパブリック ネットワーク アクセスがない場合に、Azure OpenAI と Azure AI 検索からご自分のストレージ アカウントへのアクセスを許可するには、マネージド ID に基づく信頼されたサービスとして Azure OpenAI と Azure AI 検索をバイパスするようにストレージ アカウントを設定する必要があります。

Azure portal で、ストレージ アカウントの [ネットワーク] タブに移動し、[選択したネットワーク]、[信頼されたサービスの一覧にある Azure サービスがこのストレージ アカウントにアクセスすることを許可する] の順に選び、[保存] をクリックします。

Note

信頼されたサービス機能は、上記のコマンド ラインを使用してのみ使用でき、Azure portal を使用して実行することはできません。

パブリック ネットワーク アクセスの無効化

Azure portal でストレージ アカウントのパブリック ネットワーク アクセスを無効にすることができます。

Azure OpenAI Studio の使用など、クライアント コンピューターからストレージ アカウントへのアクセスを許可するには、BLOB ストレージに接続するプライベート エンドポイント接続を作成する必要があります。

ロールの割り当て

ここまでは、各リソースの作業を個別に既にセットアップしてあります。 次に、サービスが相互に承認できるようにする必要があります。

ロール 割当先 リソース 説明
Search Index Data Reader Azure OpenAI Azure AI Search 推論サービスにより、インデックスからデータのクエリが実行されます。
Search Service Contributor Azure OpenAI Azure AI Search 推論サービスにより、インデックス スキーマに対して自動フィールド マッピングのクエリが実行されます。 データ インジェスト サービスは、インデックス、データ ソース、スキル セット、インデクサーを作成し、インデクサーの状態についてクエリを実行します。
Storage Blob Data Contributor Azure OpenAI ストレージ アカウント 入力コンテナーから読み取り、前処理結果を出力コンテナーに書き込みます。
Cognitive Services OpenAI Contributor Azure AI Search Azure OpenAI カスタム スキル
Storage Blob Data Contributor Azure AI Search ストレージ アカウント BLOB を読み取り、ナレッジ ストアに書き込みます。

上の表で Assignee は、そのリソースのシステム割り当てマネージド ID を意味します。

管理者がロールの割り当てを追加するには、これらのリソースに対する Owner ロールを持っている必要があります。

Azure portal でこれらのロールを設定する手順については、Azure RBAC に関するドキュメントを参照してください。 GitHub で使用可能なスクリプトを使用して、プログラムでロールの割り当てを追加できます。

開発者がこれらのリソースを使用してアプリケーションをビルドできるようにするには、管理者が次のロールの割り当てを持つ開発者の ID をリソースに追加する必要があります。

ロール リソース 説明
Cognitive Services OpenAI Contributor Azure OpenAI Azure OpenAI Studio からパブリック インジェスト API を呼び出します。 Contributor ロールだけでは不十分です。Contributor ロールしか持っていない場合、Microsoft Entra ID 認証を使用してデータ プレーン API を呼び出せませんが、この記事で説明するセキュリティで保護されたセットアップでは Microsoft Entra ID 認証が必要とされるからです。
Cognitive Services User Azure OpenAI Azure OpenAI Studio から API キーを一覧表示します。
Contributor Azure AI Search Azure OpenAI Studio からインデックスを一覧表示するための API キーを一覧表示します。
Contributor ストレージ アカウント Azure OpenAI Studio からファイルをアップロードするアカウント SAS を一覧表示します。
Contributor 開発者が Web アプリをデプロイする必要があるリソース グループまたは Azure サブスクリプション 開発者の Azure サブスクリプションに Web アプリをデプロイします。

ゲートウェイとクライアントの構成

オンプレミスのクライアント コンピューターから Azure OpenAI サービスにアクセスする方法の 1 つは、Azure VPN Gateway と Azure VPN Client を構成することです。

このガイドラインに従って、お使いの仮想ネットワーク用に仮想ネットワーク ゲートウェイを作成します。

このガイドラインに従ってポイント対サイト構成を追加し、Microsoft Entra ID ベースの認証を有効にします。 Azure VPN クライアント プロファイル構成パッケージをダウンロードして解凍し、AzureVPN/azurevpnconfig.xml ファイルを Azure VPN クライアントにインポートします。

Azure VPN クライアント プロファイルのインポート先を示すスクリーンショット。

リソース ホスト名が仮想ネットワーク内のプライベート IP を指すように、ローカル コンピューターの hosts ファイルを構成します。 hosts ファイルは、Windows の場合は C:\Windows\System32\drivers\etc、Linux の場合は /etc/hosts にあります。 例:

10.0.0.5 contoso.openai.azure.com
10.0.0.6 contoso.search.windows.net
10.0.0.7 contoso.blob.core.windows.net

Azure OpenAI Studio

オンプレミスのクライアント コンピューターから、インジェストと推論の両方を含むすべての Azure OpenAI Studio 機能を使用できるはずです。

Web アプリ

Web アプリは、Azure OpenAI リソースと通信します。 Azure OpenAI リソースではパブリック ネットワークが無効になっているため、仮想ネットワーク内のプライベート エンドポイントを使用して Azure OpenAI リソースにアクセスするように Web アプリを設定する必要があります。

この Web アプリは、Azure OpenAI のホスト名を Azure OpenAI のプライベート エンドポイントのプライベート IP に解決する必要があります。 そのため、まず仮想ネットワークのプライベート DNS ゾーンを構成する必要があります。

  1. リソース グループにプライベート DNS ゾーン を作成します
  2. DNS レコードを追加します。 IP は Azure OpenAI リソースのプライベート エンドポイントのプライベート IP であり、Azure OpenAI のプライベート エンドポイントに関連付けられているネットワーク インターフェイスから IP アドレスを取得できます。
  3. プライベート DNS ゾーンをお使いの仮想ネットワークにリンクして、この仮想ネットワークに統合された Web アプリがこのプライベート DNS ゾーンを使用できるようにします。

Azure OpenAI Studio から Web アプリをデプロイする場合は、仮想ネットワークと同じ場所を選択し、適切な SKU を選択して、仮想ネットワーク統合機能をサポートできるようにします。

Web アプリがデプロイされたら、Azure portal の [ネットワーク] タブで、Web アプリの送信トラフィック仮想ネットワーク統合を構成し、Web アプリ用に予約した 3 番目のサブネットを選びます。

Web アプリの送信トラフィック構成を示すスクリーンショット。

API を使用する

サインイン資格情報に Azure OpenAI リソースに対する Cognitive Services OpenAI Contributor ロールがあることを確認し、最初に az login を実行します。

Azure portal の Cognitive Services OpenAI 共同作成者ロールを示すスクリーンショット。

Ingestion API

インジェスト API で使用される要求オブジェクトと応答オブジェクトの詳細については、インジェスト API のリファレンスの記事を参照してください。

その他の注記:

  • API パスの JOB_NAME は、Azure AI 検索のインデックス名として使用されます。
  • api-key ではなく Authorization ヘッダーを使用してください。
  • storageEndpoint ヘッダーを明示的に設定します。
  • storageConnectionString ヘッダーには ResourceId= 形式を使用します。これにより、Azure OpenAI と Azure AI 検索ではマネージド ID を使用してストレージ アカウントが認証されます。これは、ネットワーク制限をバイパスするために必要です。
  • searchServiceAdminKeyヘッダーは設定しないでください。 Azure OpenAI リソースのシステム割り当て ID は、Azure AI 検索の認証に使用されます。
  • embeddingEndpoint または embeddingKey は設定しないでください。 代わりに、embeddingDeploymentName ヘッダーを使用してテキストのベクター化を有効にします。

ジョブの送信の例

accessToken=$(az account get-access-token --resource https://cognitiveservices.azure.com/ --query "accessToken" --output tsv)
curl -i -X PUT https://my-resource.openai.azure.com/openai/extensions/on-your-data/ingestion-jobs/vpn1025a?api-version=2023-10-01-preview \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $accessToken" \
-H "storageEndpoint: https://mystorage.blob.core.windows.net/" \
-H "storageConnectionString: ResourceId=/subscriptions/1234567-abcd-1234-5678-1234abcd/resourceGroups/my-resource/providers/Microsoft.Storage/storageAccounts/mystorage" \
-H "storageContainer: my-container" \
-H "searchServiceEndpoint: https://mysearch.search.windows.net" \
-H "embeddingDeploymentName: ada" \
-d \
'
{
}
'

ジョブの状態の取得の例

accessToken=$(az account get-access-token --resource https://cognitiveservices.azure.com/ --query "accessToken" --output tsv)
curl -i -X GET https://my-resource.openai.azure.com/openai/extensions/on-your-data/ingestion-jobs/abc1234?api-version=2023-10-01-preview \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $accessToken"

推論 API

推論 API で使用される要求オブジェクトと応答オブジェクトの詳細については、推論 API のリファレンスの記事を参照してください。