GCP: IAM的使用

一、基本概念

IAM可让您通过定义谁(Identity)对哪些资源(Resource)具有哪种访问权限(Role)来管理访问权限控制。下面分别来解释这三个主体。

(一)与Identity相关的概念

包含5种类型的identity,前面三种用得最多

  1. Google 帐号:Google 帐号代表开发者、管理员或与 GCP 互动的任何其他人员
  2. 服务帐号(Service Account):服务帐号属于您的应用而非某个最终用户,也就是说这个帐号是给程序用的, 我们的应用程序需要使用某个服务帐号来调用其他服务
  3. Google 群组:Google 群组是 Google 帐号和服务帐号的指定集合,它是将访问权限政策(Policy)应用于一组用户的一种便捷方式。
  4. G Suite 网域:
  5. Cloud Identity 网域:

(二)与Resource相关的概念

  • Resource(资源): 项目、Compute Engine 实例和 Cloud Storage 存储分区都属于资源。

(三)与Role相关的概念

  1. Permission(权限): 权限决定了可以对资源执行的操作。在 Cloud IAM 领域中,权限以 <service>.<resource>.<verb> 的形式表示,例如 pubsub.topics.publish, 表示pubsub服务对topic有publish的权限。
  2. Role(角色): 角色是一组权限(permission)的集合。您不能直接为用户分配权限;而应为用户授予角色,为用户授予一个角色就是授予该角色包含的所有权限。
  3. Policy(政策):要为用户授予角色,您可以创建 Cloud IAM Policy,这是一组定义谁(member)拥有何种访问权限(role)的语句集合。Policy附加到资源,用于在访问该资源时强制实施访问权限控制。

以下代码段演示了 Cloud IAM 政策的结构,可以看出policy是用于定义member与role的一种绑定关系

{
  "bindings": [
   {
     "role": "roles/storage.objectAdmin",
     "members": [
       "user:[email protected]",
       "serviceAccount:[email protected]",
       "group:[email protected]",
       "domain:google.com" ]
   },
   {
     "role": "roles/storage.objectViewer",
     "members": ["user:[email protected]"]
   }
   ]
}

使用命令行快速授予/撤消单个用户角色 

# 快速授予单个用户角色
gcloud [GROUP] add-iam-policy-binding [RESOURCE-NAME]
  --member user:[USER-EMAIL] --role [ROLE-ID]

# 在my-project项目下,给用户[email protected]授予角色roles/viewer
gcloud projects add-iam-policy-binding my-project
  --member user:[email protected] --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将用户([email protected])与 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(使用 [email protected])。
    • Alice 在项目级层拥有对象管理权限,并且可以读取、添加和删除项目中任何存储分区内的任何对象。
  • 存储对象创建者授予用户群组 [email protected]
    • 此政策意味着 [email protected] 的所有成员都可以将文件上传到存储分区。
    • 群组成员拥有他们上传的文件,但他们无法读取或删除其他用户上传的任何文件。

下图演示了上面的示例:

 二、如何创建一个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

 (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

发布了105 篇原创文章 · 获赞 46 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/wucong60/article/details/103511945
gcp
IAM
今日推荐