GCP容器访问Secret Manager时403 insufficient authentication scopes错误如何处理
403错误产生原因
- 核心原因是Kubernetes Job运行的容器获取到的身份凭证的OAuth 2.0作用域(scope)不足,而非服务账号的IAM角色权限不足:GCP对云API的访问有两层权限校验,第一层是OAuth scope限制,第二层是IAM角色权限,哪怕服务账号被授予Owner角色,如果scope没有开放Secret Manager的访问权限,依然会被拦截返回403。
- 触发场景大概率是以下两种情况之一:
- 你没有启用Workload Identity,Kubernetes Pod默认继承所在GKE节点的服务账号权限,而节点池创建时配置的默认scope不包含Secret Manager的访问权限。
- 你启用了Workload Identity,但创建Kubernetes Job时没有指定绑定了GCP权限的K8S服务账号,Job默认使用命名空间下的default服务账号,该账号没有关联有权限的GCP身份。
解决方案
推荐方案:配置Workload Identity(生产级安全方案)
- 确认你的GKE集群已经开启Workload Identity功能
- 新建专门的GCP服务账号,为其授予最小必要权限
roles/secretmanager.secretAccessor(无需授予Owner角色,符合最小权限原则) - 绑定GCP服务账号和K8S命名空间下的服务账号:
执行命令:gcloud iam service-accounts add-iam-policy-binding <GCP服务账号名>@<项目ID>.iam.gserviceaccount.com --role roles/iam.workloadIdentityUser --member "serviceAccount:<项目ID>.svc.id.goog[<K8S命名空间>/<K8S服务账号名>]" - 为K8S服务账号添加注解:
apiVersion: v1 kind: ServiceAccount metadata: name: <K8S服务账号名> namespace: <K8S命名空间> annotations: iam.gke.io/gcp-service-account: <GCP服务账号名>@<项目ID>.iam.gserviceaccount.com - 在Cloud Function创建Kubernetes Job的配置中,指定Pod使用上述绑定完成的K8S服务账号:
在Job的spec.template.spec字段下添加serviceAccountName: <K8S服务账号名>
快速测试方案:调整节点池OAuth scope
如果是测试场景不想配置Workload Identity,可以直接修改GKE节点池的scope,需要重建节点池生效:
创建节点池时添加参数:--scopes=https://www.googleapis.com/auth/cloud-platform
该scope开放所有GCP云API的访问权限,配合节点服务账号的Owner权限即可正常访问Secret Manager。
临时验证方案:挂载服务账号密钥(不推荐用于生产)
可以将有权限的GCP服务账号的JSON密钥文件通过K8S Secret挂载到容器内,然后在容器中设置环境变量GOOGLE_APPLICATION_CREDENTIALS=<密钥文件挂载路径>,即可直接使用该服务账号的身份访问Secret Manager。
额外提示
你的Dockerfile中RUN pip install -r requirements.txt & pip install -r a_repo/requirements.txt里的&应该改为&&,否则第一条命令执行失败也会继续执行第二条,会带来依赖安装异常的隐患。
内容的提问来源于stack exchange,提问作者dotslash227
相关产品推荐
相关产品推荐

