如何配置存储账户防火墙仅允许ARM服务访问,以支持镜像模板通过SAS下载Blob?
如何配置存储账户防火墙仅允许ARM服务访问,以支持镜像模板通过SAS下载Blob?
咱来给你梳理几个实际项目里验证过的可行方案,比手动加几千个CIDR靠谱多了:
1. 优先用「服务标记(Service Tags)」简化防火墙规则
你提到的AzureCloud服务标记确实包含大量CIDR,但完全不用手动一个个添加——Azure早就预定义了这些服务标记,直接在存储账户的网络规则里引用就行,Azure会自动维护这些IP范围的更新。
如果你的镜像模板只在特定区域运行,还可以用区域级服务标记(比如AzureCloud.eastus),进一步缩小允许的IP范围,比全局的AzureCloud更安全。
操作方式:
- 控制台操作:在存储账户的「防火墙和虚拟网络」设置里,选择「添加网络规则」,然后在「服务标记」下拉框里选
AzureCloud(或对应区域的标记),给它分配「读取」权限即可。 - Bicep模板配置示例:
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = { name: 'yourstorageaccount' location: 'eastus' sku: { name: 'Standard_LRS' } kind: 'StorageV2' properties: { networkAcls: { defaultAction: 'Deny' serviceRules: [ { service: 'AzureCloud.eastus' // 用区域级标记更严格 action: 'Allow' } ] } } }
2. 换用「托管标识(Managed Identity)」替代SAS,彻底摆脱IP限制(推荐)
这是更安全也更省心的方案——毕竟SAS链接有泄露风险,用托管身份的话,存储账户防火墙甚至不用配置IP规则,靠RBAC权限就能实现访问控制。
大致步骤:
- 给你的
ImageTemplate资源分配一个系统分配或用户分配的托管标识(在Bicep里可以直接配置)。 - 在存储账户的目标Blob容器上,给这个托管标识分配
Storage Blob Data Reader的角色权限。 - 修改ImageTemplate里的PowerShell自定义器:不用
Invoke-WebRequest加SAS链接,换成用托管身份认证的方式下载Blob,比如用Get-AzStorageBlobContent(需要提前安装Az.Storage模块)或者Azure CLI命令az storage blob download。 - 存储账户防火墙设置为「默认拒绝所有IP」,然后在「例外」里勾选「允许受信任的Azure服务访问此存储账户」(或者直接靠RBAC权限,托管身份访问不受IP防火墙限制)。
3. 临时动态添加IP规则(备选,不推荐)
如果你坚持要用SAS且不想用服务标记,那可以在DevOps管道里做动态操作:
- 先用Azure CLI查询当前区域Image Builder的IP范围:
az network list-service-tags --location eastus --query "values[?name=='MicrosoftImageBuilder'].properties.addressPrefixes" -o tsv - 把这些IP范围批量添加到存储账户的网络规则里,等镜像模板部署完成后,再删除这些临时规则。
不过这个方式比较折腾,而且Image Builder的IP范围可能会随时更新,维护成本高,不如前两个方案稳定。
总结一下:最快解决问题用服务标记,追求长期安全和省心就换托管身份+RBAC,手动加几千个CIDR真的是下下策。
备注:内容来源于stack exchange,提问作者yamh
相关产品推荐
相关产品推荐

