一、基本概念
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:[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