安全地使用 Azure OpenAI On Your Data
注意
自 2024 年 6 月起,不再需要 Microsoft 受控私人端點至 Azure AI 搜尋服務的申請表單。
受控私人端點將於 2025 年 7 月從 Microsoft 受控虛擬網路刪除。 如果您已在 2024 年 6 月之前透過應用程式程序佈建受控私人端點,請盡早啟用 Azure AI 搜尋服務信任的服務,以避免服務中斷。
使用本文,了解如何透過使用 Microsoft Entra ID 角色型存取控制、虛擬網路和私人端點來保護資料和資源,以安全地使用 Azure OpenAI On Data。
只有當搭配文字使用 Azure OpenAI On Your Data 時,才適用本文。 搭配圖片使用 Azure OpenAI On Your Data 時則不適用。
資料擷取結構
當您使用 Azure OpenAI On Your Data,從 Azure Blob 儲存體、本機檔案或 URL 將資料內嵌至 Azure AI 搜尋服務時,會使用下列流程來處理資料。
- 步驟 1 和 2 僅用於上傳檔案。
- 此圖表並未說明如何將 URL 下載至您的 Blob 儲存體。 從網際網路下載網頁並上傳至 Blob 儲存體之後,步驟 3 以後的流程都是相同的。
- Azure AI 搜尋服務資源中會建立兩個索引子、兩個索引、兩個資料來源和自訂技能。
- 區塊容器會建立在 Blob 儲存體中。
- 如果排程觸發擷取,擷取程序會從步驟 7 開始。
- Azure OpenAI 的
preprocessing-jobs
API 會實作 Azure AI 搜尋服務客戶技能 Web API 通訊協定,並在佇列中處理文件。 - Azure OpenAI:
- 內部使用稍早建立的第一個索引子來破解文件。
- 使用啟發學習法演算法來執行區塊化。 它會接受區塊界限中的表格版面配置和其他格式化元素,以確保最佳的區塊化品質。
- 如果您選擇啟用向量搜尋,Azure OpenAI 會使用選取的內嵌設定,以將區塊向量化。
- 服務監視的所有資料都經過處理之後,Azure OpenAI 會觸發第二個索引子。
- 索引子會將已處理的資料儲存至 Azure AI 搜尋服務。
針對服務呼叫中使用的受控識別,僅支援系統指派的受控識別。 使用者指派的受控識別不受支援。
推斷結構
當您傳送 API 呼叫來與資料上的 Azure OpenAI 模型交談時,服務必須在推斷期間擷取索引欄位,以執行欄位對應。 因此,即使在推斷期間,服務也需要 Azure OpenAI 身分識別具有搜尋服務的 Search Service Contributor
角色。
如果在推斷要求中提供內嵌相依性,Azure OpenAI 會將重寫查詢向量化,並將查詢和向量傳送至 Azure AI 搜尋服務進行向量搜尋。
文件層級的存取控制
注意
只有 Azure AI 搜尋服務支援文件層級的存取控制。
Azure OpenAI On Your Data 可讓您使用 Azure AI 搜尋服務安全性篩選器,來限制可用於回應不同使用者的文件。 啟用文件層級存取時,Azure AI 搜尋服務會根據篩選中指定的使用者 Microsoft Entra 群組成員資格來修剪搜尋結果。 您只能在現有的 Azure AI 搜尋服務索引上,啟用文件層級的存取權。 若要啟用文件層級的存取權:
若要註冊您的應用程式並建立使用者和群組,請遵循 Azure AI 搜尋服務文件中的步驟。
使用允許的群組來索引文件。 確定新的安全性欄位具有結構描述:
{"name": "group_ids", "type": "Collection(Edm.String)", "filterable": true }
group_ids
是預設欄位名稱。 如果您使用不同的欄位名稱 (例如my_group_ids
),則可以在 [索引欄位對應] 中對應欄位。請確定索引中的每個敏感性文件都已將此安全性欄位值設定為文件允許的群組。
在 [Azure OpenAI Studio] 中新增您的資料來源。 在 [索引欄位對應] 區段中,只要結構描述相容,您就可以將零或一個值對應至 [允許的群組] 欄位。 如果未對應 [允許的群組] 欄位,則會停用文件層級存取權。
Azure OpenAI 工作室
連接 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 位址是動態的。
建立資源群組
建立資源群組,以便組織所有相關資源。 資源群組中的資源包括但不限於:
- 一個虛擬網路
- 三個主要服務:一個 Azure OpenAI、一個 Azure AI 搜尋服務、一個儲存體帳戶
- 三個私人端點,每個端點都連結至一個金鑰服務
- 三個網路介面,每個介面都與一個私人端點相關聯
- 一個虛擬網路閘道,用於從內部部署用戶端電腦存取
- 一個已整合虛擬網路的 Web 應用程式
- 一個私人 DNS 區域,讓 Web 應用程式找到 Azure OpenAI 的 IP
建立虛擬網路
虛擬網路有三個子網路。
- 第一個子網路用於虛擬網路閘道。
- 第二個子網路用於三個金鑰服務的私人端點。
- 第三個子網路是空的,用於 Web 應用程式輸出虛擬網路整合。
設定 Azure OpenAI
已啟用自訂子網域
Microsoft Entra ID 型驗證和私人 DNS 區域都需要自訂子網域。 如果使用 ARM 範本建立 Azure OpenAI 資源,則必須明確指定自訂子網域。
啟用受控識別
若要允許 Azure AI 搜尋服務和儲存體帳戶透過 Microsoft Entra ID 驗證,來辨識您的 Azure OpenAI 服務,您必須為 Azure OpenAI 服務指派受控識別。 最簡單的方式是在 Azure 入口網站上,切換開啟系統指派的受控識別。
若要透過管理 API 設定受控識別,請參閱管理 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 AI 搜尋服務呼叫 Azure OpenAI preprocessing-jobs
,作為自訂技能 Web API,且 Azure OpenAI 沒有公用網路存取權,您必須設定 Azure OpenAI,以略過 Azure AI 搜尋服務作為以受控識別為基礎的受信任服務。 Azure OpenAI 會驗證 JSON Web 權杖 (JWT) 中的宣告,以識別來自 Azure AI 搜尋服務的流量。 Azure AI 搜尋服務必須使用系統指派的受控識別驗證,來呼叫自訂技能 Web API。
從管理 API 將 networkAcls.bypass
設定為 AzureServices
。 如需詳細資訊,請參閱虛擬網路文章。
只有在 Azure AI 搜尋服務資源有共用的私人連結時,才能略過此步驟。
停用公用網路存取
您可以在 Azure 入口網站中,停用 Azure OpenAI 資源的公用網路存取權。
若要允許從用戶端電腦存取 Azure OpenAI 服務 (例如使用 Azure OpenAI Studio),您必須建立連線到 Azure OpenAI 資源的私人端點連線 (部分機器翻譯)。
設定 Azure AI 搜尋服務
您可以針對搜尋資源使用基本定價層和更高層級。 並非必要,但如果您使用 S2 定價層,則可以使用進階選項。
啟用受控識別
若要允許其他資源使用 Microsoft Entra ID 驗證來辨識 Azure AI 搜尋服務,您必須為 Azure AI 搜尋服務指派受控識別。 最簡單的方式是在 Azure 入口網站上,切換系統指派的受控識別。
啟用角色型存取控制
當 Azure OpenAI 使用受控識別來存取 Azure AI 搜尋服務時,您必須在 Azure AI 搜尋服務中啟用角色型存取控制。 若要在 Azure 入口網站上執行此動作,請在 Azure 入口網站的 [金鑰] 索引標籤中選取 [兩者] 或 [角色型存取控制]。
如需詳細資訊,請參閱 Azure AI 搜尋服務 RBAC 文章。
停用公用網路存取
您可以在 Azure 入口網站中,停用 Azure AI 搜尋服務資源的公用網路存取權。
若要允許從用戶端電腦存取 Azure AI 搜尋服務資源 (例如使用 Azure OpenAI Studio),您必須建立連線到 Azure AI 搜尋服務資源的私人端點連線。
啟用信任的服務
您可以從 Azure 入口網站啟用搜尋資源的受信任服務。
移至搜尋資源的 [網路] 索引標籤。將公用網路存取設定為 [已停用] 後,選取 [允許受信任服務清單上的 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
建立共用的私人連結
提示
如果您使用基本或標準定價層,或這是您第一次安全地設定所有資源,則應該略過此進階主題。
本節僅適用於 S2 定價層搜尋資源,因為需要具有技能集索引子的私人端點支援。
若要從連線至 Azure OpenAI 資源的搜尋資源建立共用私人連結,請參閱搜尋文件。 選取 [資源類型] 作為 Microsoft.CognitiveServices/accounts
,並選取 [群組 ID] 作為 openai_account
。
有了共用私人連結,資料擷取結構圖表的步驟 8 會從 [略過信任的服務] 變更為 [共用私人連結]。
設定儲存體帳戶
啟用信任的服務
若要允許從 Azure OpenAI 和 Azure AI 搜尋服務存取您的儲存體帳戶,您必須設定儲存體帳戶,以略過 Azure OpenAI 和 Azure AI 搜尋服務,作為以受控識別為基礎的受信任服務。
在 Azure 入口網站中,瀏覽至您的儲存體帳戶網路索引標籤,選擇 [選取的網络],然後選取 [允許受信任服務清單上的 Azure 服務存取此儲存體帳戶],並按一下 [儲存]。
停用公用網路存取
您可以在 Azure 入口網站中,停用儲存體帳戶的公用網路存取權。
若要允許從用戶端電腦存取儲存體帳戶 (例如使用 Azure OpenAI Studio),您必須建立連線到 Blob 儲存體的私人端點連線。
角色指派
到目前為止,您已經獨立設定每個資源工作。 接下來,您必須允許服務彼此授權。
角色 | 受託人 | 資源 | 描述 |
---|---|---|---|
Search Index Data Reader |
Azure OpenAI | Azure AI 搜尋服務 | 推斷服務會從索引查詢資料。 |
Search Service Contributor |
Azure OpenAI | Azure AI 搜尋服務 | 推斷服務會查詢自動欄位對應的索引結構描述。 資料擷取服務會建立索引、資料來源、技能集、索引子,以及查詢索引子狀態。 |
Storage Blob Data Contributor |
Azure OpenAI | 儲存體帳戶 | 從輸入容器讀取,並將前置處理過的結果寫入輸出容器。 |
Cognitive Services OpenAI Contributor |
Azure AI 搜尋服務 | Azure OpenAI | 自訂技能。 |
Storage Blob Data Reader |
Azure AI 搜尋服務 | 儲存體帳戶 | 讀取文件 Blob 和區塊 Blob。 |
Cognitive Services OpenAI User |
Web 應用程式 | Azure OpenAI | 推斷。 |
在上表中,Assignee
表示該資源的系統指派受控識別。
系統管理員必須在這些資源上擁有 Owner
角色,才能新增角色指派。
如需在 Azure 入口網站中設定這些角色的指示,請參閱 Azure RBAC 文件。 您可以使用 GitHub 上適用的指令碼,以程式設計方式新增角色指派。
若要讓開發人員使用這些資源來建置應用程式,系統管理員必須將具有下列角色指派的開發人員身分新增至資源。
角色 | 資源 | 描述 |
---|---|---|
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 搜尋服務 | 從 Azure OpenAI Studio 中列出 API 金鑰,以列出索引。 |
Contributor |
儲存體帳戶 | 列出帳戶 SAS 以從 Azure OpenAI Studio 上傳檔案。 |
Contributor |
開發人員需要在其中部署 Web 應用程式的資源群組或 Azure 訂用帳戶 | 將 Web 應用程式部署至開發人員的 Azure 訂用帳戶。 |
Role Based Access Control Administrator |
Azure OpenAI | 在 Azure OpenAI 資源上設定必要角色指派的權限。 讓 Web 應用程式呼叫 Azure Open AI。 |
設定閘道和用戶端
若要從內部部署用戶端電腦存取 Azure OpenAI 服務,其中一種方法是設定 Azure VPN 閘道和 Azure VPN Client。
按照此指導方針,為虛擬網路建立虛擬網路閘道。
按照此指導方針來新增點對站組態,並啟用 Microsoft Entra ID 型驗證。 下載 Azure VPN 用戶端設定檔組態套件、解壓縮,並將 AzureVPN/azurevpnconfig.xml
檔案匯入 Azure VPN Client。
設定本機電腦 hosts
檔案,將資源主機名稱指向虛擬網路中的私人 IP。 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 工作室
您應該能夠使用內部部署用戶端電腦的所有 Azure OpenAI Studio 功能,包括擷取和推斷功能。
Web 應用程式
Web 應用程式會與您的 Azure OpenAI 資源通訊。 由於 Azure OpenAI 資源已停用公用網路,因此必須設定 Web 應用程式,才能使用虛擬網路中的私人端點來存取 Azure OpenAI 資源。
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 入口網站網路] 索引標籤,設定 Web 應用程式輸出流量虛擬網路整合,並選擇您為 Web 應用程式保留的第三個子網路。
使用 API
請確定您的登入認證在 Azure OpenAI 資源上具有 Cognitive Services OpenAI Contributor
角色,並先執行 az login
。
擷取 API
如需擷取 API 所使用的要求和回應物件詳細資料,請參閱擷取 API 參照文章。
推斷 API
如需推斷 API 所使用的要求和回應物件詳細資料,請參閱推斷 API 參照文章。
使用適用於雲端的 Microsoft Defender
您現在可以將適用於雲端的 Microsoft Defender (預覽版) 與您的 Azure 資源整合,以保護應用程式。 適用於雲端的 Microsoft Defender 會使用 AI 工作負載威脅防護來保護您的應用程式,為小組提供富有 Microsoft 威脅情報訊號的證據型安全性警示,並讓小組使用整合式安全性最佳做法建議,強化其安全性態勢。
使用此表單要求存取權。