如何列出我在Google Cloud项目中的所有IAM用户

29

我希望能够列出与我的项目关联的所有用户和服务账号(最好使用gcloud CLI工具,但如果需要的话也可以进行API调用)。

我可以很容易地使用这个命令列出与项目相关的所有服务账号,但是如何列出所有用户呢?我期望得到类似于下面的结果,但是文档中找不到任何内容:

gcloud beta iam users list
7个回答

42

列出项目中的所有服务帐号

以下命令将列出与项目相关联的所有服务帐号:

$ gcloud iam service-accounts list

NAME                                    EMAIL
Compute Engine default service account  12345678-compute@developer.gserviceaccount.com
dummy-sa-1                              dummy-sa-1@MY_PROJECT.iam.gserviceaccount.com

列出项目中所有用户和服务帐号及其IAM角色

如果您想要列出已被授予指定项目中任何IAM角色的所有用户/服务账户,您可以使用此命令:

$ gcloud projects get-iam-policy MY_PROJECT

bindings:
- members:
  - serviceAccount:12345678-compute@developer.gserviceaccount.com
  - user:alice@foobar.com
  role: roles/editor
- members:
  - user:you@yourdomain.com
  - user:someoneelse@yourdomain.com
  role: roles/owner
etag: ARBITRARY_ETAG_HERE
version: 1

格式化输出

gcloud 支持将输出格式化为 json,以及许多其他自定义选项,可以在某些情况下更轻松地解析或仅打印您需要的信息。

示例:

# Prints the output as json instead of the default yaml format
$ gcloud projects get-iam-policy MY_PROJECT --format=json

# Display just the bindings in json format
$ gcloud projects get-iam-policy MY_PROJECT --format='json(bindings)'

# Display the bindings in a flattened format
$ $ gcloud projects get-iam-policy MY_PROJECT --format='flattened(bindings)'

我觉得我发现了一个 bug - 当使用 gcloud projects get-iam-policy MY_PROJECT 时,它不会列出任何具有继承权限(例如从文件夹继承的权限)的用户/电子邮件。或者有特殊的方法处理它们吗? - Graham Polley
你如何获取所有项目中的所有用户? - james
@james 要获取所有项目中的所有用户,您需要首先列出所有项目,然后对于每个项目,使用上面的建议获取该项目的绑定。 - lukwam
要获取这些信息,您需要获取项目的祖先,然后获取项目的IAM策略绑定,然后获取每个父级的IAM绑定,一直到组织。@GrahamPolley - lukwam
@lukwam,你能分享一下用bash实现这个的方法吗?先谢谢了。 - james
显示剩余2条评论

7

列出服务帐户

$ gcloud iam service-accounts list

列出项目角色的成员

$ gcloud projects get-iam-policy [project]

将用户添加/影响到一个角色中

$ gcloud projects add-iam-policy-binding [project] \
--member="user:name@gmail.com" \
--role="roles/iam.serviceAccountUser" 

删除用户:

$ gcloud projects remove-iam-policy-binding [project] \
--member="user:name@gmail.com" \
--role="roles/iam.serviceAccountUser"

将Google群组添加/影响到角色中

$ gcloud projects add-iam-policy-binding [project] \
--member="group:my_group@googlegroups.com" \
--role="roles/storage.admin"

6
使用以下命令可以清晰地查看属于给定项目的所有成员:
gcloud projects get-iam-policy $GCP_PROJECT_NAME \
--flatten="bindings[].members" \
--format="table(bindings.members)"

4
您可以使用search-all-iam-policies命令来列出项目/文件夹/组织的所有IAM策略,并使用grep命令搜索用户:
$ gcloud asset search-all-iam-policies --scope=projects/123 | grep user:

这将显示不仅在项目本身被授予角色的用户,还包括在子资源(如计算实例或bigquery数据集)中被授予角色的用户。
只要您拥有范围内的"cloudasset.assets.searchAllIamPolicies"权限,您就可以将范围更改为organizations/123以搜索整个组织。
更多详细信息请参阅另一篇文章:如何在Google Cloud平台(GCP)中列出、查找或搜索服务(API)、资源类型和项目中的IAM策略?

4
以下命令将列出整个 GCP 组织中的所有非服务账号:
gcloud organizations get-iam-policy ORGANIZATION_ID | grep user\: | sort | uniq

获取组织机构ID
gcloud organizations list

2

很遗憾,无法使用该方法列出所有用户

gcloud iam . . .

我们可以使用命令树来列出Google Cloud Platform(GCP)项目($GCP_PROJECT_NAME)下的所有账户。

gcloud projects get-iam-policy

命令树代替:
gcloud projects get-iam-policy $GCP_PROJECT_NAME \
--flatten="bindings[].members" \
--format="value(bindings.members)" \
--sort-by=bindings.members | uniq

#=>

. . .
serviceAccount:$SOME_SERVICE_ACCOUNT
. . .
user:$SOME_USER
. . .

这包括将任何重复的结果通过uniq进行管道传输。

注意:上述命令保证列出与$GCP_PROJECT_NAME相关联的所有帐户,因为每个帐户必须至少有一个角色:

gcloud projects add-iam-policy-binding $ANOTHER_USER \
--member="user:${ANOTHER_USER}"

#=>

ERROR: (gcloud.projects.add-iam-policy-binding) argument --role: Must be specified.

如果必要,我们可以利用.flatten().slice().split() gcloud投影来摆脱serviceAccount:user:前缀。
gcloud projects get-iam-policy $GCP_PROJECT_NAME \
--flatten="bindings[].members" \
--format="value(bindings.members.split(':').slice(1:).flatten())" \
--sort-by=bindings.members | uinq

#=>

. . .
$SOME_SERVICE_ACCOUNT
. . .
$SOME_USER
. . .

关于gcloud投影,更多信息请参见这里

我们还可以使用--filter标志来过滤此结果:

gcloud projects get-iam-policy $GCP_PROJECT_NAME \
--filter="user" \
--flatten="bindings[].members" \
--format="value(bindings.members.split(':').slice(1:).flatten())" \
--sort-by=bindings.members | uniq

#=>

. . .
$SOME_USER
. . .

并且:

gcloud projects get-iam-policy $GCP_PROJECT_NAME \
--filter="serviceAccount" \
--flatten="bindings[].members" \
--format="value(bindings.members.split(':').slice(1:).flatten())" \
--sort-by=bindings.members | uniq

#=>

. . .
$SOME_SERVICE_ACCOUNT
. . .

1
如果你正在搜索多个项目中的一个用户,你也可以使用这个脚本。
 for i in $(gcloud projects list |awk '/PROJECT_ID:/ {print$2}');
  do 
    echo ">> checking $i"; 
    gcloud projects get-iam-policy $i |grep -i YOURUSER ;
 done

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