一、基本概念
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:alice@example.com",
"serviceAccount:my-other-app@appspot.gserviceaccount.com",
"group:admins@example.com",
"domain:google.com" ]
},
{
"role": "roles/storage.objectViewer",
"members": ["user:bob@example.com"]
}
]
}
使用命令行快速授予/撤消单个用户角色
# 快速授予单个用户角色
gcloud [GROUP] add-iam-policy-binding [RESOURCE-NAME]
--member user:[USER-EMAIL] --role [ROLE-ID]
# 在my-project项目下,给用户user-1@gmail.com授予角色roles/viewer
gcloud projects add-iam-policy-binding my-project
--member user:user-1@gmail.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将用户(userid@gmail.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(使用 alice@example.com)。
- Alice 在项目级层拥有对象管理权限,并且可以读取、添加和删除项目中任何存储分区内的任何对象。
- 将存储对象创建者授予用户群组 data_uploaders@example.com。
- 此政策意味着 data_uploaders@example.com 的所有成员都可以将文件上传到存储分区。
- 群组成员拥有他们上传的文件,但他们无法读取或删除其他用户上传的任何文件。
下图演示了上面的示例:
二、如何创建一个Service Account
服务帐号是给程序用的,与用户帐号不一样, 通常我们会给服务帐号一些权限,用于控制访问某些服务的资源。如下就有三个服务帐号,在你创建服务帐号的时候,它会提示你去选择一些权限,创建完成这个服务帐号就有了访问某些资源的权限了。
创建好服务帐号后,继续在这个帐号下面创建一个key, 选择JSON,然后它会自己下载一个json文件,json文件的内容是如下格式的,文件名 qwiklabs-gcp-01-dbddd1fe79f0-6901fbfc3773.json
{
"type": "service_account",
"project_id": "qwiklabs-gcp-01-dbddd1fe79f0",
"private_key_id": "6901fbfc37738179da9296ef7fe1c8504c2e5a83",
"private_key": "-----BEGIN PRIVATE KEY----xxxxxxxxxxxxxxxxxxxxxxxxxx-----END PRIVATE KEY-----\n",
"client_email": "cong-appengine-demo@qwiklabs-gcp-01-dbddd1fe79f0.iam.gserviceaccount.com",
"client_id": "108252307627465457689",
"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/cong-appengine-demo%40qwiklabs-gcp-01-dbddd1fe79f0.iam.gserviceaccount.com"
}
那如何使用这个json文件呢,有两种方式。
(1) 第一种方式是:右击以管理员身份打开Google SDK, 运行如下命令,激活这个serviceaccount, 如果没有下载SDK的可以去官网下载。
# 初始化
gcloud init
# 定位到serviceaccount.json的位置
cd C:\Users\cong.wu\Downloads
# 激活服务帐号
# cong-appengine-demo@qwiklabs-gcp-00-bcc2c8d5d352.iam.gserviceaccount.com 是你的服务帐号
# qwiklabs-gcp-00-bcc2c8d5d352-e031aaf830ad.json 是你刚下载的json文件名
gcloud auth activate-service-account cong-appengine-demo@qwiklabs-gcp-00-bcc2c8d5d352.iam.gserviceaccount.com --key-file=qwiklabs-gcp-00-bcc2c8d5d352-e031aaf830ad.json
# 设置此serviceAccount为当前的account
gcloud config set account sa-npd-27354-oriondev-95184682@npd-27354-oriondev-95184682.iam.gserviceaccount.com
(2) 第二种方式是:在环境变量里新增一个变量GOOGLE_APPLICATION_CREDENTIALS , 值指向你下载的json文件,重启电脑后才会生效。
之后,你就可以使用这个service account在给定的权限内为所欲为了。下面是一些例子。
#----------给service account增加角色,管理权限--------------
gcloud projects add-iam-policy-binding npd-27354-orionstage-160dc65a --member serviceAccount:sa-npd-27354-orionstage-160dc6@npd-27354-orionstage-160dc65a.iam.gserviceaccount.com --role roles/owner
#----------给service account增加角色,storage对象管理权限--------------
gcloud projects add-iam-policy-binding npd-27354-orionstage-160dc65a --member serviceAccount:sa-npd-27354-orionstage-160dc6@npd-27354-orionstage-160dc65a.iam.gserviceaccount.com --role roles/storage.objectAdmin
#----------给service account增加角色,storage管理权限--------------
gcloud projects add-iam-policy-binding npd-27354-orionstage-160dc65a --member serviceAccount:sa-npd-27354-orionstage-160dc6@npd-27354-orionstage-160dc65a.iam.gserviceaccount.com --role roles/storage.admin
#----------查看所有角色--------------
gcloud iam roles list
#----------查看所有service account--------------
gcloud iam service-accounts list
#----------查看服务帐号上的现有角色--------------
gcloud iam service-accounts get-iam-policy sa-npd-27354-orionstage-160dc6@npd-27354-orionstage-160dc65a.iam.gserviceaccount.com
#获取Pocily
gcloud projects get-iam-policy npd-27354-oriondev-95184682
gcloud projects get-iam-policy npd-27354-orionstage-160dc65a
#创建BUCKET
gsutil mb gs://npd-27354-oriondev-95184682.appspot.com/
gsutil rm -r gs://npd-27354-oriondev-95184682.appspot.com/
参考链接
https://cloud.google.com/iam/docs/service-accounts?_ga=2.163537724.-1604623414.1563865275