![12c7d622a8817d30e870ef67c6f136e7.png](https://i-blog.csdnimg.cn/blog_migrate/ef683336f8cee4d68cdc3f9baebe51e7.png)
---
注:以下笔记来源于GCP官网资料,同时结合个人的理解。
----
一、身份相关的概念
GCP的账号包括以下几种类型:
- Google 帐号
- 服务帐号 //类似于k8s service account;aws iam role, 用于让程序拥有特定的权限来完成相应的操作。
- Google 群组
- G Suite 网域 //谷歌的工作套件,包含Gmail、Cloud Identity等功能,收费。
- Cloud Identity 网域 // 身份管理系统,用户管理用户,可以与AD以及其他IDP对接,专业版收费。
Google 帐号
Google 帐号代表开发者、管理员或与 Google Cloud 进行交互的任何其他人员。任何与 Google 帐号关联的电子邮件地址都可以作为身份,包括 http://gmail.com 或其他域名。新用户可以通过转到 Google 帐号注册页面来注册 Google 帐号。
服务帐号
服务帐号是针对应用的帐号,而非针对某个最终用户。当运行托管在 Google Cloud 上的代码时,该代码将作为您指定的帐号运行。您可以根据需要创建任意多个服务帐号,以表示应用的不同逻辑组件。如需详细了解如何在应用中使用服务帐号,请参阅身份验证使用入门。
Google 群组
Google 群组是 Google 帐号和服务帐号的指定集合。每个 Google 群组都有一个关联的唯一电子邮件地址。您可以通过点击任意 Google 群组主页上的关于来找到与 Google 群组关联的电子邮件地址。如需详细了解 Google 群组,请参阅 Google 群组首页。
Google 群组是将访问权限政策应用于一组用户的一种便捷方式。您可以一次授予和更改整个群组的访问权限控制,而不是一次授予或更改一个用户或服务帐号的访问权限控制。您还可以轻松地向 Google 群组中添加成员以及从中移除成员,而不是更新 IAM 政策以添加或移除用户。
Google 群组没有登录凭据,并且您无法使用 Google 群组建立身份以发出访问资源的请求。
G Suite 网域
G Suite 网域代表在组织的 G Suite 帐号中创建的所有 Google 帐号的虚拟组。G Suite 网域代表您组织的互联网域名(例如 example.com
),当您向 G Suite 网域添加用户时,系统会在此虚拟组内为该用户创建一个新的 Google 帐号(例如 username@example.com
)。
与 Google 群组一样,G Suite 网域无法用于建立身份,但它们能够实现便捷的权限管理。
Cloud Identity 网域
Cloud Identity 网域就像 G Suite 网域,因为它代表了组织中所有 Google 帐号的虚拟组。但是,Cloud Identity 网域的用户无权访问 G Suite 应用和功能。有关详情,请参阅 Cloud Identity 简介。
allAuthenticatedUsers
值 allAuthenticatedUsers
是一个特殊的标识符,表示所有服务帐号和已使用 Google 帐号进行身份验证的互联网上的所有用户。此标识符包括未连接到 G Suite 或 Cloud Identity 网域的帐号,如个人 Gmail 帐号。不包括未经身份验证的用户,例如匿名访问者。
allUsers
值 allUsers
是一个特殊的标识符,表示互联网上的任何用户,包括经过身份验证和未经过身份验证的用户。
注意:一些 Google Cloud 服务需要先进行身份验证,然后才能供用户访问。对于这些服务,allUsers
仅包括经过身份验证的用户。
二、权限管控 //总结起来就是 user---role---resource,相比aws, GCP的权限更细,实际操作起来特别繁琐,经常出现permission denied的情况。(用根账号登陆除外)
当经过身份验证的成员尝试访问资源时,IAM 会检查该资源的 IAM 政策,以确定是否允许该操作。
资源
如果用户需要对特定的 Google Cloud 资源的访问权限,您可以向该用户授予该资源的相应角色。例如,项目、Compute Engine 实例和 Cloud Storage 存储分区都属于资源。
某些服务支持以比项目级层更精细的粒度授予 IAM 权限。例如,对于特定 Cloud Storage 存储分区,您可以向用户授予 Storage Admin 角色 (roles/storage.admin
),或者对于特定 Compute Engine 实例,您可以向用户授予 Compute Instance Admin 角色 (roles/compute.instanceAdmin
)。
在其他情况下,您可以授予项目级层的 IAM 权限。然后,该项目中的所有资源都会继承该权限。例如,要授予对项目中所有 Cloud Storage 存储分区的访问权限,请授予对项目的访问权限,而不是对每个存储分区的访问权限。或者,要授予对项目中所有 Compute Engine 实例的访问权限,请授予对项目的访问权限,而不是对每个实例的访问权限。
如需了解可对哪些资源授予哪些角色,请参阅了解角色并参阅给定角色的最低资源要求列。
权限
权限决定了可以对资源执行的操作。在 IAM 场景中,权限以 service.resource.verb
的形式表示,例如 pubsub.subscriptions.consume
。
权限通常与 REST API 方法一一对应。也就是说,每项 Google Cloud 服务都有与其公开的每个 REST API 方法相关联的一组权限。该方法的调用者需要这些权限才能调用该方法。例如,如果您使用 Pub/Sub,并且需要调用 topics.publish()
方法,则必须拥有该主题的 pubsub.topics.publish
权限。
您不能直接向用户授予权限,而是确定包含相应权限的角色,然后将这些角色授予用户。 如需查看所有可用权限的列表以及包含这些权限的角色,请参阅权限参考文档。
角色
一个角色对应一组权限。您不能直接向用户授予权限,而是为用户授予角色。为用户授予一个角色就是授予该角色包含的所有权限。
![70106cb80664d98d75e5d641f6835383.png](https://i-blog.csdnimg.cn/blog_migrate/c36bbe1ce85987e09f6dc2be53c8004a.png)
IAM 中有三种角色:
- 原初角色:Google Cloud Console 中之前提供的角色。这些角色包括 Owner、Editor 和 Viewer。如果可能,请避免授予这些角色,因为它们包含所有 Google Cloud 服务的各种权限。
- 预定义角色:可提供比原初角色更精细的访问权限控制的角色。例如,预定义角色 Pub/Sub Publisher (
roles/pubsub.publisher
) 提供仅将消息发布到 Pub/Sub 主题的访问权限。 - 自定义角色:您创建的角色,用于在预定义角色无法满足您的需求时根据组织的需要度身定制权限。
要了解如何向用户授予角色,请参阅授予、更改和撤消访问权限。要了解可用的 IAM 预定义角色,请参阅了解角色。要了解自定义角色,请参阅了解自定义角色及创建和管理自定义角色。
IAM 政策
要为用户授予角色,您可以创建 IAM 政策,这是一组定义谁拥有何种访问权限的语句集合。政策附加到资源,用于在访问该资源时强制实施访问权限控制。
![e53848297ef7a26358aafbabe7ce4f6c.png](https://i-blog.csdnimg.cn/blog_migrate/391e93595331d14c64129ebcd05e8e00.jpeg)
IAM 政策由 IAM Policy
对象表示。IAM Policy
对象包含一系列绑定。Binding
会将一系列 members
绑定到 role
。
role
:您要授予成员的角色。role
按roles/service.roleName
格式指定。例如,Cloud Storage 提供roles/storage.objectAdmin
、roles/storage.objectCreator
和roles/storage.objectViewer
等角色。members
:一个或多个身份的列表,如本文的与身份相关的概念部分中所述。每个成员类型通过前缀进行标识,例如 Google 帐号 (user:
)、服务帐号 (serviceAccount:
)、Google 群组 (group:
) 或 G Suite 或 Cloud Identity 网域 (domain:
)。在以下示例代码段中,使用相应前缀将storage.objectAdmin
角色授予以下成员:user:ali@example.com
、serviceAccount:my-other-app@appspot.gserviceaccount.com
、group:admins@example.com
和domain:google.com
。将objectViewer
角色授予user:maria@example.com
。
以下代码段展示了 IAM 政策的结构。
{
"bindings": [
{
"role": "roles/storage.objectAdmin",
"members": [
"user:ali@example.com",
"serviceAccount:my-other-app@appspot.gserviceaccount.com",
"group:admins@example.com",
"domain:google.com"
]
},
{
"role": "roles/storage.objectViewer",
"members": [
"user:maria@example.com"
]
}
]
}