即使授予了"Service Account Token Creator"角色,仍无法模拟GCP服务帐户

5

我在Google Cloud Platform(GCP)项目中有2个ServiceAccounts。

  • owner(所有者)
  • executor(执行者)

owner ServiceAccount被附加了1个项目级别的角色:

  • "Owner" - 用于该项目

executor ServiceAccount仅被附加了2个特定角色(如下所示):

  • "Service Account Token Creator" - 在Owner ServiceAccount 上
  • "Service Account User" - 在Owner ServiceAccount 上

enter image description here


现在,我有Executor ServiceAccount的JSON密钥文件。我将使用该凭据文件来“冒充”Owner ServiceAccount。然后我将运行gcloud命令。


这是我正在做的事情。

#!/bin/bash

# --------------------------------------------------------------

export GOOGLE_APPLICATION_CREDENTIALS="$(pwd)/my-executor-sa-key.json"
echo $GOOGLE_APPLICATION_CREDENTIALS
cat $GOOGLE_APPLICATION_CREDENTIALS

OWNER_EMAIL="owner@my-gcp-project.iam.gserviceaccount.com"
echo $OWNER_EMAIL

# --------------------------------------------------------------

CLUSTER="my-k8s-cluster"
ZONE="asia-east1-a"
PROJECT="my-gcp-project"

MY_COMMAND="gcloud container clusters get-credentials ${CLUSTER} --zone ${ZONE} --project ${PROJECT} --impersonate-service-account=${OWNER_EMAIL}"
echo $MY_COMMAND

# --------------------------------------------------------------

`$MY_COMMAND`

# --------------------------------------------------------------

在运行上面的代码后,这是我得到的输出结果。

# --------------------------------------------------------------

/Users/rakib/tmp/my-executor-sa-key.json
{
  "type": "service_account",
  "project_id": "my-gcp-project",
  "private_key_id": "3208--------------------------------5d63",
  "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEv\n----\nEAE9S\n-----END PRIVATE KEY-----\n",
  "client_email": "executor@my-gcp-project.iam.gserviceaccount.com",
  "client_id": "1099--------------5533",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/executor%40my-gcp-project.iam.gserviceaccount.com"
}

owner@my-gcp-project.iam.gserviceaccount.com

# --------------------------------------------------------------

gcloud container clusters get-credentials my-k8s-cluster --zone asia-east1-a --project my-gcp-project --impersonate-service-account=owner@my-gcp-project.iam.gserviceaccount.com

# --------------------------------------------------------------

WARNING: This command is using service account impersonation. All API calls will be executed as [owner@my-gcp-project.iam.gserviceaccount.com].
ERROR: (gcloud.container.clusters.get-credentials) Failed to impersonate [owner@my-gcp-project.iam.gserviceaccount.com]. Make sure the account that's trying to impersonate it has access to the service account itself and the "roles/iam.serviceAccountTokenCreator" role.

我在这里错过了什么?我确实已经将Executor ServiceAccount授予Owner ServiceAccount的roles/iam.serviceAccountTokenCreator角色。

为什么它不能进行模拟呢?


你有按照这个做吗?https://cloud.google.com/iam/docs/impersonating-service-accounts#iam-service-accounts-grant-role-parent-gcloud - Mahboob
你是否在所有者服务帐户本身上授予了角色(将该帐户视为资源)?还是将权限应用于项目?我认为你做了后者,需要对前者进行操作。我会给你一个命令来测试/执行。 - DazWilkin
1
不,忽略那个... 看起来你可以在项目级别授予角色:https://cloud.google.com/iam/docs/service-accounts#user-role - DazWilkin
1
您可以在 Google 的问题跟踪器上提交反馈,并请求澄清文档。 - DazWilkin
1
感谢您的建议@DazWilkin。尝试在此Google问题跟踪器中提出请求-https://issuetracker.google.com/issues/176175067 - Rakib
显示剩余5条评论
1个回答

5
原来我需要添加 gcloud auth activate-service-account --key-file=$GOOGLE_APPLICATION_CREDENTIALS 命令(更多细节请参见此处)。仅仅设置 $GOOGLE_APPLICATION_CREDENTIALS 环境变量对于 gcloud CLI 工具是不够的。
一直以来,我都知道将 ServiceAccount 路径写入 $GOOGLE_APPLICATION_CREDENTIALS 就足够了。在我阅读到处时,我看到ADC使用$GOOGLE_APPLICATION_CREDENTIALS来实现这一点: 但是,事实证明 gcloud 并不使用 ADC。ADC 仅由客户端库如 C#、Java、Python、Go、Ruby 等使用。
我已经在 Google 的问题跟踪器中提交了一个新案例,希望 Google 能帮助改进他们的文档,以避免混淆。

1
谢谢,这解决了我的问题。希望文档能提供更多关于此的指导。 - Pascal Delange

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接