使用托管身份时,如何为Azure存储账户启用基于角色的访问?
解决Azure存储账户基于角色访问控制(RBAC)结合托管身份的权限配置问题
先明确你遇到的两个场景的核心原因
开启公共访问时无需角色即可访问:
- 若存储账户未限制网络访问且容器开启了匿名访问(比如设置为"Blob"或"容器"级公共访问),任何人都能直接访问存储资源,RBAC权限会被绕过。
- 另一种可能是你的应用代码默认使用了存储账户密钥/SAS令牌,而非托管身份认证,导致即使没分配RBAC角色也能访问。
禁用公共访问后出现403错误:
- 禁用公共访问后,存储账户防火墙会拦截所有未被允许的网络请求,若VM所在的虚拟网络未加入存储账户的允许列表,即使有RBAC角色,请求也会先被网络层面拦截。
- 若未勾选"允许受信任的Microsoft服务访问此存储账户",托管身份的请求可能被防火墙拒绝。
正确配置步骤
1. 锁定存储账户的网络访问规则
- 进入存储账户的网络设置,选择"允许从选定的网络访问"
- 在"虚拟网络"模块,添加VM所在的虚拟网络和子网,确保VM的网络流量能被存储账户允许
- 勾选允许受信任的Microsoft服务访问此存储账户(托管身份属于受信任服务,避免请求被防火墙拦截)
2. 为VM托管身份分配最小权限的RBAC角色
- 进入存储账户的**访问控制(IAM)**页面,点击"添加角色分配"
- 选择对应的数据访问角色(不要用资源管理角色如"所有者""参与者",这类角色不控制数据访问):
- 仅需读取:
存储 Blob 数据读取者 - 需要读写:
存储 Blob 数据参与者
- 仅需读取:
- 在"成员"中选择"托管身份",然后选中你的VM的系统/用户分配托管身份
- 完成分配后等待5-10分钟,让RBAC权限生效(权限不会实时同步)
3. 验证应用的认证逻辑
- 确保应用仅使用托管身份认证,避免 fallback 到存储账户密钥:
- .NET应用:使用
DefaultAzureCredential时,检查环境变量或配置文件中是否存在存储账户密钥,如有则删除,强制依赖托管身份 - Python应用:使用
azure-identity库的DefaultAzureCredential,确保未配置AZURE_STORAGE_CONNECTION_STRING等优先级更高的认证参数
- .NET应用:使用
- 在VM上执行命令验证托管身份可用性:
拿到令牌后,测试访问存储资源:# 获取存储账户的访问令牌 curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://storage.azure.com/' -H Metadata:true# 替换为你的存储账户名和容器名 curl -H "Authorization: Bearer <上述命令获取的令牌>" https://<存储账户名>.blob.core.windows.net/<容器名>?restype=container&comp=list
针对你的场景的修复点
- 对于场景1:检查容器的访问级别,改为"专用(无匿名访问)";排查应用代码,移除存储账户密钥相关配置。
- 对于场景2:确认VM的VNet已加入存储账户允许列表,勾选受信任服务访问选项;确认RBAC角色已正确分配给VM托管身份并等待生效。
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

