You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用托管身份时,如何为Azure存储账户启用基于角色的访问?

解决Azure存储账户基于角色访问控制(RBAC)结合托管身份的权限配置问题

先明确你遇到的两个场景的核心原因

  1. 开启公共访问时无需角色即可访问:

    • 若存储账户未限制网络访问且容器开启了匿名访问(比如设置为"Blob"或"容器"级公共访问),任何人都能直接访问存储资源,RBAC权限会被绕过。
    • 另一种可能是你的应用代码默认使用了存储账户密钥/SAS令牌,而非托管身份认证,导致即使没分配RBAC角色也能访问。
  2. 禁用公共访问后出现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等优先级更高的认证参数
  • 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 08:08:22