針對 Azure OpenAI 使用受控識別的優點

已完成

使用受控識別時,您必須在 JavaScript 應用程式中建立 DefaultAzureCredentialManagedIdentityCredential 類別的實例時,指定使用者受控識別的用戶端識別碼。 設定受控識別時,用戶端標識符值會建立為環境變數 $AZURE_CLIENT_ID

乍一看,除了端點 URL 之外,這似乎是連線所需的唯一重要資訊片段。

import { DefaultAzureCredential, getBearerTokenProvider } from "@azure/identity";
import { AzureOpenAI } from "openai";

// set environment variable AZURE_CLIENT_ID
const credential = new DefaultAzureCredential();
const scope = "https://cognitiveservices.azure.com/.default";
const azureADTokenProvider = getBearerTokenProvider(credential, scope);

const endpoint = process.env["AZURE_OPENAI_ENDPOINT"] || "<endpoint>";
const deployment = "<your Azure OpenAI deployment name>";
const apiVersion = "2024-05-01-preview";
const options = { azureADTokenProvider, deployment, apiVersion, endpoint }

const client = new AzureOpenAI(options);

讓我們評估外泄用戶端標識碼與外泄 API 金鑰的影響。

API 金鑰功能類似於一般密碼。 如果遭到入侵,則具有密鑰的任何人都可以存取資源。 對於 Azure OpenAI,這表示不受限制地使用 GPT-4 等 AI 模型。 如果可公開存取網路,安全性影響可能更大。

相反地,如果用戶端標識符外泄,風險會降到最低。 這是因為用戶端標識碼單獨無法建立與 Azure OpenAI 的連線。 若要利用受控識別,服務必須在 Azure 上運作,即使 Azure OpenAI 是公用的,您也無法從本機環境或使用應用程式透過網路連線。

此外,下列角色指派已針對受控識別進行設定:

az role assignment create --assignee $USER_MANAGED_ID_PRINCIPAL_ID \
--scope $OPEN_AI_RESOURCE_ID \
--role "Cognitive Services OpenAI User"

這會設定可以使用此使用者標識碼來執行動作(稍後在課程模組中對此進行更多說明)。 在這裡,認知服務 OpenAI 使用者角色會指派給 Azure OpenAI 服務,限制 Azure OpenAI 內作業的許可權。

總而言之,相較於外洩 API 金鑰的後果,利用洩露的用戶端 ID 需要經過多個步驟,使得惡意行為者更難加以利用。 基於這些原因,受控識別提供更安全的方法來管理與 API 金鑰相比的作業。 強烈建議您在驗證 Azure OpenAI 或任何其他支援受控識別的 Azure 服務時,應優先使用受控識別,而不是 API 密鑰。