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

# 設置此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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章