为 Azure OpenAI 使用托管标识的好处

已完成

使用托管标识时,需要在 JavaScript 应用程序中创建 DefaultAzureCredentialManagedIdentityCredential 类的实例时指定用户托管标识的客户端 ID。 设置托管标识时,客户端 ID 值将被设置为环境变量,标识符为 $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);

让我们评估泄露的客户端 ID 与泄露的 API 密钥的影响。

API 密钥的功能类似于常规密码。 如果遭到入侵,则具有密钥的任何人都可以访问资源。 对于 Azure OpenAI,这意味着不受限制地使用 GPT-4 等 AI 模型。 如果网络可公开访问,则安全影响可能更大。

相反,如果客户端 ID 泄露,风险最小。 这是因为仅客户端 ID 无法与 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"

这将配置可以使用此用户 ID 执行的操作(在本模块后面会详细说明)。 为 Azure OpenAI 服务分配了认知服务 OpenAI 用户角色,限制了对 Azure OpenAI 中操作的权限。

总之,与泄露的 API 密钥的影响相比,利用泄露的客户端 ID 涉及几个步骤,从而使恶意参与者更难利用。 出于这些原因,与 API 密钥相比,托管身份提供了一种更安全的管理操作的方法。 强烈建议您在对 Azure OpenAI 或其他支持托管标识的 Azure 服务进行身份验证时,优先使用托管标识而非 API 密钥。