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

使用Workload Identity Pool推送Docker镜像到GCP遇权限问题求助

问题

我正在搭建一个通过GitHub Actions部署到Cloud Run的服务。认证步骤执行成功:

- name: Authenticate to Google Cloud
  id: auth
  uses: google-github-actions/auth@v2
  with:
    workload_identity_provider: "projects/<my-project>/locations/global/workloadIdentityPools/<workload-identity-pool-name>/providers/<provider-id>"
    service_account: "<service-account-email>"

但构建Docker镜像后尝试推送到GCR时:

- name: Push Docker images
  run: |
   docker push gcr.io/${{ env.PROJECT_ID }}/<project-name>:${{ github.sha }}

出现如下错误:

There was a problem refreshing your current auth tokens: ('Unable to acquire impersonated credentials', '{
  "error": {
    "code": 403,
    "message": "Permission 'iam.serviceAccounts.getAccessToken' denied on resource (or it may not exist).",
    "status": "PERMISSION_DENIED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.ErrorInfo",
        "reason": "IAM_PERMISSION_DENIED",
        "domain": "iam.googleapis.com",
        "metadata": {
          "permission": "iam.serviceAccounts.getAccessToken"
        }
      }
    ]
  }
}
')

我已在GCP控制台完成以下配置:

  • 使用GitHub标准发行方的Provider,选择默认受众,映射audience、actor和subject属性
  • 包含该Provider的Workload Identity Pool
  • 拥有所需权限(通过Workload Identity User获得iam.serviceAccounts.getAccessToken)的服务账号
  • 针对GitHub Action所在仓库配置principalSet条目的Principal

我检查过组织权限限制但未发现问题,也尝试在流水线中调试认证后的权限但无果,请问我还遗漏了什么?

排查方向与解决方案

  1. 确认服务账号的Workload Identity User绑定准确性
    检查GCP IAM中目标服务账号的权限绑定,确保GitHub身份池的principalSet格式完全正确。比如针对仓库username/repo的绑定格式应为:
    principalSet://iam.googleapis.com/projects/<project-id>/locations/global/workloadIdentityPools/<pool-name>/attribute.repository/username/repo
    避免项目ID、池名称、仓库路径的拼写错误。

  2. 让Docker继承GitHub Actions的认证上下文
    google-github-actions/auth仅配置了gcloud的认证,原生docker命令不会自动复用该凭证。推荐使用官方的google-github-actions/docker-build-push Action,它会自动关联auth步骤的凭证,无需手动处理登录:

    - name: Build and push Docker image
      uses: google-github-actions/docker-build-push@v2
      with:
        context: .
        push: true
        tags: gcr.io/${{ env.PROJECT_ID }}/<project-name>:${{ github.sha }}
    
  3. 验证服务账号的 impersonation 权限绑定
    通过GCP CLI确认目标服务账号已正确授予GitHub身份池角色:

    gcloud iam service-accounts get-iam-policy <service-account-email> --project=<project-id>
    

    检查输出中是否包含对应的principalSet和roles/iam.workloadIdentityUser绑定,该角色是获取iam.serviceAccounts.getAccessToken权限的核心。

  4. 核对Workload Identity Provider的属性映射
    确保Provider的属性映射与你配置的principalSet匹配。比如如果principalSet使用了repository属性,必须在Provider中添加attribute.repository=assertion.repository的映射规则,否则身份无法匹配,导致权限验证失败。

  5. 强制生成可直接用于Docker的访问令牌
    在auth步骤添加token_format: access_token参数,避免凭证刷新时的权限问题,然后手动配置Docker登录:

    - name: Authenticate to Google Cloud
      id: auth
      uses: google-github-actions/auth@v2
      with:
        workload_identity_provider: "projects/<my-project>/locations/global/workloadIdentityPools/<workload-identity-pool-name>/providers/<provider-id>"
        service_account: "<service-account-email>"
        token_format: access_token
    
    - name: Push Docker images
      run: |
        echo "${{ steps.auth.outputs.access_token }}" | docker login -u oauth2accesstoken --password-stdin https://gcr.io
        docker push gcr.io/${{ env.PROJECT_ID }}/<project-name>:${{ github.sha }}
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:04:50