生产环境Azure OpenAI认证:clientId等凭证获取及管理咨询
如何获取并安全管理Azure OpenAI生产环境的ClientSecretCredential凭证?
问题描述
我正在开发一款使用Azure OpenAI的应用,本地通过运行az login后使用DefaultAzureCredential可成功认证,但该方法无法用于生产环境。我了解生产环境更适合使用@azure/identity中的ClientSecretCredential,但不清楚如何获取所需的clientId、tenantId和clientSecret。
本地使用DefaultAzureCredential的代码如下:
import { AzureOpenAI } from 'openai'; import { DefaultAzureCredential } from '@azure/identity'; const credential = new DefaultAzureCredential(); const deployment = 'gpt-4o'; const apiVersion = '2024-02-15-preview'; const openai = new AzureOpenAI({ azureADTokenProvider: getBearerTokenProvider( credential, 'https://cognitiveservices.azure.com/.default' ), deployment, apiVersion, });
具体问题
- 在哪里获取
ClientSecretCredential所需的clientId、tenantId和clientSecret? - 生产环境中安全存储和管理这些凭证有哪些最佳实践?
环境
- Node.js v14.17.0
- TypeScript v4.4.2
- Azure OpenAI SDK(最新版本)
- @azure/identity(最新版本)
已尝试
- 查阅Azure文档,但未找到针对Azure OpenAI的凭证获取明确说明
- 了解服务主体概念,但不确定如何针对此场景正确配置
回答
1. 获取clientId、tenantId和clientSecret的步骤
你需要在Azure门户中创建一个服务主体(Azure AD应用注册),并为其分配Azure OpenAI的访问权限,具体步骤如下:
- 登录Azure门户,搜索并进入「Azure Active Directory」服务
- 创建应用注册:左侧菜单选择「应用注册」,点击「新注册」,填写应用名称,选择账户类型(推荐选「仅限此组织目录中的账户」),完成注册后进入应用详情页
- 获取tenantId:在应用详情页的「概述」标签中,找到「目录(租户) ID」,这就是所需的
tenantId - 获取clientId:同样在「概述」标签中,「应用程序(客户端) ID」即为
clientId - 生成clientSecret:左侧菜单选择「证书和密码」,点击「新客户端密码」,设置描述和过期时间后点击「添加」,生成的密码值就是
clientSecret(注意:该值只会显示一次,务必立即保存) - 分配权限:找到你的Azure OpenAI资源,进入「访问控制(IAM)」,点击「添加角色分配」,选择「认知服务用户」(或满足需求的最小权限角色),然后选择刚才创建的服务主体完成分配
2. 生产环境凭证安全管理最佳实践
- 禁止硬编码凭证:绝对不要将
clientId、clientSecret等硬编码到代码、配置文件中,也不要提交到Git等版本控制系统 - 使用Azure Key Vault存储:将凭证存储到Azure Key Vault中,应用通过托管身份访问Key Vault获取凭证(此时可直接使用
DefaultAzureCredential,无需显式管理凭证,是生产环境最安全的方式) - 环境变量临时存储:如果使用虚拟机、容器部署,可将凭证设置为环境变量,通过
process.env读取,但需确保环境变量的访问权限被严格控制 - 遵循最小权限原则:只为服务主体分配访问Azure OpenAI所需的最低权限,避免赋予不必要的角色
- 定期轮换凭证:设置
clientSecret的合理过期时间,定期生成新的密码并替换旧凭证 - 监控访问日志:开启Azure AD和Azure OpenAI资源的访问日志,监控服务主体的访问行为,及时发现异常操作
生产环境代码示例(使用ClientSecretCredential)
import { AzureOpenAI } from 'openai'; import { ClientSecretCredential } from '@azure/identity'; // 从安全存储(如Key Vault或环境变量)读取凭证 const tenantId = process.env.AZURE_TENANT_ID; const clientId = process.env.AZURE_CLIENT_ID; const clientSecret = process.env.AZURE_CLIENT_SECRET; const credential = new ClientSecretCredential(tenantId, clientId, clientSecret); const deployment = 'gpt-4o'; const apiVersion = '2024-02-15-preview'; const openai = new AzureOpenAI({ azureADTokenProvider: getBearerTokenProvider( credential, 'https://cognitiveservices.azure.com/.default' ), deployment, apiVersion, });
内容的提问来源于stack exchange,提问作者Gonzalo A .A
相关产品推荐
相关产品推荐

