为什么我的服务帐户无法访问 GCP 项目?

Why is my Service Account Unable to Access GCP Projects?

与 Bitbucket 集成的服务帐户无法 list 项目:

gcloud projects list

#=>

Listed 0 items.

set $MY_PROJECT:

gcloud config set project $MY_PROJECT

#=>

Updated property [core/project].

因为上面的输出紧跟这个警告:

WARNING: You do not appear to have access to project [$MY_PROJECT] or it does not exist

上面的警告与下面的输出相矛盾:

gcloud config list --format="value(core.project)"

#=>

$MY_PROJECT

是否缺少任何步骤或先决条件才能将此服务帐户正确授权给 listset $MY_PROJECT

我的 bitbucket-pipelines.yaml 文件:

name: Test google auth
image: google/cloud-sdk:latest
script:
  - echo $KEY_FILE | base64 --decode --ignore-garbage > ~/google-key.json
  - gcloud auth activate-service-account --key-file ~/google-key.json
  - gcloud projects list
  - gcloud config set project $MY_PROJECT
  - gcloud container clusters get-credentials $MY_CLUSTER --region $REGION
services:
  - docker

您为服务帐户设置了什么权限?您是否添加了以下权限?

resourcemanager.projects.get
resourcemanager.projects.list

检查 gcloud auth list 正在使用您的 Cloud SDK 的活动帐户,然后检查它是否对您的项目具有适当的权限。

如果您成功激活服务账号如下:

gcloud auth activate-service-account --key-file service-account-key.json

执行以下命令后,您可以看到它是活动的:

gcloud auth list

而且,获得零个项目

Listed 0 items.

执行以下操作后:

gcloud projects list

然后

确保将您的服务帐户作为成员添加到项目旁边的 Organization 并为其分配 Viewer 角色。

WARNING: You do not appear to have access to project [$PROJECT_ID] or it does not exist.

警告出现除非存在至少一个授予包含resourcemanager.projects.get权限的服务帐户的角色。

Google 云帐户和权限之间有一个额外的抽象层:角色。您不能直接向用户或服务帐户授予权限;您可以 link 具有角色的用户和具有权限的角色。有关 GCP 角色的更多信息 here.

您需要:

  • 更新至少一个与具有上述权限的服务帐户关联的自定义角色:

    gcloud iam roles update $ROLE \
    --add-permissions=resourcemanager.projects.get \
    --project=$PROJECT_ID
    
    #=>
    
    description: $ROLE_DESCRIPTION
    etag: . . .
    includedPermissions:
    . . .
    - resourcemanager.projects.get
    . . .
    name: projects/$PROJECT_ID/roles/$ROLE
    stage: . . .
    title: $ROLE_TITLE
    

    警告:确保在更新时在这里使用--add-permissions标志,因为--permissions标志将删除 自定义角色过去拥有的任何其他权限。

  • 创建自定义角色:

    gcloud iam roles create $ROLE \
    --description="$ROLE_DESCRIPTION" \
    --permissions=resourcemanager.projects.get \
    --project=$PROJECT_ID \
    --title='$ROLE_TITLE'
    
    #=>
    
    Created role [$ROLE].
    description: $ROLE_DESCRIPTION
    etag: . . .
    includedPermissions:
    - resourcemanager.projects.get
    name: projects/$PROJECT_ID/roles/$ROLE
    stage: . . .
    title: $ROLE_TITLE
    

    并将其与服务帐户相关联:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member=serviceAccount:$SERVICE_ACCOUNT \
    --role=projects/$PROJECT_ID/roles/$ROLE
    
    #=>
    
    Updated IAM policy for project [$PROJECT_ID].
    auditConfigs:
    . . .
    
  • 将服务帐户与已包含 resourcemanager.projects.get 权限的策划角色相关联,这已在上面讨论过。

    如果您想知道哪些精选角色已经包含 resourcemanager.projects.get 权限并且不想制作复杂的 shell 循环,则可能更容易进入 here 和按 Permission:resourcemanager.projects.get.

    过滤所有角色

注意:如果您运行遇到问题,请务必阅读授予资源访问权限的要求here

注意:如果您想了解 resourcemanager.projects.list 权限,它只能授予 组织 级别的角色:

gcloud iam roles create $ROLE \
--description="$ROLE_DESCRIPTION" \
--permissions=resourcemanager.projects.list \
--project=$PROJECT_ID \
--title='$ROLE_TITLE'

#=>

ERROR: (gcloud.iam.roles.create) INVALID_ARGUMENT: Permission resourcemanager.projects.list is not valid.

有关此限制的更多信息 here

在终端中将新的 sv 帐户设置为活动:

gcloud config set account  cloud-sql-sv-account@xyz.iam.gserviceaccount.com

然后使用此 sv 帐户进行身份验证:

gcloud auth activate-service-account --key-file=<path to json sv key>