验证您的Azure OpenAI基于应用程序使用Microsoft Entra ID
如果您正在使用Azure OpenAI,则必须意识到验证我们的应用程序最常见且最简单的方法是使用应用键。
基于密钥的身份验证方法非常流行,因为它非常直观。让我们快速看一下下面的代码片段:
from openai import AzureOpenAI
client = AzureOpenAI(
api_key= ‘KEY’,
api_version=”VERSION",
azure_endpoint = ‘ENDPOINT’ )
response = client.completions.create(model=’MODEL’, prompt=’PROMPT’, max_tokens=80)
print(response.choices[0].text)
上面的代码段使用api-key、api-version和endpoint构造AzureOpenAI客户端对象。然后,该对象使用所需的参数调用完成端点。
当然,应用密钥非常适用于实验目的,并不太适合即将投入生产的企业级应用程序。
那么,为什么我们在生产中永远不应该使用密钥来验证 Azure OpenAI?
不使用基于密钥的身份验证的主要原因
在生产环境中,通常不建议使用密钥进行Azure OpenAI身份验证,而此背后有几个关键原因。以下是这些原因:
曝光量
密钥可能会被开发人员无意中提交到源代码控制中,或存储在某些不安全的位置。如果密钥泄露,未经授权的个人可以轻易获取对Azure环境的访问权限。
细粒权限
密钥对于本地开发和测试非常有效,但不适用于生产环境,因为它们不遵循最小权限原则。它们给予对使用者过多的访问权限,可能导致滥用。
可分享
很容易与不论好坏意图的人分享钥匙,无论是有意还是无意,这可能导致安全风险。
旋转很困难
由于密钥无法自动旋转,我们需要手动干预进行旋转,这可能会耗费太多时间和繁琐,特别是在生产部署中。只要有一个实例受到影响,所有用于生成令牌的实例都需要更新。
這裡是更詳細解釋的視頻教程:
避免使用基于密钥的认证的提示
一个应该避免使用密钥进行身份验证,而是使用托管标识来管理 Azure 资源。托管标识有多个好处:
卓越的安全
托管身份提供了显著的安全性改进,通过提供由Azure生成的令牌。这最终意味着,我们不再需要直接处理凭据。
细粒度访问控制
使用托管身份,分配特定角色和权限变得简单直接。这确保每个身份只有它需要的访问权限,遵循最小权限原则。强调授予所需权限的最低限度。
不需要旋转
由于托管身份特性为我们处理凭证管理,我们不需要存储或手动轮换凭据,可以最大程度地减少凭据泄露的风险。
使用微软 Entra 实现无需密钥的身份验证
让我们首先更新我们的源代码。以下是代码更改:
from openai import AzureOpenAI
from azure.identity import DefaultAzureCredential,get_bearer_token_provider
cred = DefaultAzureCredential()
token_provider = get_bearer_token_provider(cred,”https://cognitiveservices.azure.com/.default")
client = AzureOpenAI(
azure_ad_token_provider = token_provider,
api_version=”VERSION",
azure_endpoint = ‘ENDPOINT_GOES_HERE’ )
response = client.completions.create(model=’MODEL’, prompt=’PROMPT’, max_tokens=80)
print(response.choices[0].text)
现在,如果您只是执行这段代码,它是不会工作的。这里是您可以预期到的错误:
错误明确表示,认证部分有问题,这是由于以下两个原因造成的:
- 没有设置默认凭据
- 不授予给执行应用程序的用户任何权限。
在这里,我们有多种方法来排序我们的默认凭据问题。这是DefaultAzureCredential类的完整文档,它位于Azure.Identity命名空间中。
你可以选择任何一种方式来解决这个问题。我使用了 CLI 方式,在 PowerShell 终端中执行了以下命令:
az login
Connect-AzAccount
如果您无法执行上述命令,请确保已安装所需的PS模块。使用以下命令安装Az PowerShell模块
Install-Module -Name Az -Repository PSGallery -Force
一旦您连接成功,您将会在终端上看到您可用的订阅列表。
下一步是确保运行代码的人具有访问OpenAI服务的权限。这可以通过Azure CLI或使用Azure门户来完成。
使用Azure CLI(确保设置所需的环境变量)
az role assignment create \
— role “876pyt-XXXX-XXXX-XXXX-XXXX” \
— assignee-object-id “$PRINCIPAL_ID” \
— scope /subscriptions/”$SUBSCRIPTION_ID”/resourceGroups/”$RESOURCE_GROUP” \
— assignee-principal-type User
使用Azure 门户
这里是使用Azure门户分配权限的步骤:
- 打开OpenAI资源
- 从左侧导航中选择“访问控制(IAM)”
- 在顶部菜单中选择“+添加”
- 在搜索栏中键入“认知服务OpenAI用户”,然后在结果中选择它。
- 选择“分配访问权限给:用户,群组或服务主体”
- 搜索您的电子邮件地址:
- 选择“审阅和分配”
现在,如果您运行您的应用程序,您会收到响应。请查看我的完整视频,了解它的运作方式:
希望您喜欢告别基于密钥的身份验证。