データに対して Azure OpenAI を安全に使用する
Note
2024 年 6 月の時点で、Azure AI 検索への Microsoft マネージド プライベート エンドポイントのアプリケーション フォームは不要になりました。
マネージド プライベート エンドポイントは、2025 年 7 月に Microsoft マネージド仮想ネットワークから削除されます。 2024 年 6 月より前にアプリケーション プロセスを通じてマネージド プライベート エンドポイントを既にプロビジョニングしている場合は、サービスの中断を避けるために、できるだけ早く Azure AI 検索の信頼されたサービスを有効にしてください。
この記事では、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 により次が行われます。
- 内部的に、以前に作成した最初のインデクサーを使用してドキュメントを解読します。
- ヒューリスティック ベースのアルゴリズムを使用してチャンクを実行します。 チャンク境界内のテーブル レイアウトやその他の書式設定要素を考慮して、最適なチャンク品質を確保します。
- ベクトル検索を有効にした場合、Azure OpenAI は選択した埋め込み設定を使用してチャンクをベクトル化します。
- サービスが監視しているすべてのデータが処理されると、Azure OpenAI によって 2 番目のインデクサーがトリガーされます。
- インデクサーにより、処理されたデータが Azure AI 検索サービスに格納されます。
サービス呼び出しで使用されるマネージド ID では、システム割り当てマネージド ID のみがサポートされます。 ユーザー割り当てマネージド ID はサポートされていません。
推論アーキテクチャ
データに対する Azure OpenAI モデルとチャットするために API 呼び出しを送信する際に、サービスは推論中にインデックス フィールドを取得してフィールド マッピングを実行する必要があります。 そのため、このサービスでは、推論中であっても、Azure OpenAI ID に検索サービスの Search Service Contributor
ロールが必要です。
推論要求で埋め込みの依存関係が指定された場合、Azure OpenAI は書き換えられたクエリをベクトル化し、クエリとベクターの両方がベクトル検索のために Azure AI 検索に送信されます。
ドキュメント レベルのアクセス制御
Note
ドキュメント レベルのアクセス制御は、Azure AI 検索でのみサポートされています。
データ上で Azure OpenAI を使用すると、Azure AI Search セキュリティ フィルターを使用するさまざまなユーザーの応答で使用できるドキュメントを制限できます。 ドキュメント レベルのアクセスを有効にすると、Azure AI 検索は、フィルターで指定されたユーザーの Microsoft Entra グループ メンバーシップに基づいて検索結果をトリミングします。 ドキュメント レベルのアクセスは、既存の Azure AI Search インデックスに対してのみ有効にすることができます。 ドキュメント レベルのアクセスを有効にするには、次の手順を実行します。
アプリケーションを登録し、ユーザーとグループを作成するには、Azure AI Search のドキュメントの手順に従います。
許可されたグループでドキュメントにインデックスを付けます。 新しいセキュリティ フィールドに次のスキーマがあることを確認します。
{"name": "group_ids", "type": "Collection(Edm.String)", "filterable": true }
group_ids
は既定のフィールド名です。my_group_ids
のような別のフィールド名を使用する場合は、インデックス フィールド マッピングでフィールドをマップできます。インデックス内の各機密ドキュメントで、このセキュリティ フィールド値が、ドキュメントの許可されたグループに設定されていることを確認します。
Azure OpenAI Studio にデータ ソースを追加します。 [インデックス フィールド マッピング] セクションでは、スキーマに互換性がある限り、"許可されたグループ" フィールドに 0 または 1 の値をマップできます。 許可されたグループ フィールドがマップされていない場合、ドキュメント レベルのアクセスは無効になります。
Azure OpenAI Studio
Azure AI 検索インデックスが接続されると、ログインしているユーザーの Microsoft Entra アクセス許可に基づいて、スタジオ内の応答からドキュメントにアクセスできるようになります。
Web アプリケーション
発行された Web アプリを使用している場合は、最新バージョンにアップグレードされるようにそれを再デプロイする必要があります。 最新バージョンの Web アプリには、ログインしているユーザーの Microsoft Entra アカウントのグループを取得して、それをキャッシュし、各 API 要求にグループ ID を含める機能が含まれています。
API
API を使用する場合は、各 API 要求で filter
パラメーターを渡します。 次に例を示します。
重要
次の例は、例示のみを目的としています。 API キーを使用する場合は、それを Azure Key Vault などの別の場所に安全に保存します。 API キーは、コード内に直接含めないようにし、絶対に公開しないでください。
AI サービスのセキュリティの詳細については、「Azure AI サービスに対する要求の認証」を参照してください。
{
"messages": [
{
"role": "user",
"content": "who is my manager?"
}
],
"data_sources": [
{
"type": "azure_search",
"parameters": {
"endpoint": "<AZURE_AI_SEARCH_ENDPOINT>",
"key": "<AZURE_AI_SEARCH_API_KEY>",
"index_name": "<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 アドレスは動的であるためです。
リソース グループの作成
関連するすべてのリソースを整理できるように、リソース グループを作成します。 リソース グループ内のリソースには次のものが含まれますが、これらに限定されません。
- 1 つの仮想ネットワーク
- 3 つの主要サービス: Azure OpenAI、Azure AI 検索、ストレージ アカウントが各 1 つ
- 3 つのプライベート エンドポイント (それぞれが 1 つのキー サービスにリンクされている)
- 3 つのネットワーク インターフェイス (それぞれが 1 つのプライベート エンドポイントに関連付けられている)
- 1 つの仮想ネットワーク ゲートウェイ (オンプレミスのクライアント マシンからのアクセス用)
- 仮想ネットワークが統合された 1 つの Web アプリ
- 1 つのプライベート DNS ゾーン (Web アプリがお使いの Azure OpenAI の IP をみつけられるようにするため)
Create virtual network
仮想ネットワークには 3 つのサブネットが含まれています。
- 最初のサブネットは仮想ネットワーク ゲートウェイにのみ使用されます。
- 2 番目のサブネットは、3 つのキー サービスのプライベート エンドポイントに使用されます。
- 3 番目のサブネットは空で、Web アプリの送信仮想ネットワーク統合に使用されます。
Azure OpenAI の構成
有効になっているカスタム サブドメイン
カスタム サブドメインは、Microsoft Entra ID ベースの認証とプライベート DNS ゾーンに必要です。 ARM テンプレートを使用して Azure OpenAI リソースを作成する場合は、カスタム サブドメインを明示的に指定する必要があります。
マネージド ID の有効化
Azure OpenAI Service が Microsoft Entra ID 認証を介して Azure AI 検索とストレージ アカウントで認識されるようにするには、Azure OpenAI Service にマネージド ID を割り当てる必要があります。 Azure portal でシステム割り当てマネージド ID をオンに切り替えるのが最も簡単な方法です。
管理 API を使用してマネージド ID を設定するには、管理 API リファレンス ドキュメントを参照してください。
"identity": {
"principalId": "<YOUR-PRINCIPAL-ID>",
"tenantId": "<YOUR-TENNANT-ID>",
"type": "SystemAssigned, UserAssigned",
"userAssignedIdentities": {
"/subscriptions/<YOUR-SUBSCIRPTION-ID>/resourceGroups/my-resource-group",
"principalId": "<YOUR-PRINCIPAL-ID>",
"clientId": "<YOUR-CLIENT-ID>"
}
}
信頼されたストレージを有効にする
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.bypass
を AzureServices
に設定します。 詳細については、仮想ネットワークに関する記事を参照してください。
この手順は、Azure AI 検索リソースの共有プライベート リンクがある場合にのみスキップできます。
パブリック ネットワーク アクセスの無効化
Azure portal で Azure OpenAI リソースのパブリック ネットワーク アクセスを無効にすることができます。
Azure OpenAI Studio の使用など、クライアント コンピューターから Azure OpenAI Service にアクセスできるようにするには、Azure OpenAI リソースに接続するプライベート エンドポイント接続を作成する必要があります。
Azure AI 検索の構成
検索リソースには、Basic 価格レベル以上を使用できます。 必須ではありませんが、S2 価格レベルを使用する場合は、高度なオプションを使用できます。
マネージド ID の有効化
Microsoft Entra ID 認証を使用して他のリソースが Azure AI 検索を認識できるようにするには、Azure AI 検索にマネージド ID を割り当てる必要があります。 Azure portal でシステム割り当てマネージド ID をオンに切り替えるのが最も簡単な方法です。
ロールベースのアクセス制御を有効にする
Azure OpenAI ではマネージド ID を使用して Azure AI 検索にアクセスするため、お使いの Azure AI 検索でロールベースのアクセス制御を有効にする必要があります。 Azure portal でこれを行うには、Azure portal の [キー] タブで [両方] または [ロールベースのアクセス制御] を選択します。
詳細については、Azure AI 検索の RBAC に関する記事を参照してください。
パブリック ネットワーク アクセスの無効化
Azure portal で Azure AI 検索リソースのパブリック ネットワーク アクセスを無効にすることができます。
Azure OpenAI Studio の使用など、クライアント コンピューターから Azure AI 検索リソースへのアクセスを許可するには、ご利用の Azure AI 検索リソースに接続するプライベート エンドポイント接続を作成する必要があります。
信頼されたストレージを有効にする
Azure portal から検索リソースの信頼されたサービスを有効にすることができます。
検索リソースの [ネットワーク] タブに移動します。パブリック ネットワーク アクセスが無効にされている場合、[信頼されたサービス リストにある Azure サービスに対し、この検索サービスにアクセスすることを許可します] を選択します。
REST API を使用して、信頼されたサービスを有効にすることもできます。 この例では、Azure CLI と jq
ツールを使用します。
rid=/subscriptions/<YOUR-SUBSCRIPTION-ID>/resourceGroups/<YOUR-RESOURCE-GROUP>/providers/Microsoft.Search/searchServices/<YOUR-RESOURCE-NAME>
apiVersion=2024-03-01-Preview
#store the resource properties in a variable
az rest --uri "https://management.azure.com$rid?api-version=$apiVersion" > search.json
#replace bypass with AzureServices using jq
jq '.properties.networkRuleSet.bypass = "AzureServices"' search.json > search_updated.json
#apply the updated properties to the resource
az rest --uri "https://management.azure.com$rid?api-version=$apiVersion" \
--method PUT \
--body @search_updated.json
共有プライベート リンクを作成する
ヒント
Basic 価格レベルまたは Standard 価格レベルを使用している場合や、すべてのリソースを安全にセットアップするのが初めての場合、この高度なトピックはスキップしてください。
このセクションは、スキル セットがあるインデクサーに対するプライベート エンドポイントのサポートが必要であるため、S2 価格レベルの検索リソースにのみ適用できます。
Azure OpenAI リソースに接続している検索リソースから共有プライベート リンクを作成するには、検索ドキュメントを参照してください。 [リソースの種類] で Microsoft.CognitiveServices/accounts
を、[グループ ID] で openai_account
を選択します。
共有プライベート リンクを使用すると、データ インジェスト アーキテクチャ図の手順 8 が、バイパスの信頼できるサービスから共有プライベート リンクに変更されます。
ストレージ アカウントを構成する
信頼されたストレージを有効にする
Azure OpenAI と Azure AI 検索からご自分のストレージ アカウントへのアクセスを許可するには、マネージド ID に基づく信頼されたサービスとして Azure OpenAI と Azure AI 検索をバイパスするようにストレージ アカウントを設定する必要があります。
Azure portal で、ストレージ アカウントの [ネットワーク] タブに移動し、[選択したネットワーク]、[信頼されたサービスの一覧にある Azure サービスがこのストレージ アカウントにアクセスすることを許可する] の順に選び、[保存] をクリックします。
パブリック ネットワーク アクセスの無効化
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 Reader |
Azure AI Search | ストレージ アカウント | ドキュメント BLOB とチャンク BLOB を読み取ります。 |
Cognitive Services OpenAI User |
Web アプリ | Azure OpenAI | 推論。 |
上の表で 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 アプリをデプロイします。 |
Role Based Access Control Administrator |
Azure OpenAI | Azure OpenAI リソースに必要なロールの割り当てを構成するためのアクセス許可。 Web アプリで Azure Open AI を呼び出できるようにします。 |
ゲートウェイとクライアントの構成
オンプレミスのクライアント コンピューターから Azure OpenAI Service にアクセスする方法の 1 つは、Azure VPN Gateway と Azure VPN クライアントを構成することです。
このガイドラインに従って、お使いの仮想ネットワーク用に仮想ネットワーク ゲートウェイを作成します。
このガイドラインに従ってポイント対サイト構成を追加し、Microsoft Entra ID ベースの認証を有効にします。 Azure VPN クライアント プロファイル構成パッケージをダウンロードして解凍し、AzureVPN/azurevpnconfig.xml
ファイルを 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 ゾーンを構成する必要があります。
- リソース グループにプライベート DNS ゾーン を作成します。
- DNS レコードを追加します。 IP は Azure OpenAI リソースのプライベート エンドポイントのプライベート IP であり、Azure OpenAI のプライベート エンドポイントに関連付けられているネットワーク インターフェイスから IP アドレスを取得できます。
- プライベート DNS ゾーンをお使いの仮想ネットワークにリンクして、この仮想ネットワークに統合された Web アプリがこのプライベート DNS ゾーンを使用できるようにします。
Azure OpenAI Studio から Web アプリをデプロイする場合は、仮想ネットワークと同じ場所を選択し、適切な SKU を選択して、仮想ネットワーク統合機能をサポートできるようにします。
Web アプリがデプロイされたら、Azure portal の [ネットワーク] タブで、Web アプリの送信トラフィック仮想ネットワーク統合を構成し、Web アプリ用に予約した 3 番目のサブネットを選びます。
API を使用する
サインイン資格情報に Azure OpenAI リソースに対する Cognitive Services OpenAI Contributor
ロールがあることを確認し、最初に az login
を実行します。
Ingestion API
インジェスト API で使用される要求オブジェクトと応答オブジェクトの詳細については、インジェスト API のリファレンスの記事を参照してください。
推論 API
推論 API で使用される要求オブジェクトと応答オブジェクトの詳細については、推論 API のリファレンスの記事を参照してください。
Microsoft Defender for Cloud を使用する
Microsoft Defender for Cloud (プレビュー) を Azure リソースと統合して、アプリケーションを保護できるようになりました。 Microsoft Defender for Cloud は、AI ワークロードへの脅威に対する保護を使用してアプリケーションを保護し、Microsoft 脅威インテリジェンス シグナルで強化された証拠ベースのセキュリティ アラートをチームに提供するとともに、統合されたセキュリティのベスト プラクティスの推奨事項を使用して、チームがセキュリティ態勢を強化できるようにします。
アクセスを申請するには、こちらのフォームをご使用ください。