Azure OpenAI Service的生产部署通常不需要公网可达。模型推理流量、提示词和响应内容都通过HTTPS传输,但端点本身可以限定在虚拟网络内。API Key虽然配置简单,可一旦出现在日志或代码仓库中,攻击者就能直接消耗额度。建议在网络层为资源挂载私有终结点,在身份层切换到Azure AD令牌或托管标识,同时禁用公网访问。下面会先拆解私有终结点与DNS的配置,再说明认证方案怎么选,最后给出端到端验证方法。

一、私有网络终结点与专用DNS配置
私有终结点(Private Endpoint)把Azure OpenAI资源通过虚拟网卡接入指定子网,使资源获得一个来自该子网的私有IP。它和Service Endpoint不同:Service Endpoint只让VNet流量通过Azure骨干网络访问服务,但服务仍保留公网域名;Private Endpoint则直接把PaaS服务映射进VNet,适合对数据面完全私密的要求。对Azure OpenAI,启用私有终结点后,客户端在VNet内访问your-resource.openai.azure.com时会解析到10.x.x.x私有地址,不再经过公共Internet。
配置时先在Azure OpenAI资源的“网络”页选择“禁用公共访问并仅允许专用访问”,再创建私有终结点。终结点需要选择订阅、资源组、虚拟网络和子网,并决定是否自动集成专用DNS区域。推荐的专用DNS区域是privatelink.openai.azure.com。如果区域尚未存在,Azure可以自动创建,也可以通过CLI手动创建。手动创建的优势是能自定义DNS转发和链路,适合已有中心DNS架构的企业。以下命令创建DNS区域并关联到VNet:
az network private-dns zone create \ --resource-group rg-openai \ --name privatelink.openai.azure.com az network private-dns link vnet create \ --resource-group rg-openai \ --zone-name privatelink.openai.azure.com \ --name link-to-hub-vnet \ --virtual-network /subscriptions/your-subscription/resourceGroups/rg-network/providers/Microsoft.Network/virtualNetworks/hub-vnet \ --registration-enabled false
创建私有终结点时,DNS区域组负责把区域与终结点网卡关联。可以使用az network private-endpoint dns-zone-group create或直接通过门户完成。完成后从VNet内的虚拟机执行nslookup your-resource.openai.azure.com,应返回私有IP。需要留意,如果本地网络通过ExpressRoute或VPN接入,还要把专用DNS区域转发到Azure DNS,否则本地客户端解析不到私有地址。
还有一个容易忽略的点:Azure OpenAI资源可能使用privatelink.cognitiveservices.azure.com作为某些认知服务兼容接口的区域。实际部署时建议在资源的“属性”或终结点DNS配置中确认Azure给出的专用DNS区域名称,避免只配置一个区域导致部分接口解析失败。
二、身份认证方案对比与配置
Azure OpenAI Service支持的认证方式主要有两类:静态API Key和Azure AD令牌。API Key适合本地调试和一次性脚本,权限与密钥绑定,无法细粒度区分调用者身份。Azure AD认证则可以把访问控制交给Azure RBAC,比如授予某个用户或托管标识Cognitive Services OpenAI User角色,只允许调用推理而不允许创建部署。
Azure AD认证的流程是:客户端先通过Azure AD获取access token,再把token放到请求头的Authorization: Bearer <token>字段。对于运行在Azure VM、App Service或Functions中的应用,推荐使用托管标识(Managed Identity),代码里不保存任何凭据。下面的Python示例使用DefaultAzureCredential自动识别本地开发身份、托管标识或服务主体:
from openai import AzureOpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
credential = DefaultAzureCredential()
token_provider = get_bearer_token_provider(
credential,
"https://cognitiveservices.azure.com/.default"
)
client = AzureOpenAI(
azure_endpoint="https://your-resource.openai.azure.com/",
api_version="2024-02-15-preview",
azure_ad_token_provider=token_provider
)
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "hello"}]
)
print(response.choices[0].message.content)
如果不想使用Python SDK,也可以先用Azure CLI获取token再手动调用REST API。下面的命令会输出一个可用于HTTPS请求的access token,作用域同样是https://cognitiveservices.azure.com/.default:
az account get-access-token \ --resource https://cognitiveservices.azure.com \ --query accessToken \ --output tsv
需要明确,API Key并不适合完全禁用。在某些自动化场景或外部第三方系统中,Azure AD无法直接使用时,仍可以保留Key,但建议启用密钥轮换和监控。可以用Azure Key Vault存储Key,应用通过托管标识读取,避免明文落盘。
三、端到端验证与安全加固
完成网络和认证配置后,至少要做两个方向的验证。第一,从VNet内部的测试虚拟机发起调用,确认能正常完成推理。第二,从公网环境发起同样的请求,确认在禁用公网访问后返回403或连接超时。这样能证明资源已经不再暴露在公共Internet。
验证DNS解析是定位问题的关键。在VNet内Linux VM上执行nslookup your-resource.openai.azure.com应看到来自子网的私有地址;如果仍解析出公网IP,说明专用DNS区域没有正确链接到VNet,或者DNS服务器没有使用Azure提供的解析器。可以用Azure CLI的run-command快速执行:
az vm run-command invoke \ --resource-group rg-openai \ --vm-name vm-openai-test \ --command-id RunShellScript \ --scripts "nslookup your-resource.openai.azure.com"
身份层也要做最小权限分配。给应用托管标识授予Cognitive Services OpenAI User即可,不要直接给Contributor或Owner。条件访问策略可以进一步限制来源IP、设备状态和登录风险。诊断日志建议发送到Log Analytics,监控CallerIpAddress、ResultType和令牌来源,一旦出现非预期IP或异常调用量就触发告警。
在实际生产环境中,网络与身份不是二选一,而是一组纵深防御。私有终结点解决“谁能触达服务”,Azure AD解决“触达后能做什么”。即使私有终结点配置正确,仍然要假设VNet内某台主机可能被攻陷,因此每个应用使用独立托管标识,并按部署或环境拆分Azure OpenAI资源,避免一个应用的权限扩大到所有模型。
如果团队使用Terraform或Bicep管理基础设施,可以把私有终结点、专用DNS区域和角色分配都写成代码,和Azure OpenAI资源一起部署。这样既能保证环境一致,也能在每次变更时通过CI跑一次验证脚本,避免手工配置漂移。
Azure OpenAI Service私有网络终结点身份认证修改时间:2026-09-19 12:14:28