【问题标题】:User not authorized to act as service account when using Workload Identity用户在使用 Workload Identity 时无权充当服务帐户
【发布时间】:2020-09-17 15:31:54
【问题描述】:

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

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

$ 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'。要充当服务帐户,用户必须具有 [ Owner、Editor、Service Account Actor] 角色。有关更多详细信息,请参阅 https://cloud.google.com/iam/docs/understanding-service-accounts。">

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

【问题讨论】:

    标签: google-kubernetes-engine google-cloud-dataproc


    【解决方案1】:

    在这种情况下,您的设置的 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而不是Service Account Actor,尽管从技术上讲后者也可以。

    通常,调用 Dataproc API 的身份必须在项目级别或直接在将绑定到 Dataproc 集群的虚拟机的服务帐户上具有 Service Account User 角色,即使该服务帐户to be bound 与调用者的身份相同。对于没有 dataproc 的普通 GCE VM 也是如此 - 例如,如果您 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 角色。

    【讨论】:

    • 太棒了,谢谢@dennis-huo。这修复了它:gcloud iam service-accounts add-iam-policy-binding $SERVICE_ACCOUNT --member=serviceAccount:$SERVICE_ACCOUNT --role=roles/iam.serviceAccountUser
    • 我还应该指出,您链接到的文章 (cloud.google.com/dataproc/docs/concepts/configuring-clusters/…) 没有明确包含有关 Service Account User 角色的详细信息,但它确实链接到这篇文章:cloud.google.com/iam/docs/service-accounts-actas,它提供了更多详细信息.
    • 我们是否可以通知任何人将错误消息修改为“用户”而不是“演员”?
    猜你喜欢
    • 1970-01-01
    • 2013-02-20
    • 2014-12-18
    • 2017-03-15
    • 2021-09-24
    • 2020-05-13
    • 2012-10-26
    • 2020-05-01
    • 1970-01-01
    相关资源
    最近更新 更多