如何解决使用Workload Identity时未授权用户充当服务帐户
我们正在GKE上运行一个名为Airflow(https://airflow.apache.org/)的开源产品。在该Pod中运行的进程需要与GCP的Dataproc服务进行交互才能创建Dataproc集群。 我们正在使用Workload Identity运行我们的GKE应用程序。
已在Google服务帐户(GSA)资源roles/iam.workloadIdentityUser
上为static11-dp-airf@mygcpproject.iam.gserviceaccount.com
授予Kubernetes服务帐户(KSA):
$ gcloud iam service-accounts get-iam-policy \
> static11-dp-airf@mygcpproject.iam.gserviceaccount.com \
> --format=json \
> --format="table(bindings.role,bindings.members)" \
> --flatten="bindings[].members"
ROLE MEMBERS
roles/iam.workloadIdentityUser serviceAccount:mygcpproject.svc.id.goog[static11-dsp-dp-airflow/dp-airflow]
我们已为GSA授予了一个自定义角色,称为dsp_service_account_dataproc_v1
:
$ gcloud projects get-iam-policy mygcpproject --format=json | grep dsp_service_account_dataproc_v1 -B 8 -A 1
{
"members": [
"serviceAccount:static11-dp-airf@mygcpproject.iam.gserviceaccount.com"
],"role": "projects/mygcpproject/roles/dsp_service_account_dataproc_v1"
},
该自定义角色具有调用dataproc API所需的所有权限:
$ gcloud iam roles describe dsp_service_account_dataproc_v1 --project mygcpproject
etag: BwWuudZzoGI=
includedPermissions:
- dataproc.agents.create
- dataproc.agents.delete
- dataproc.agents.get
- dataproc.agents.list
- dataproc.agents.update
- dataproc.clusters.create
- dataproc.clusters.delete
- dataproc.clusters.get
- dataproc.clusters.list
- dataproc.clusters.update
- dataproc.clusters.use
- dataproc.jobs.cancel
- dataproc.jobs.create
- dataproc.jobs.delete
- dataproc.jobs.get
- dataproc.jobs.list
- dataproc.jobs.update
- dataproc.operations.delete
- dataproc.operations.get
- dataproc.operations.list
- dataproc.tasks.lease
- dataproc.tasks.listInvalidatedLeases
- dataproc.tasks.reportStatus
但是,当我尝试通过从Airflow调用dataproc API来创建dataproc集群时,它失败,并显示以下信息:
https://dataproc.googleapis.com/v1beta2/projects/mygcpproject/regions/europe-west1/clusters?alt=json时返回“用户无权充当服务帐户'static11-dp-airf@mygcpproject.iam.gserviceaccount.com”。要充当服务帐户,用户必须拥有一个[所有者,编辑,服务帐户执行者]角色的角色。有关其他详细信息,请参见https://cloud.google.com/iam/docs/understanding-service-accounts。“>
我假设我在某处缺少某些内容,可能需要授予一些其他角色,但我不知道在哪里。任何建议将不胜感激。
解决方法
在这种情况下,您的安装程序的工作负载标识侧很好,但是您似乎还试图使Dataproc集群本身作为调用方服务帐户本身运行(等效于在调用{{1}呼叫者本身也是gcloud dataproc clusters create --service-account static11-dp-airf@mygcpproject.iam.gserviceaccount.com
)。
该错误消息实际上也可能有些过时,因为它应该指向Service Account User而不是Service Account Actor,尽管从技术上讲后者也可以。
通常,调用Dataproc API的身份必须在项目级别或直接在将绑定到Dataproc集群的VM的服务帐户上具有static11-dp-airf@mygcpproject.iam.gserviceaccount.com
角色,即使该服务-要绑定的帐户与呼叫者的身份相同。对于没有dataproc的普通GCE VM也是如此,例如,如果您Service Account User
也会因相同的权限错误而失败。
因此,基本上,您只需要在“自身”上授予该服务帐户gcloud compute instances create --impersonate-service-account static11-dp-airf@mygcpproject.iam.gserviceaccount.com --service-account static11-dp-airf@mygcpproject.iam.gserviceaccount.com my-instance
。
如https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/service-accounts所述,除了Service Account User
角色之外,还需要这个Service Account User
角色。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。