【GCP 筆記】- IAM 概覽及元件介紹

Posted by MingLun Allen Wu on Sunday, October 6, 2024

TL;DR

在 GCP 中,IAM (Identity and Access Management) 用於管理「誰」(Principal) 能對「某個資源」(Resource) 執行「什麼操作」(Role)。

IAM 透過角色綁定來授予權限,並遵循 GCP 資源的階層繼承關係。依需求選擇 Basic、Predefined 或 Custom Role,並遵守最小權限原則來確保安全性。


Identity and Access Management (IAM)

在 GCP 中,透過 IAM 機制來進行權限管理,避免 GCP 的資源被未經允許的用戶或服務訪問。

在 IAM 中,有三個重要的元件需要了解 :

  1. GCP Principals
  2. GCP Roles
  3. GCP Resources

IAM 的世界就是依靠這三個元件來形成規範 :

「誰 (GCP Principals)」 對於「某個資源 (GCP Resource)」擁有「什麼角色(GCP Role)」


Principal

Principal 在 GCP 的世界中,指的就是「可以造訪 GCP Resource 的主體」,這些主體可以是下列幾種類型 :

  • Google Accounts
  • Service Accounts
  • Google Groups
  • Google Workspace Accounts
  • Cloud Identity Domains
  • allAuthenticatedUsers
  • allUsers
  • Workforce Identity Pool 中的其中一個 Federated Identity。
  • Workload Identity pool 中的其中一個 Federated Identity。
  • GKE 中的 Pod 。

在 GCP 中,這些主體都會有一組 ID 來識別身份,稱為 Principal Identifier,不同類型的格式會稍有不同,可參閱 GCP 文件 - Principal Identifier


GCP Role

在 GCP 的世界中,Permission 定義是否能對特定的 GCP Resource 進行特定的操作。

不論是透過 UI 或是 IaC (例如 Terraform) 操作元件,背後都是透過 API 進行操作,在互動的過程中,皆需要對應的 Permission。

而 API 和所需要的 Permission 通常都是一對一的關係,舉例來說:在呼叫 topics.publish() 失敗,代表目前的 Principal 並沒有 Pubsub.topics.publish() 的 Permission。

而 IAM 在管理 Permission 時,其實並不是直接把 Permission 賦予給特定的 Principal,而是將 Permission 封裝到特定的 “Role” 中,再將 “Role” 賦予給 Principal。綁定 Role 和 Principal 的行為稱為 “Role Binding”。

舉例來說,當我們要給予某個 User 「讀取」的 Permission,並不是直接將 Permission 給予 User,而是將「具有讀取 Permission」的 Role 賦予給該 User。

通常一個 GCP Role 中會包含一至數個不同的 Permission,可以將其劃分為幾種不同的類型 :

  • Basic Role
  • Predefined Role
  • Custom Role

Type 1 - Basic Role

這是 GCP 最基本的 Role,有三種不同的類型 :

  • Owner
  • Editor
  • Viewer

這些基本角色內蘊含了數千條 Google Service 的 Permission,在測試和實驗環境中,可以給予 Principal 此類權限來快速通關,但在正式環境中,並不建議直接使用 Basic Role,而是使用 Predefined Role 或是 Custom Role。

為什麼?

在雲端的世界中,基於安全性的考量,通常會遵循「最小權限原則」(The security principle of least privilege),也就是 : 除了有申請開通的 Permission 外,預設什麼都不能做。

但是當我們將 Basic Role 授予 Principal 時,其中蘊含數以千計的 Permission 將會直接套用至 Principal 上,使得該 Principal 獲得大量 GCP Resource 的 Permission,這樣的行為與「最小權限原則」背道而馳。

Type 2 - Predefined Role

Predefined Role 相較於 Basic Role 來說,進行了更細緻的權限管理。

針對 GCP 的每一種 Resource,都會預先規劃好常見的角色,並在角色內給予適當的 Permission。

在官方文件中提出的範例是 : roles/pubsub.publisherpublisher 類型的角色基本上只會出現在 Pub/Sub 的情境中,針對這個情境的 publisher 會預先劃分所需的 Permission 在其中。

每一種 Resource 所預先劃分的 Predefined Role,可參考: GCP 官方文件 - Predefined Role List

Type 3 - Custom Role

前述兩種類型的 Role 有不同的用途,Basic Role 涵蓋最廣、方便套用,但不適合使用在正式環境。而 Predefined Role 則可以根據 Principal 的目的,選定適合的角色來取得「合適」的權限。

如果上述兩種類型的情境都無法符合需求,例如組織有特定的權限規範時,也可以自行定義 Custom Role 來設定所需的 Permission,達成更細緻的權限管控。


IAM Allow Policy

IAM Allow Policy 具體來說,就是定義了 :

某個 GCP Role 被賦予給哪一個 GCP Principal

當某個 GCP Principal 打算造訪某個 GCP Resource 時,IAM 將會驗證此 Resource 的 IAM Policy,從中確認此 Principal 是否可以進行此操作。

具體來說:IAM Allow Policy 其實就是一系列的 Role Binding,將 1 ~ 多個 GCP Principal 與特定的 GCP Role 綁定,並將這些 IAM Policy 套用在特定的 GCP Resource 上。

IAM Allow Policy Hierachy

GCP Resource 的階層與繼承關係

GCP Resource 之間是有階層關係的 :

  1. “Organization” 會是整體架構中的根節點 (Root)。
  2. “Folder” 可以是 “Organization” 或是 “Folder” 的子元素。
  3. “Project” 可以是 “Organization” 或是 “Folder” 的子元素。
  4. GCP Resource 必須隸屬於某一個 “Project”

掌握階層關係對於權限的配置會有很大的幫助,在設定 IAM Allow Policy 時,可以善用階層間的繼承關係 : 下層資源將會直接繼承上層資源的設定

舉例來說:如果架構上是 :

GCP Resource Hierachy

當我們在 Folder 層級將 Compute Admin Role 給予 User ML 後,在 Project 層級不需要額外設定,User ML 仍然會取得 Compute Admin 的 Role。

在設計 IAM 架構時,較重要、通用性質的 Policy 可以善用繼承機制,設定在較上層的 Resource (例如上圖中的 “Level 1 - Organization”, “Level 2 - Folder”) 。若是較為客製化的設定,則可以定義在較下層的 Resource 層級,管理上會更有彈性。



See Also