Share via


安全地在您的數據上使用 Azure OpenAI

使用本文,瞭解如何使用 Microsoft Entra ID 角色型訪問控制、虛擬網路和私人端點來保護數據和資源,以安全地使用 Azure OpenAI On Data。

本文僅適用於搭配文字使用 Azure OpenAI On Data 時。 它不適用於 具有影像的 Azure OpenAI On Data。

數據擷取架構

當您使用 Azure OpenAI On 您的數據,將數據從 Azure Blob 記憶體、本機檔案或 URL 內嵌至 Azure AI 搜尋時,下列程式會用來處理數據。

顯示擷取數據的流程圖表。

  • 步驟 1 和 2 僅用於檔案上傳。
  • 此圖並未說明如何將 URL 下載至您的 Blob 記憶體。 從因特網下載網頁並上傳至 Blob 記憶體之後,步驟 3 和步驟 3 相同。
  • Azure AI 搜尋資源中會建立兩個索引器、兩個索引、兩個數據源和自定義 技能
  • 區塊容器會在 Blob 記憶體中建立。
  • 如果擷取是由 排程的重新整理觸發,擷取程式會從步驟 7 開始。
  • Azure OpenAI 的 preprocessing-jobs API 會 實作 Azure AI 搜尋服務客戶技能 Web API 通訊協定,並在佇列中處理檔。
  • Azure OpenAI:
    1. 內部會使用稍早建立的第一個索引器來破解檔。
    2. 使用啟發學習法演算法來執行區塊化、接受區塊界限中的表格版面配置和其他格式化專案,以確保最佳的區塊化品質。
    3. 如果您選擇啟用向量搜尋,Azure OpenAI 會使用選取的內嵌部署,在內部向量化區塊。
  • 處理服務監視的所有數據時,Azure OpenAI 會觸發第二個索引器。
  • 索引器會將已處理的數據儲存至 Azure AI 搜尋服務。

針對服務呼叫中使用的受控識別,僅支持系統指派的受控識別。 不支援使用者指派的受控識別。

推斷架構

此圖顯示使用推斷 API 的程式。

當您傳送 API 呼叫來與數據上的 Azure OpenAI 模型聊天時,服務必須在推斷期間擷取索引字段,以在要求中未明確設定字段對應時自動執行字段對應。 因此,即使推斷期間,服務也需要 Azure OpenAI 身分 Search Service Contributor 識別具有搜尋服務的角色。

如果在推斷要求中提供內嵌部署,重寫查詢會由 Azure OpenAI 向量化,而且查詢和向量都會傳送 Azure AI 搜尋進行向量搜尋。

檔層級訪問控制

注意

僅支援 Azure AI 搜尋的檔層級存取控制。

Azure OpenAI On Your Data 可讓您使用 Azure AI 搜尋 服務安全性篩選器來限制可用於回應不同用戶的檔。 當您啟用檔層級存取時,會根據使用者 Microsoft Entra 群組成員資格來修剪從 Azure AI 搜尋服務傳回並用來產生回應的搜尋結果。 您只能在現有的 Azure AI 搜尋索引上啟用檔案層級存取。 若要開啟檔案層級存取:

  1. 請遵循 Azure AI 搜尋檔中的步驟來註冊您的應用程式,並建立使用者和群組。

  2. 使用其允許的群組編製檔索引。 請確定您的新 安全性欄位 具有下列架構:

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

    group_ids 是預設功能變數名稱。 如果您使用不同的功能變數名稱, my_group_ids例如 ,您可以在索引欄位對應中 對應欄位。

  3. 請確定索引中的每個敏感性檔都已在此安全性欄位上正確設定值,以指出檔允許的群組。

  4. Azure OpenAI Studio 中,新增您的數據源。 在 索引欄位對應 區段中,只要架構相容,您就可以將零或一個值對應至 允許的群組 欄位。 如果 [允許的群組] 字段未對應,將不會啟用檔層級存取。

Azure OpenAI 工作室

連線 Azure AI 搜尋服務索引之後,您的 Studio 回應將會根據登入使用者的 Microsoft Entra 許可權取得檔存取權。

Web 應用程式

如果您使用已發佈 的 Web 應用程式,您必須重新部署它以升級至最新版本。 最新版的 Web 應用程式包含擷取登入使用者的 Microsoft Entra 帳戶群組、快取它,以及在每個 API 要求中包含群組識別子的能力。

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 腳本來驗證您的設定,並判斷這裡所列的所有需求是否符合。

建立資源群組

建立資源群組,以便組織所有相關資源。 資源群組中的資源包括但不限於:

  • 一個虛擬網路
  • 三個主要服務:一個 Azure OpenAI、一個 Azure AI 搜尋服務、一個 儲存體 帳戶
  • 三個私人端點,每個端點都連結至一個密鑰服務
  • 三個網路介面,每個介面都與一個私人端點相關聯
  • 一個虛擬網路閘道,用於從內部部署用戶端電腦存取
  • 一個已整合虛擬網路的 Web 應用程式
  • 一個 私用 DNS 區域,因此 Web 應用程式會尋找 Azure OpenAI 的 IP

建立虛擬網路

虛擬網路有三個子網。

  1. 第一個子網用於三個私人端點的私人IP。
  2. 當您建立虛擬網路閘道時,會自動建立第二個子網。
  3. 第三個子網是空的,用於 Web 應用程式輸出虛擬網路整合。

顯示虛擬網路架構的圖表。

請注意 Microsoft 所建立的 Microsoft 受控虛擬網路,而且您無法看到它。 Azure OpenAI 會使用 Microsoft 受控虛擬網路安全地存取 Azure AI 搜尋服務。

設定 Azure OpenAI

已啟用自定義子域

如果您透過 Azure 入口網站 建立 Azure OpenAI,則應該已經建立自定義子域。 Microsoft Entra ID 型驗證和私人 DNS 區域需要自定義子域。

啟用受控識別

若要允許 Azure AI 搜尋和 儲存體 帳戶透過 Microsoft Entra ID 驗證來辨識您的 Azure OpenAI 服務,您必須為 Azure OpenAI 服務指派受控識別。 最簡單的方式是在 Azure 入口網站 上切換系統指派的受控識別。 顯示 Azure 入口網站 中系統指派受控識別選項的螢幕快照。

若要透過管理 API 設定受控識別,請參閱 管理 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 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.bypassAzureServices 。 如需詳細資訊,請參閱 虛擬網路一文

注意

受信任的服務功能只能使用上述命令來使用,而且無法使用 Azure 入口網站。

只有在 Azure AI 搜尋資源有 共用私人連結 時,才能略過此步驟。

停用公用網路存取

您可以在 Azure 入口網站 中停用 Azure OpenAI 資源的公用網路存取。

若要允許從用戶端電腦存取 Azure OpenAI 服務,例如使用 Azure OpenAI Studio,您必須建立 連線到 Azure OpenAI 資源的私人端點連線

您可以針對下列組態使用基本定價層和更高層級。 這並非必要,但如果您使用 S2 定價層,您會看到 其他選項 可供選取。

啟用受控識別

若要允許其他資源使用 Microsoft Entra ID 驗證來辨識 Azure AI 搜尋,您必須為 Azure AI 搜尋指派受控識別。 最簡單的方式是在 Azure 入口網站 中切換系統指派的受控識別。

螢幕快照,顯示 Azure 入口網站 中 Azure AI 搜尋的受控識別設定。

啟用角色型訪問控制

當 Azure OpenAI 使用受控識別來存取 Azure AI 搜尋時,您必須在 Azure AI 搜尋服務中啟用角色型存取控制。 若要在 Azure 入口網站 上執行此動作,請在 Azure 入口網站 的 [金鑰] 索引卷標中選取 [兩者]。

此螢幕快照顯示 azure AI 搜尋在 Azure 入口網站 中的受控識別選項。

若要透過 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 入口網站 中停用 Azure AI 搜尋資源的公用網路存取。

若要允許從用戶端電腦存取 Azure AI 搜尋資源,例如使用 Azure OpenAI Studio,您必須建立 連線到 Azure AI 搜尋資源的私人端點連線

注意

若要允許從 Azure OpenAI 資源存取 Azure AI 搜尋資源,您需要提交 應用程式表單。 應用程式會在 5 個工作天內檢閱,您將會透過電子郵件連絡有關結果。 如果您符合資格,我們會在 Microsoft 受控虛擬網路中布建私人端點,並將私人端點連線要求傳送至您的搜尋服務,您必須核准要求。

顯示私人端點核准畫面的螢幕擷取畫面。

私人端點資源會在 Microsoft 受控租使用者中布建,而鏈接的資源位於您的租使用者中。 您只要按下 [網络] 頁面的 [私人存取] 索引卷標的私人端點連結(藍色字型),即可存取私人端點資源。 相反地,按兩下數據列上的其他地方,則上述的 [核准 ] 按鈕應該可點選。

深入了解手動核准工作流程

提示

如果您使用基本或標準定價層,或是您第一次安全地設定所有資源,則應該略過此進階主題。

本節僅適用於 S2 定價層搜尋資源,因為它需要 具有技能集之索引器的私人端點支援。

若要從連線到 Azure OpenAI 資源的搜尋資源建立共用私人連結,請參閱 搜尋檔。 選取 [資源類型 ] 作為 Microsoft.CognitiveServices/accounts ,並將 [群組識別符 ] 選取為 openai_account

使用共用私人連結時, 數據擷取架構圖表的步驟 8 會從 略過受信任的服務 變更為 私人端點

此圖顯示使用 S2 搜尋資源擷取數據的程式。

您建立的 Azure AI 搜尋共用私人連結也位於 Microsoft 受控虛擬網路中,而不是您的虛擬網路。 相較於稍早建立的其他受控私人端點,差異在於受控私人端點[1]從 Azure OpenAI 到 Azure 搜尋服務都是透過表單應用程式佈建,而從 Azure 搜尋服務到 Azure OpenAI 的受控私人端點[2]則透過 Azure 搜尋服務的 Azure 入口網站 或 REST API 布建。

顯示具有 S2 搜尋資源的虛擬網路架構圖表。

設定儲存體帳戶

啟用信任的服務

若要允許從 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 Contributor Azure AI 搜尋服務 儲存體帳戶 讀取 Blob 並寫入知識存放區。

在上表中, 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 搜尋服務 列出 API 金鑰以從 Azure OpenAI Studio 列出索引。
Contributor 儲存體帳戶 列出帳戶 SAS 以從 Azure OpenAI Studio 上傳檔案。
Contributor 開發人員需要在其中部署 Web 應用程式的資源群組或 Azure 訂用帳戶 將 Web 應用程式部署至開發人員的 Azure 訂用帳戶。

設定閘道和用戶端

若要從內部部署用戶端計算機存取 Azure OpenAI 服務,其中一種方法是設定 Azure VPN 閘道 和 Azure VPN 用戶端。

遵循 此指導方針 來建立虛擬網路的虛擬網路閘道。

請遵循 此指導方針 來新增點對站組態,並啟用 Microsoft Entra ID 型驗證。 下載 Azure VPN 用戶端設定檔元件、解壓縮檔案,並將檔案匯 AzureVPN/azurevpnconfig.xml 入您的 Azure VPN 用戶端。

顯示匯入 Azure VPN 用戶端設定檔位置的螢幕快照。

將本機計算機 hosts 檔案設定為將資源主機名指向虛擬網路中的私人IP。 檔案hosts位於適用於 Windows,且/etc/hosts位於 C:\Windows\System32\drivers\etc Linux 上。 範例:

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 區域。

  1. 在您的資源群組中建立私人 DNS 區域
  2. 新增 DNS 記錄。 IP 是 Azure OpenAI 資源私人端點的私人 IP,您可以從 Azure OpenAI 私人端點相關聯的網路介面取得 IP 位址。
  3. 將私人 DNS 區域連結至您的虛擬網路 ,讓此虛擬網路中整合的 Web 應用程式可以使用此私人 DNS 區域。

從 Azure OpenAI Studio 部署 Web 應用程式時,請選取與虛擬網路相同的位置,然後選取適當的 SKU,以便支援 虛擬網路整合功能

部署 Web 應用程式之後,從 [Azure 入口網站 網络] 索引卷標,設定 Web 應用程式輸出流量虛擬網路整合,選擇您保留給 Web 應用程式的第三個子網。

顯示 Web 應用程式的輸出流量設定的螢幕快照。

使用 API

請確定您的登入認證在 Azure OpenAI 資源上具有 Cognitive Services OpenAI Contributor 角色,然後先執行 az login

螢幕快照,顯示 Azure 入口網站 中的認知服務 OpenAI 參與者角色。

擷取 API

如需擷取 API 所使用的要求和回應物件的詳細資訊,請參閱擷取 API 參考文章

其他注意事項:

  • JOB_NAME 在 API 路徑中,會作為 Azure AI 搜尋中的索引名稱使用。
  • Authorization使用標頭,而不是 api-key。
  • 明確設定 storageEndpoint 標頭。
  • 使用ResourceId=storageConnectionString標頭的格式,因此 Azure OpenAI 和 Azure AI 搜尋會使用受控識別來驗證記憶體帳戶,這是略過網路限制的必要條件。
  • 請勿 設定 searchServiceAdminKey 標頭。 Azure OpenAI 資源的系統指派身分識別可用來驗證 Azure AI 搜尋。
  • 請勿 設定 embeddingEndpointembeddingKey。 請改用 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 參考文章

使用適用於雲端的 Microsoft Defender

您現在可以將 適用於雲端的 Microsoft Defender (預覽) 與 Azure 資源整合,以保護您的應用程式。 適用於雲端的 Microsoft Defender 使用 AI 工作負載的威脅防護保護您的應用程式,為小組提供以證據為基礎的安全性警示,並以 Microsoft 威脅情報訊號豐富,並讓小組使用整合式安全性最佳做法建議來強化其安全性狀態

使用此 表單 來套用存取權。

顯示 適用於雲端的 Microsoft Defender 的螢幕快照。