IAM 自訂角色

概述

Cloud IAM 提供適當的工具, 以最少的麻煩, 高自動化來管理資源的權限。 你不直接賦予使用者權限。 你賦予他們角色, 角色與一個或多個權限綁定。 這個功能讓我們可以依照工作內容來付予適當的群組以及角色權限。 使用者只會被賦予足夠完成他們工作的權限, 而管理者可以輕鬆地賦予預設權限到整個群組的使用者。
在 Cloud IAM 中, 有兩種角色:

  • 預定義好的角色
  • 自定義角色

預定義角色 由 Google 建立並管理。 他們的權限視必要會自動更新, 例如 GCP 新加入了功能或服務。

自定義角色 為使用者自定義, 讓我們可以視需求綁定一個或多個有支援的權限。 自定義角色不被 Google 維護, 當有新權限, 新功能, 或新服務新增到 GCP, 你的自定義角色將不會自動被更新。 自定義角色由一個或多個可用的 Cloud IAM 權限所組成。 權限讓使用者可以對 Google Cloud Platform 資源做特定的操作


你將在本教程中做什麼?

  • 建立, 更新, 刪除, 取消刪除自定義角色

預先具備條件

  • 對 IAM 角色熟悉

前言

本篇主要是利用 Google 的 Qwiklab 平台學習的同時,做的一份學習筆記
為避免翻譯誤解,專業術語在本篇將不會被翻譯,保留原文




設定及要求

在你按下 Start Lab 按鈕之前

詳讀所有的教學。Labs 是有時間限制的,而且你不可以停止時間倒數。倒數計時器在你按下 Start Lab 按鈕後開始倒數,上面顯示的時間為你還能使用 Cloud 資源的時間。

Qwiklabs 的手把手環境,讓你可以在真實環境中來操作進行 Qwiklabs 上提供的課程,而不是在一個模擬或是展示的環境。我們透過提供你一個全新的、暫時的帳號密碼,在計時器歸零之前,你可以用來登入並存取 Google Cloud Platform。

你需要什麼?

要完成這個 lab ,你需要:

  • 一個一般的網路瀏覽器(推薦 Chrome)
  • 完成這個 lab 的時間

備註: 如果你已經有你自己的個人 GCP 帳號或專案,請不要使用在這一個 lab

現在你已經開始你的 lab, 你將會登入 Google Cloud Shell 主控台,然後開啟命令列工具

如何開始你的 lab ,然後登入 Console?

  • 按下 Start Lab 按鈕。如果你需要付費,會有一個彈出視窗來讓你選擇付費的方式。在左方你會看到一個面板,上面有暫時的帳號密碼,你必須使用這些帳號密碼在此次 lab

  • 複製 username , 然後點擊 Open Google Console。 Lab 會開啟另外一個視窗,顯示選擇帳號的頁面

tip: 開啟一個全新的視窗,然後跟原本的頁面並排

  • 選擇帳號頁面, 點擊 Use Another Account

  • 登入頁面開啟,貼上之前複製的 username 以及 password ,然後貼上

重要:必須使用之前於 Connection Details 面板 取得的帳號密碼,不要使用你自己的 Qwiklabs 帳號密碼。 如果你有自己的 GCP 帳號,請不要用在這裡(避免產生費用)

  • 點擊並通過接下來的頁面:
    • 接受terms以及conditions
    • 不要增加recovery optoinstwo factor authentication (因為這只是一個臨時帳號)
    • 不要註冊免費體驗

稍待一些時候, GCP 控制台將會在這個視窗開啟。

注意:按下左上方位於Google Cloud Platform 隔壁的 Navigation menu ,你可以瀏覽選單,裡面有一系列的 GCP 產品以及服務


啟動 Google Cloud Shell

Google Cloud Shell 是載有開發工具的虛擬機器。它提供了5GB的 home 資料夾,並且運行在 Google Cloud 上。 Google Cloud Shell 讓你可以利用 command-line 存取 GCP 資源

  • GCP 控制台 ,右上的工具列,點擊 Open Cloud Shell 按鈕

  • 在打開的對話框裡,按下 START CLOUD SHELL:

你可以立即按下 START CLOUD SHELL 當對話視窗打開。

連結並提供環境會需要一點時間。當你連結成功,這代表你已成功獲得授權,且此專案已被設為你的專案ID,例如:

gcloudGoogle Cloud Platform 的 command-line 工具,他已事先被安裝在 Cloud Shell 並且支援自動補齊

使用這個 command ,你可以列出有效帳戶名稱:

gcloud auth list

輸出:

Credentialed accounts:
- <myaccount>@<mydomain>.com (active)

範例輸出:

Credentialed accounts:
- google1623327_student@qwiklabs.net

你可以使用以下 command 來列出專案 ID

gcloud config list project

輸出:

[core]
project = <project_ID>

範例輸出:

[core]
project = qwiklabs-gcp-44776a13dea667a6

gcloud 的完整文件可以參閱 Google Cloud gcloud Overview




理解 IAM 自定義角色

Cloud IAM 也提供了自定義角色的能力。 你可以建立一個自訂義的 Cloud IAM 角色, 並加入一個或多個權限, 然後將這個角色賦予給使用者。 Cloud IAM 提供圖形化以及 API 的方式來建立以及管理自定義角色

Key Point: 自定義角色讓你可以實施最低特權的原則, 確保在你的組織中, 使用者以及服務帳號都僅有剛好足夠完成他們工作的權限。

藉由整合一個或多個 Cloud IAM 權限, 建立一個自定義角色。 權限可以讓使用者在 Cloud Platform 資源做特定的操作。

在 Cloud IAM 的世界, 權限被表現為以下格式:

<service>.<resource>.<verb>

例如, compute.instances.list 權限讓使用者可以列出他們擁有的 Google Compute Engine instance, 而 compute.instances.stop 讓使用者停止一台 VM

通常, 但不是絕對, 權限跟 REST 方法的比例為 1:1 。 這代表說, 每一個 GCP 服務中, 每一個 REST 方法都會有一個相關的權限。 要呼叫一個方法, 你需要相對應的權限。 比如說, topic.publish() 的呼叫者會需要 pubsub.topics.publish 的權限。

唯有該資源是隸屬在該專案或組織的情況之下, 你才可以在該專案或組織內賦予跟此資源有關的權限。 如果你想要自定義角色擁有不屬於這個專案或組織的資源的權限, 那是不行的。




必要的權限以及角色

要建立一個自定義角色, 呼叫者必須擁有 iam.roles.create 權限

非擁有者的使用者包含 organization administrators (組織管理者), 必須要被賦予 Organization Role Administrator (組織角色管理者) (roles/iam.organizationRoleAdmin) 或是 IAM Role Administrator (IAM 角色管理者) (roles/iam.roleAdmin) 。 IAM Security Reviewer (IAM 安全審查者) (roles/iam.securityReviewer) 可以檢視自定義角色, 但無法管理他們

自定義角色使用者的介面位於 Google Cloud Platform 主控台的 IAM Roles 之下。 只有有權限的使用者可以建立或管理自定義角色。 若照預設, 只有專案擁有者可以建立新角色。 專案擁有者可以藉由給予其他使用者 IAM Role Administrator 角色來做權限操作; 若是組織的話, 只有組織管理者可以賦予 Organization Role, Administrator 角色




準備建立自定義角色

在自定義角色之前, 你可能會想知道

  • 什麼樣的權限可以應用在資源上
  • 什麼樣的角色可以被賦予在資源上
  • 什麼是角色的 metadata?



檢視可獲得的資源權限

在你建立一個自訂義角色之前, 你可能會想要知道什麼權限可以被應用到資源上。 你可以使用 gcloud command-line 工具, 主控台, 或是 IAM API 來取得所有適用在資源上的權限, 以及階層排列的資源。 例如, 你可以取得所有你可應用在一個組織中的權限, 以及那個組織中的專案的權限。

執行以下的執行來取得專案中可獲得的權限列表:

gcloud iam list-testable-permissions //cloudresourcemanager.googleapis.com/projects/$DEVSHELL_PROJECT_ID

輸出:

name: appengine.applications.create
stage: GA
---
name: appengine.applications.get
stage: GA
---
name: appengine.applications.update
stage: GA
---
name: appengine.instances.delete
stage: GA
---
name: appengine.instances.get
stage: GA
---
name: appengine.instances.list
stage: GA
---
customRolesSupportLevel: TESTING
name: appengine.memcache.addKey
stage: BETA
---
customRolesSupportLevel: TESTING
name: appengine.memcache.flush
stage: BETA
---



取得角色 metadata

在你建立自訂義角色之前, 你可能會想要獲得事先定義以及自定義角色的 metadata。 角色 metadata 包含角色 ID 以及該角色擁有的權限。 你可以使用 Google Cloud Platform 主控台或者是 IAM API 來檢視 metadata

執行以下指令來檢視角色 metadata, 將 [ROLE_NAME] 替換成欲檢視的角色, 例如: roles/viewerroles/editor

gcloud iam roles describe [ROLE_NAME]

範例輸出(roles/viewer):

description: Read access to all custom roles in the project.
etag: AA==
includedPermissions:
- iam.roles.get
- iam.roles.list
- resourcemanager.projects.get
- resourcemanager.projects.getIamPolicy
...
...
name: roles/iam.roleViewer
stage: GA
title: Role Viewer



檢視資源上可賦予的角色

使用 gcloud iam list-grantable-roles 指令來獲得可賦予到指定資源上的角色列表

執行以下的 gcloud 指令來列出你的專案中可賦予的角色:

gcloud iam list-grantable-roles //cloudresourcemanager.googleapis.com/projects/$DEVSHELL_PROJECT_ID

輸出應如下:


---
description: Full management of App Engine apps (but not storage).
name: roles/appengine.appAdmin
title: App Engine Admin
---
description: Ability to view App Engine app status.
name: roles/appengine.appViewer
title: App Engine Viewer
---
description: Ability to view App Engine app status and deployed source code.
name: roles/appengine.codeViewer
title: App Engine Code Viewer
---
...
...



建立自定義角色

要建立自定義角色, 呼叫者必須擁有 iam.roles.create 權限。 預設來說, 專案或組織的擁有者擁有可以建立以及管理自定義角色的權限

非擁有者的使用者, 包含組織管理員, 必須被賦予 Organization Role Administrator 角色, 或是 IAM Role Administrator 角色

使用 gcloud iam roles create 指令來建立新的自訂義角色。 你有兩種方式來使用這個指令:

  • 提供含有角色定義的 YAML 檔案
  • 當建立自定義角色時, 使用指定角色定義的旗標, 你必須指定指令的作用範圍, 是組織等級的還是專案等級的, 使用 --organization [ORGANIZATION_ID]--project [PROJECT_ID] 旗標。 下面的範例都是建立一個專案等級的自定義角色

循著以下的範例, 你將建立專案等級的自訂義角色




使用 YAML 檔案來建立自訂義角色

建立一個含有自定義角色定義的 YAML 檔。 檔案的結構必須像下面這樣:

title: [ROLE_TITLE]
description: [ROLE_DESCRIPTION]
stage: [LAUNCH_STAGE]
includedPermissions:
- [PERMISSION_1]
- [PERMISSION_2]

填入值的敘述如下:

  • [ROLE_TITLE] 角色職稱, 像是 Role Viewer, 可自定義
  • [ROLE_DESCRIPTION] 簡短的角色敘述, 像是 My custom role description
  • [LAUNCH_STAGE] 角色在啟動的生命週期, 像是 ALPHA, BETA, 或 GA, 可參考文件
  • [includePermissions] 指定了一個或多個這個自定義角色將包含的權限, 像是 iam.roles.get

該是動手的時間了! 建立你的角色定義 YAML 檔, 執行以下指令:

vim role-definition.yaml

將下面的定義增加到 YAML 檔案:

title: "Role Editor"
description: "Edit access for App Versions"
stage: "ALPHA"
includedPermissions:
- appengine.versions.create
- appengine.versions.delete

然後儲存並關閉檔案

執行下面的 gcloud 指令:

gcloud iam roles create editor --project $DEVSHELL_PROJECT_ID \
--file role-definition.yaml

如果角色成功被建立, 會得到以下的回應

Created role [editor].
description: Edit access for App Versions
etag: BwVs4O4E3e4=
includedPermissions:
- appengine.versions.create
- appengine.versions.delete
name: projects/[PROJECT_ID]/roles/editor
stage: ALPHA
title: Role Editor



使用 flag (旗標) 來建立自定義角色

現在你將使用旗標方法來建立一個新的自訂義角色。 旗標方法採用一個類似 YAML 檔案的格式, 所以你將可以辨識這個指令是如何被建立的

執行以下 gcloud 指令來使用旗標建立一個新的角色

gcloud iam roles create viewer --project $DEVSHELL_PROJECT_ID \
--title "Role Viewer" --description "Custom role description." \
--permissions compute.instances.get,compute.instances.list --stage ALPHA

範例輸出:

Created role [viewer].
description: Custom role description.
etag: BwVs4PYHqYI=
includedPermissions:
- compute.instances.get
- compute.instances.list
name: projects/[PROJECT_ID]/roles/viewer
stage: ALPHA
title: Role Viewer



列出自定義角色

執行以下指令來列出自定義角色, 指定專案等級或是組織等級

gcloud iam roles list --project $DEVSHELL_PROJECT_ID

範例輸出:


---
description: Edit access for App Versions
etag: BwVxLgrnawQ=
name: projects/[PROJECT_ID]/roles/editor
title: Role Editor
---
description: Custom role description.
etag: BwVxLg18IQg=
name: projects/[PROJECT_ID]/roles/viewer
title: Role Viewer

若要列出已刪除的角色, 你可以使用 --show-deleted 旗標
執行下面的 gcloud 指令來列出預定義的角色

gcloud iam roles list



編輯一個現存的自定義角色

更新資源的 metadata 的一個常用模式, 例如更新一個自訂義角色, 會先讀他目前的狀態, 在本地更新資料, 然後送出更改後的資料來複寫。 如果兩個或以上的動作同時發生, 可能會造成衝突

例如, 如果兩個專案的擁有者在同一時間試圖對一個角色做修改, 某些改變可能會失敗

Cloud IAM 在自定義角色中使用 etag 屬性來解決這個問題。 這個屬性被使用來核對這個自定義角色從上次請求之後是否被更改過了。 當你使用 etag 對 Cloud IAM 送出一個請求, Cloud IAM 會比較請求中以及目前的 etag 值, 唯有 etag 值吻合了, 變更才會被寫入

使用 gcloud iam roles update 指令來更新自定義角色。 你有兩種方式來使用這個指令:

  • 提供含有角色定義的 YAML 檔案
  • 當更新自定義角色時, 使用指定角色定義的旗標

當更新一個自定義角色時你必須指定指令的作用範圍, 是組織等級的還是專案等級的, 使用 --organization [ORGANIZATION_ID]--project [PROJECT_ID] 旗標。 下面的範例都是建立一個專案等級的自定義角色

describe 指令會返回角色的定義, 包含可獨特辨識角色目前版本的 etag 值。 當更新角色定義時, etag 值必須被提供, 以確保同時變更的請求不會互相複寫




使用 YAML 檔案來更新自定義角色

執行以下的 gcloud 指令來取得目前的角色定義, 將 [ROLE_ID] 替換成 editor

gcloud iam roles describe [ROLE_ID] --project $DEVSHELL_PROJECT_ID

describe 指令會返回以下輸出:

description: [ROLE_DESCRIPTION]
etag: [ETAG_VALUE]
includedPermissions:
- [PERMISSION_1]
- [PERMISSION_2]
name: [ROLE_ID]
stage: [LAUNCH_STAGE]
title: [ROLE_TITLE]

你將使用輸出的值來建立一個新的 YAML 檔案。 從這個指令中複製輸出

使用你的編輯器建立一個 new-role-definition.yaml

vim new-role-definition.yaml

將上面輸出的值貼上, 然後在 includedPermissions 下面增加兩個權限:

- storage.buckets.get
- storage.buckets.list

現在你的 YAML 檔看起來應該如下:

description: Edit access for App Versions
etag: BwVxIAbRq_I=
includedPermissions:
- appengine.versions.create
- appengine.versions.delete
- storage.buckets.get
- storage.buckets.list
name: projects/[PROJECT_ID]/roles/editor
stage: ALPHA
title: Role Editor

儲存並離開檔案

現在你將使用 update 指令來更新角色。 執行以下的 gcloud 指令, 將 [ROLE_ID] 替換成 editor:

gcloud iam roles update [ROLE_ID] --project $DEVSHELL_PROJECT_ID \
--file new-role-definition.yaml

如果角色成功被更新, 輸出會像以下那樣:

description: Edit access for App Versions
etag: BwVxIBjfN3M=
includedPermissions:
- appengine.versions.create
- appengine.versions.delete
- storage.buckets.get
- storage.buckets.list
name: projects/[PROJECT_ID]/roles/editor
stage: ALPHA
title: Role Editor



使用旗標來更新自定義角色

角色定義更新中, 每部份都有各自對應的旗標。 旗標清單可參考文件

你可以使用下面的旗標來增加以及移除權限:

  • --add-permissions: 增加一個或多個, 以逗號分隔的權限
  • --remove-permissions: 移除一個或多個, 以逗號分隔的權限

你也可以指定新的權限來取代掉目前的權限, 使用 --permissions [PERMISSIONS] 旗標以及以逗號來分隔權限

執行下面的 gcloud 指令, 使用旗標來增加權限到 viewer 角色

gcloud iam roles update viewer --project $DEVSHELL_PROJECT_ID \
--add-permissions storage.buckets.get,storage.buckets.list

如果角色成功地被更新, 以下的輸出將會返回

description: Custom role description.
etag: BwVxLi4wTvk=
includedPermissions:
- compute.instances.get
- compute.instances.list
- storage.buckets.get
- storage.buckets.list
name: projects/[PROJECT_ID]/roles/viewer
stage: ALPHA
title: Role Viewer



使自定義角色失效

當角色被無效化, 與之相連的政策也會失效, 就是說權限將會停止被賦予到這個角色, 儘管你賦予了使用者這個角色

無效化一個現存自定義角色最簡單的方法就是使用 --stage 指標來把它設成 DISABLED

執行以下的 gcloud 指令來無效化 viewer 角色

gcloud iam roles update viewer --project $DEVSHELL_PROJECT_ID \
--stage DISABLED

如果角色成功地被更新了, 將會返回以下輸出:

description: Custom role description.
etag: BwVxLkIYHrQ=
includedPermissions:
- compute.instances.get
- compute.instances.list
- storage.buckets.get
- storage.buckets.list
name: projects/[PROJECT_ID]/roles/viewer
stage: DISABLED
title: Role Viewer



刪除自定義角色

使用 gcloud iam roles delete 指令來刪除自定義角色。 一旦角色被刪了, 它就失效了, 無法再被用來與任何政策相對應

gcloud iam roles delete viewer --project $DEVSHELL_PROJECT_ID

範例輸出:

description: Custom role description.
etag: BwVxLkf_epw=
includedPermissions:
- compute.instances.get
- compute.instances.list
- storage.buckets.get
- storage.buckets.list
name: projects/[PROJECT_ID]/roles/viewer
stage: DISABLED
title: Role Viewer

在角色被刪除之後, 現存的連結將會保留, 但是是無效的。 角色可以在 7 天內被復原, 要是過了 7 天, 這個角色會進入一個永久刪除程序, 持續 30 天, 所以過了 37 天之後, 這個角色的 ID 又可以被使用了

注意: 如果角色被棄用了, 修改 role.stage 屬性為 DEPRECATED, 然後設定 deprecation_message, 這樣可以讓使用者知道替代角色是哪一個, 或是哪裡可以得到更多資訊




復原自定義角色

在 7 天內, 你可以復原一個刪除了的角色。 被刪除的角色處於 DISABLED 階段, 你可以利用旗標 --stage 來更新它, 讓他再次可用

gcloud iam roles undelete viewer --project $DEVSHELL_PROJECT_ID



恭喜

你已經完成本教程!

使用 Kubernetes 來編排你的雲端 TypeScript 學習筆記

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×