GCP: IAM的使用
一、基本概念
IAM可让您通过定义谁(Identity)对哪些资源(Resource)具有哪种访问权限(Role)来管理访问权限控制。下面分别来解释这三个主体。
(一)与Identity相关的概念
包含5种类型的identity,前面三种用得最多
- Google 帐号:Google 帐号代表开发者、管理员或与 GCP 互动的任何其他人员
- 服务帐号(Service Account):服务帐号属于您的应用而非某个最终用户,也就是说这个帐号是给程序用的, 我们的应用程序需要使用某个服务帐号来调用其他服务
- Google 群组:Google 群组是 Google 帐号和服务帐号的指定集合,它是将访问权限政策(Policy)应用于一组用户的一种便捷方式。
- G Suite 网域:
- Cloud Identity 网域:
(二)与Resource相关的概念
- Resource(资源): 项目、Compute Engine 实例和 Cloud Storage 存储分区都属于资源。
(三)与Role相关的概念
- Permission(权限): 权限决定了可以对资源执行的操作。在 Cloud IAM 领域中,权限以 <service>.<resource>.<verb> 的形式表示,例如 pubsub.topics.publish, 表示pubsub服务对topic有publish的权限。
- Role(角色): 角色是一组权限(permission)的集合。您不能直接为用户分配权限;而应为用户授予角色,为用户授予一个角色就是授予该角色包含的所有权限。
- Policy(政策):要为用户授予角色,您可以创建 Cloud IAM Policy,这是一组定义谁(member)拥有何种访问权限(role)的语句集合。Policy附加到资源,用于在访问该资源时强制实施访问权限控制。
以下代码段演示了 Cloud IAM 政策的结构,可以看出policy是用于定义member与role的一种绑定关系
{
"bindings": [
{
"role": "roles/storage.objectAdmin",
"members": [
"user:aaa@qq.com",
"serviceAccount:aaa@qq.com",
"group:aaa@qq.com",
"domain:google.com" ]
},
{
"role": "roles/storage.objectViewer",
"members": ["user:aaa@qq.com"]
}
]
}
使用命令行快速授予/撤消单个用户角色
# 快速授予单个用户角色
gcloud [GROUP] add-iam-policy-binding [RESOURCE-NAME]
--member user:[USER-EMAIL] --role [ROLE-ID]
# 在my-project项目下,给用户aaa@qq.com授予角色roles/viewer
gcloud projects add-iam-policy-binding my-project
--member user:aaa@qq.com --role roles/viewer
# 撤消单个用户角色
gcloud [GROUP] remove-iam-policy-binding [RESOURCE-NAME]
--member user:[EMAIL] --role [ROLE-ID]
# 查看policy
gcloud projects get-iam-policy [PROJECT] --format [FORMAT] > [FILE-PATH]
# 修改policy
gcloud projects set-iam-policy [PROJECT] [FILE-PATH]
二、上述概念之间的关系
- 一个权限决定了可以对资源执行的操作,以下图compute.instances.delete为例,compute是一个服务,instance是一个资源,服务compute对虚拟机实例(instance)有删除的权限。
- 一个角色(Role)包含多个权限(Permission), 如下图, 一个role (compute.instance.Admin) 包含6种权限。
- Policy描述了用户与权限的一种绑定关系
例如:下图中,一个policy将用户(aaa@qq.com)与 Role (roles/appengine.appAdmin)进行绑定,一旦这个policy attached到某个项目上,那当前用户拥有appengine的所有权限。
三、最佳实践
GCP 资源以分层方式组织,其中组织节点是层次结构中的根节点,项目是组织的子项,其他资源是项目的后代。每项资源有且仅有一个父项。如下图,层级关系是:organization----->folder----->project----->resource。 以某公司为例,example.com是某一个公司的组织,通常只有一个, Folders 表示为不同的环境,分为(Sandbox/Dev/Stage/Production)四种环境, Project表示具体的项目。
通过下图可以看出,IAM是如何对这资源进行访问控制的。
示例:Cloud Storage
在 Cloud Storage 中,存储分区和对象是资源,其中存储分区是容纳对象的容器。将 Cloud IAM 与 Cloud Storage 结合使用的示例是允许拥有所上传文件的读取权限。
请想象这样一个场景:许多用户将文件上传到存储分区,但他们应该无法读取或删除其他用户上传的任何文件。您的数据处理专家应该能够读取和删除上传的文件,但应该无法删除存储分区,因为其他人正在使用存储分区位置上传其文件。在此场景中,您可以按如下方式在项目上设置政策:
- 将存储对象管理员授予您的数据处理专家 Alice(使用 aaa@qq.com)。
- Alice 在项目级层拥有对象管理权限,并且可以读取、添加和删除项目中任何存储分区内的任何对象。
- 将存储对象创建者授予用户群组 aaa@qq.com。
- 此政策意味着 aaa@qq.com 的所有成员都可以将文件上传到存储分区。
- 群组成员拥有他们上传的文件,但他们无法读取或删除其他用户上传的任何文件。
下图演示了上面的示例:
上一篇: OSI 模型