Github Actions无法获取模拟凭据:Firestore备份权限问题排查
排查GitHub Action无密钥认证备份Firestore时的403权限错误
错误核心
你遇到的iam.serviceAccounts.getAccessToken权限拒绝,本质是GitHub Actions通过工作负载身份池 impersonate目标服务账号时,没有获取该服务账号访问令牌的权限。以下是具体排查步骤:
1. 确认工作负载身份池的绑定权限
检查工作负载身份池中的GitHub身份提供者对应的IAM绑定:
- 需要给GitHub的身份主体(格式为
principalSet://iam.googleapis.com/projects/[PROJECT_NUMBER]/locations/global/workloadIdentityPools/[POOL_ID]/attribute.repository/[OWNER/REPO])授予roles/iam.workloadIdentityUser权限,作用对象是你的目标服务账号。 - 注意:是把这个权限赋予GitHub的身份主体,不是给服务账号本身添加角色。
2. 验证服务账号的令牌创建权限
- 给上述GitHub身份主体额外授予
roles/iam.serviceAccountTokenCreator权限,作用对象同样是目标服务账号——这个角色才是允许外部身份获取服务账号访问令牌的关键,仅给服务账号本身添加该角色无效。 - 你已配置的
Cloud Datastore Import Export Admin和Storage Admin是备份所需的业务权限,需确保这些角色的作用范围覆盖目标Firestore数据库和存储桶(项目级或资源级均可)。
3. 检查GitHub Action配置细节
- 确认
workload_identity_provider的值是完整的资源路径,正确格式为:projects/[PROJECT_NUMBER]/locations/global/workloadIdentityPools/[POOL_ID]/providers/[PROVIDER_ID],不能仅填写名称。 - 移除
gcloud config set project $PROJECT_ID步骤,可在google-github-actions/auth中通过project_id参数直接指定项目,避免手动配置冲突。 - 添加
gcloud auth list步骤验证认证身份,确认是否成功 impersonate目标服务账号。
优化后的配置示例:
name: Backup Firestore on: workflow_dispatch env: PROJECT_ID: my_project BUCKET: gs://my_bucket jobs: backup: permissions: contents: read id-token: write runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - id: auth name: Authenticate to Google Cloud uses: google-github-actions/auth@v1 with: workload_identity_provider: projects/[PROJECT_NUMBER]/locations/global/workloadIdentityPools/[POOL_ID]/providers/[PROVIDER_ID] service_account: myserviceaccount@myproject.gserviceaccount.com project_id: ${{ env.PROJECT_ID }} - run: gcloud auth list - run: gcloud firestore export ${{ env.BUCKET }}
4. 排查权限边界与组织政策限制
- 检查目标服务账号是否设置了权限边界(Permission Boundary),若有需确保边界包含
iam.serviceAccounts.getAccessToken权限,或调整边界范围。 - 确认组织级IAM政策未禁止外部身份(如GitHub)impersonate服务账号,部分组织会限制此类操作。
内容的提问来源于stack exchange,提问作者Coolkid
相关产品推荐
相关产品推荐

