examlab .net 用最有效率的方法,考取最有價值的證照
本篇導覽 約 18 分鐘

服務帳戶管理與強化:保護非人類身分

3,500 字 · 約 18 分鐘閱讀 ·

深入探討 PSE 的服務帳戶安全性。學習管理金鑰、實施冒充 (Impersonation),並使用短期憑證強化非人類身分。

立即做 20 題練習 → 免費 · 不用註冊 · PSE

服務帳戶安全性簡介

GCP 專業雲端安全工程師 (PSE) 的世界中,服務帳戶 (SA) 是最強大也往往是最脆弱的身分。與人類使用者不同,服務帳戶沒有眼睛來識別釣魚連結,也沒有聲音來回報遺失的憑證。它們是自動化的核心動力,如果管理不當,就會成為攻擊者的沈默後門。

強化服務帳戶需要從「靜態憑證」(JSON 金鑰) 轉向「動態身分」(冒充與短期權杖)。本主題涵蓋了非人類身分的生命週期管理、安全性陷阱以及進階強化技術。

白話文解釋

1. 自動駕駛送貨無人機 (服務帳戶)

想像一架自動駕駛的送貨無人機。它沒有飛行員 (人類),而是擁有一套預先編寫的指令和一個數位 ID,告訴倉庫它被允許領取特定的包裹。如果無人機被偷 (遭到入侵),它會繼續執行任務,直到它的 ID 被撤銷。

2. 代客泊車鑰匙 (服務帳戶冒充)

當你把車交給代客泊車員時,你不會給他們可以打開後車廂和手套箱的主鑰匙。你會給他們一把「代客泊車鑰匙」,這把鑰匙只能發動汽車並將其移動到停車場。服務帳戶冒充 (Service Account Impersonation) 就像是車主 (使用者) 暫時使用代客泊車鑰匙的身分來移動車輛,而不是隨身攜帶這把實體鑰匙。

3. 自動銷毀的訊息 (短期憑證)

想像一個關鍵任務密碼,它只在 60 分鐘內有效,然後就會自動更改。即使攻擊者在第 59 分鐘偷走了它,他們也只有 60 秒的存取時間。這就是短期憑證 (Short-lived Credentials) 相對於靜態 JSON 金鑰的力量。

服務帳戶的類型

瞭解帳戶是由誰管理的,對於安全性稽核至關重要。

使用者管理的服務帳戶 (User-Managed Service Accounts)

由你在專案中建立。

  • 命名格式: [email protected]
  • 控制權: 你負責管理金鑰和 IAM 角色。

Google 管理的服務帳戶 (Google-Managed Service Accounts)

由 Google 建立並管理,以便各項服務之間進行互動。

服務帳戶 (Service Account) 是一種特殊的 Google 帳戶,旨在代表需要進行身分驗證並獲得授權以存取 Google API 資料的非人類使用者。

管理與更換服務帳戶金鑰

JSON 金鑰是主要的安全性風險。如果你「必須」使用它們,更換金鑰 (Rotation) 是強制性的。

靜態金鑰的危險

  • 無 MFA: 金鑰會繞過多重身分驗證。
  • 難以追蹤: 一旦下載,你不知道金鑰被存放在哪裡 (GitHub、Slack、本地硬碟)。
  • 無限效期: 預設情況下,金鑰的有效期長達 10 年。

金鑰更換策略

  1. 自動化: 使用 Cloud Functions 每 90 天更換一次金鑰。
  2. 重疊期: 產生新金鑰,更新應用程式,然後在冷卻期過後刪除舊金鑰。

PSE 的建議是完全消除金鑰,轉而使用工作負載身分 (Workload Identity) 或冒充 (Impersonation) 機制。

服務帳戶冒充 (Service Account Impersonation)

冒充機制允許主體 (使用者或另一個服務帳戶) 在不需要金鑰的情況下,以目標服務帳戶的身分執行操作。

運作方式

使用者為服務帳戶請求一個短期的 OAuth 2.0 存取權杖 (Access Token)。

  • 必要權限: iam.serviceAccounts.getAccessToken
  • 角色: roles/iam.serviceAccountTokenCreator

優點

  • 無需金鑰管理: 沒有 JSON 檔案外洩的風險。
  • 可稽核性: 記錄會顯示具體是「誰」請求了權杖來冒充該服務帳戶。

針對地端或多雲工作負載,PSE 情境會優先選擇 Workload Identity Federation 而非下載 JSON 金鑰:外部工作負載提出 OIDC 或 SAML 權杖,GCP Security Token Service (STS) 會將其交換為繫結到 roles/iam.serviceAccountTokenCreator 的短期 OAuth 2.0 存取權杖。搭配 iam.disableServiceAccountKeyCreation 組織政策,便能達成考試始終偏好的無金鑰架構,而非依賴定期更換 JSON 金鑰。

強化服務帳戶權限

嚴格執行最小權限原則 (PoLP)。

常見陷阱

  • 使用預設服務帳戶: 「Compute Engine 預設服務帳戶」預設被授予「編輯者 (Editor)」角色。這是一個巨大的安全性漏洞。
  • 權限過大: 當服務帳戶只需要讀取一個檔案時,卻授予了 roles/storage.admin

最佳實務

  1. 禁用預設服務帳戶: 始終為你的虛擬機器建立自訂服務帳戶。
  2. 授予資源級別的存取權限: 將服務帳戶角色繫結到特定的儲存桶或資料集,而非整個專案。

服務帳戶使用者 vs. 權杖建立者

這兩個角色在 PSE 考試中經常被混淆。

  • 服務帳戶使用者 (roles/iam.serviceAccountUser): 允許使用者將服務帳戶「附加」到資源 (如虛擬機器或 Cloud Function)。它允許他們直接產生權杖。
  • 服務帳戶權杖建立者 (roles/iam.serviceAccountTokenCreator): 允許使用者「冒充」帳戶並產生權杖。這是一個權限極高的角色。

serviceAccountUser 授予開發人員後,他們就可以在虛擬機器上以該服務帳戶的身分執行程式碼,這實際上賦予了他們該服務帳戶的所有權限。

禁用服務帳戶金鑰建立

為了加強安全性,你可以在組織級別阻止使用者建立金鑰。

組織政策限制 (Organization Policy Constraints)

  • iam.disableServiceAccountKeyCreation 防止任何人建立新的 JSON 金鑰。
  • iam.disableServiceAccountKeyUpload 防止使用者將外部金鑰上傳到 Google Cloud。

對所有正式環境專案強制執行這些限制,迫使開發人員使用冒充或工作負載身分機制。

稽核服務帳戶使用情況

誰在使用服務帳戶?

啟用 IAM 的資料存取稽核記錄 (Data Access Audit Logs)。這將記錄每次產生權杖或使用金鑰的操作。

服務帳戶推薦工具 (Service Account Recommender)

與 IAM Recommender 類似,此工具會識別 90 天內未使用的服務帳戶,並建議禁用或刪除它們。

跨專案服務帳戶存取

服務帳戶可以在其建立所在的專案之外獲取角色。

  • 集中化身分管理: 在「安全中心 (Security-Hub)」專案中建立所有服務帳戶,並在「正式環境 (Prod)」專案中授予它們角色。
  • 信任邊界: 請務必小心!「安全中心」專案若遭到入侵,可能會影響所有相關專案。

預設服務帳戶及其風險

Compute Engine 預設服務帳戶

  • 角色: 編輯者 (預設情況下)。
  • 風險: 任何擁有「Compute Instance Admin」權限的使用者都可以建立虛擬機器、附加此服務帳戶,並成為整個專案的編輯者。

App Engine 預設服務帳戶

  • 角色: 編輯者。
  • 強化措施: 切換到權限最小的自訂服務帳戶。

服務帳戶管理的 CLI 指令

建立服務帳戶

gcloud iam service-accounts create my-hardened-sa \
    --display-name="Production Web Server SA"

授予冒充存取權限

gcloud iam service-accounts add-iam-policy-binding \
    [email protected] \
    --member="user:[email protected]" \
    --role="roles/iam.serviceAccountTokenCreator"

列出金鑰 (尋找舊金鑰)

gcloud iam service-accounts keys list \
    [email protected]

iam.serviceAccounts.actAs 權限是 roles/iam.serviceAccountUser 角色的一部分,是在部署使用服務帳戶的資源時所必需的。

PSE 安全性最佳實務

  1. 刪除預設服務帳戶: 如果無法刪除,請撤銷其角色。
  2. 對 GKE 使用工作負載身分: 切勿將 JSON 金鑰掛載到 Pod 中。
  3. 每月稽核: 識別金鑰效期超過 90 天的服務帳戶。
  4. 優先考慮身分而非範圍: 不要依賴「存取範圍 (Access Scopes)」(這是虛擬機器權限的舊方法);請使用 IAM 角色。

故障排除場景

場景:開發人員無法部署 Cloud Function。

診斷: 開發人員擁有 "Cloud Functions Developer" 權限,但在執行階段服務帳戶上缺少 iam.serviceAccounts.actAs 權限。 修正: 為該特定服務帳戶授予開發人員 roles/iam.serviceAccountUser 角色。

場景:在公開的 GitHub 儲存庫中發現了服務帳戶金鑰。

診斷: 帳戶立即遭到入侵。 修正:

  1. 在 Google Cloud 主控台中刪除該金鑰。
  2. 撤銷所有作用中的工作階段。
  3. 稽核過去 24 小時內該服務帳戶執行的所有操作記錄。
  4. 更換該服務帳戶可存取的所有機密資訊 (例如資料庫密碼)。

PSE 考試場景

場景 1:無金鑰架構

「你的公司希望轉向零信任架構,磁碟上不儲存任何靜態憑證。你如何讓地端伺服器通過 BigQuery 的驗證?」 答案: 使用工作負載身分聯合 (Workload Identity Federation),將地端 OIDC/SAML 權杖交換為 Google Cloud 的短期權杖。

場景 2:限制服務帳戶建立

「如何確保整個組織中只有安全團隊可以建立服務帳戶?」 答案: 設定組織政策來限制服務帳戶的建立,並從所有其他使用者中移除 roles/iam.serviceAccountAdmin 角色。

常見問題 (FAQ)

Q1:每個專案最多可以有多少個服務帳戶? A1:預設為 100 個 (可透過配額申請增加)。

Q2:我可以恢復已刪除的服務帳戶金鑰嗎? A2:不行。一旦金鑰被刪除,它就永久消失了。你必須產生一個新的金鑰。

Q3:服務帳戶有密碼嗎? A3:沒有。它使用 RSA 金鑰對 (JSON 金鑰) 或權杖進行身分驗證。

總結檢查清單

  • 列出使用預設服務帳戶的風險。
  • 解釋 服務帳戶使用者權杖建立者 之間的區別。
  • 描述服務帳戶冒充的流程。
  • 識別兩個有助於強化服務帳戶的組織政策。
  • 解釋為什麼短期憑證優於 JSON 金鑰。

官方資料來源

更多 PSE 主題