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

如何将指定IP加入白名单访问Azure Blob存储并解决授权失败问题

解决Azure Blob存储SAS上传403 AuthorizationFailure错误

问题分析

你在Azure DevOps管道中使用SAS令牌上传文件到Blob存储时遇到403错误,但相同步骤在CloudShell中能成功,核心原因大概率是管道代理的网络IP不匹配,或SAS/网络规则配置存在细节问题。

排查与解决方案

1. 验证管道代理的实际出口IP

DevOps代理(尤其是托管代理)可能通过NAT或企业代理上网,curl ifconfig.me获取的IP未必是实际请求Blob存储的出口IP:

  • 在管道中添加调试步骤,输出更多IP相关信息:
    echo "获取的IP: $machine_ip"
    # 用临时只读SAS验证实际访问Blob的出口IP
    curl -s -w "%{remote_ip}\n" https://blobmarch24.blob.core.windows.net/blobstorage?sv=2022-11-02&ss=b&srt=sco&sp=r&se=2099-01-01T00:00:00Z&st=2024-03-06T00:00:00Z&spr=https&sig=xxx
    
  • 如果是自托管代理:确认代理服务器的固定公网出口IP,直接使用该IP配置网络规则和SAS令牌,而非动态获取的IP。
  • 如果是Azure托管代理:托管代理的IP属于Azure数据中心动态范围,可采取两种方案:
    • 下载对应区域的Azure IP范围列表,将该区域的IP段添加到存储账户的网络规则中。
    • 在存储账户的网络设置中勾选「允许受信任的Microsoft服务访问此存储账户」(注意:此选项会放宽安全限制,需评估风险)。

2. 调整网络规则与SAS的配置顺序和延迟

Azure存储账户的网络规则生效存在延迟,管道执行过快可能导致请求时IP未被允许:

  • 修改管道命令顺序,先添加网络规则,再生成SAS令牌,并增加等待时间:
    # 获取机器IP
    machine_ip=$(curl ifconfig.me)
    # 将IP添加到Blob存储允许列表
    az storage account network-rule add -g pipelineTest --account-name blobmarch24 --ip-address $machine_ip
    # 等待网络规则生效(建议30-60秒)
    sleep 60
    # 生成过期时间(UTC格式)
    expiry_time=$(date -u -d '+30 minutes' +%Y-%m-%dT%H:%MZ)
    # 创建SAS令牌,强制HTTPS访问
    sas_token=$(az storage container generate-sas --account-name <blobname> --name <containername> --permissions dlwr --expiry $expiry_time --ip $machine_ip --https-only --output tsv )
    

3. 检查SAS令牌的参数正确性

  • 确认--account-name、--name(容器名)与AzCopy目标URL中的账户、容器完全一致(你的AzCopy目标容器是blobstorage,生成SAS时的容器名必须匹配)。
  • 验证expiry_time格式:必须是UTC时间,可在管道中输出echo $expiry_time确认格式为YYYY-MM-DDTHH:MMZ。
  • 确保SAS权限包含w(写入),你当前的dlwr权限足够,但添加--https-only可强制HTTPS访问,避免协议问题。

4. 验证服务主体权限

生成SAS令牌的命令需要服务主体具备存储账户的相关权限,可通过以下命令确认:

az role assignment list --assignee <clientID> --scope /subscriptions/<subscriptionID>/resourceGroups/pipelineTest/providers/Microsoft.Storage/storageAccounts/blobmarch24

确保输出中包含Storage Blob Data Owner或Storage Account Contributor角色。

5. 修正AzCopy命令格式

明确指定Blob名称,避免歧义:

azcopy cp $(Build.BuildId).zip "https://blobmarch24.blob.core.windows.net/blobstorage/$(Build.BuildId).zip?$sas_token"

内容的提问来源于stack exchange,提问作者DEEPAK YADAV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:08:10