如何在GitHub Actions中通过OIDC联邦身份登录AzCopy?
在GitHub Actions中通过OIDC登录Azure后完成AzCopy认证的解决方案
问题背景
已通过GitHub Actions的azure/login@v2动作,利用OIDC联邦身份凭证成功登录Azure,对应服务主体可在同一租户的两个订阅中生效。此前使用SAS Token实现AzCopy认证,随着团队规模扩大,需替换为无需密钥轮换、更安全的凭证方案。当前az登录正常,但azcopy login status报错,需解决AzCopy的身份认证问题,满足以下要求:
- 可通过
azcopy login status确认登录状态 - 支持在GitHub Actions中使用OIDC服务主体
- 提供本地基于客户端密钥/证书的验证方案
- 给出从SAS Token向新方案迁移的步骤
解决方案
一、GitHub Actions中OIDC模式下的AzCopy认证
azure/login@v2完成OIDC登录后,会在环境中注入Azure CLI的上下文,但AzCopy需要针对存储服务的专属访问令牌,而非默认的管理令牌。具体步骤:
确保OIDC登录完成
保留现有azure/login@v2步骤,确保服务主体拥有目标存储账户的权限(如Storage Blob Data Contributor)。获取存储服务访问令牌并登录AzCopy
在工作流中添加以下步骤:# 获取存储服务的访问令牌 AZCOPY_TOKEN=$(az account get-access-token --resource https://storage.azure.com/ --query accessToken -o tsv) # 用令牌登录AzCopy azcopy login --aad-token $AZCOPY_TOKEN验证登录状态
azcopy login status
二、本地验证方案
1. 客户端密钥方式
- 确保服务主体已配置并拥有存储账户权限,本地设置环境变量:
export AZURE_CLIENT_ID="<服务主体ID>" export AZURE_TENANT_ID="<租户ID>" export AZURE_CLIENT_SECRET="<客户端密钥>" - 登录Azure CLI并获取存储令牌:
az login --service-principal -u $AZURE_CLIENT_ID -t $AZURE_TENANT_ID -p $AZURE_CLIENT_SECRET AZCOPY_TOKEN=$(az account get-access-token --resource https://storage.azure.com/ --query accessToken -o tsv) - 登录AzCopy并验证:
azcopy login --aad-token $AZCOPY_TOKEN azcopy login status
2. 客户端证书方式
- 服务主体已配置证书认证,本地持有证书文件(.pfx/.pem):
# 用证书登录Azure CLI az login --service-principal -u "<服务主体ID>" -t "<租户ID>" --password "<证书文件路径>" --certificate-password "<证书密码>" # 获取存储令牌并登录AzCopy AZCOPY_TOKEN=$(az account get-access-token --resource https://storage.azure.com/ --query accessToken -o tsv) azcopy login --aad-token $AZCOPY_TOKEN - 验证登录状态:
azcopy login status
三、从SAS Token迁移的步骤
1. 权限配置
- 为服务主体授予所有目标存储账户的必要权限(如
Storage Blob Data Contributor),覆盖两个订阅下的资源 - 回收不再使用的SAS Token,避免权限泄露
2. GitHub Actions工作流修改
移除所有与SAS Token相关的生成/传递步骤,替换为OIDC登录+AzCopy令牌认证流程,示例工作流片段:
jobs: storage-operation: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Azure OIDC Login uses: azure/login@v2 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} # 若需指定默认订阅,添加此行;否则服务主体有权限的订阅均可用 # subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - name: Install AzCopy run: | wget https://aka.ms/downloadazcopy-v10-linux tar -xvf downloadazcopy-v10-linux sudo cp ./azcopy_linux_amd64_*/azcopy /usr/bin/ - name: Authenticate AzCopy run: | AZCOPY_TOKEN=$(az account get-access-token --resource https://storage.azure.com/ --query accessToken -o tsv) azcopy login --aad-token $AZCOPY_TOKEN - name: Verify Login Status run: azcopy login status - name: Example AzCopy Transfer run: azcopy copy "./src/*" "https://<storage-account>.blob.core.windows.net/<target-container>" --recursive
3. 本地开发环境迁移
- 按照本地验证方案配置服务主体认证
- 替换所有使用SAS Token的AzCopy命令,改为令牌认证模式,确保本地操作与CI流程一致
关键注意事项
- AzCopy所需令牌必须针对
https://storage.azure.com/资源,不可使用Azure管理资源的默认令牌 - 服务主体权限需覆盖所有需要操作的存储账户(两个订阅),否则会出现权限不足错误
- GitHub Actions中,
azure/login@v2会自动管理会话令牌,无需手动处理过期问题
内容的提问来源于stack exchange,提问作者jkix
相关产品推荐
相关产品推荐

