使用 Workload Identity 时,用户无权充当服务帐户

User not authorized to act as service account when using Workload Identity

我们运行在 GKE 上安装了一个名为 Airflow (https://airflow.apache.org/) 的开源产品。该 pod 中有进程 运行ning 需要与 GCP 的 Dataproc 服务交互才能创建 Dataproc 集群。 我们正在使用 Workload Identity 到 运行 我们的 GKE 应用程序。

Kubernetes 服务帐户 (KSA) 已被授予 roles/iam.workloadIdentityUser Google 服务帐户 (GSA) 资源 static11-dp-airf@mygcpproject.iam.gserviceaccount.com:

$ 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 集群时,它失败了:

<HttpError 400 when requesting https://dataproc.googleapis.com/v1beta2/projects/mygcpproject/regions/europe-west1/clusters?alt=json returned "User not authorized to act as service account 'static11-dp-airf@mygcpproject.iam.gserviceaccount.com'. To act as a service account, user must have one of [Owner, Editor, Service Account Actor] roles. See https://cloud.google.com/iam/docs/understanding-service-accounts for additional details.">

我想我在某处遗漏了一些东西,可能是一些需要授予但我不知道在哪里的额外角色。任何建议将不胜感激。

在这种情况下,您的设置的 Workload Identity 方面似乎没问题,但您似乎也在尝试将 Dataproc 集群本身 运行 作为调用方服务帐户本身(相当于调用 gcloud dataproc clusters create --service-account static11-dp-airf@mygcpproject.iam.gserviceaccount.com 当调用者本身也是 static11-dp-airf@mygcpproject.iam.gserviceaccount.com).

错误消息实际上也可能有点过时,因为它应该指向 Service Account User instead of Service Account Actor,尽管从技术上讲后者也有效。

一般来说,调用 Dataproc API 的身份必须在 project-level 或直接在将绑定到的 service-account 上具有 Service Account User 角色Dataproc 集群的虚拟机,即使要绑定的 service-account 与调用方的身份相同。对于没有 dataproc 的普通 GCE 虚拟机也是如此 - 例如,如果你 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 也应该因相同的权限错误而失败。

所以基本上您只需要在“自身”上授予该服务帐户 Service Account User

https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/service-accounts 所述,除了 Dataproc Editor 角色之外 还需要此 Service Account User 角色。