IAM 條件與政策智慧簡介
對於 GCP 專業雲端安全工程師 (PSE) 來說,靜態的 IAM 角色往往不足以滿足需求。業務需求通常需要「有條件的」存取,例如:「Alice 可以擔任儲存管理員,但『僅限』她從公司 IP 連線時、『僅限』在辦公時間內,且『僅限』針對標記為『臨時 (temporary)』的儲存桶。」
IAM 條件 (IAM Conditions) 透過使用通用運算式語言 (CEL) 提供這種精細且具備內容感知能力的控制。與此相輔相成的是政策智慧 (Policy Intelligence) 套件——這是一組由人工智慧驅動的工具,可協助你在實施複雜的存取政策之前對其進行分析、模擬和疑難排解,以防止安全性漏洞或營運中斷。
白話文解釋
1. 大夜班保全 (IAM 條件)
想像一名保全,他手裡有一份授權進入的名單。然而,保全還有一套規則:「晚上 10 點後禁止進入」以及「如果有人佩戴紅色徽章,他們只能去地下室」。保全會檢查人員的身分 (Identity) 「以及」當時的情境 (時間、徽章顏色)。這正是 IAM 條件的運作方式。
2. 飛行模擬器 (政策模擬器)
飛行員在駕駛新型波音 747 之前,會先在模擬器中練習。如果在模擬器中墜機,不會有人受傷。政策模擬器 (Policy Simulator) 讓你能夠針對真實的歷史存取記錄「演練」你的新 IAM 政策。如果模擬器顯示你的新政策在昨天會阻止 50 名合法的開發人員存取,你可以在「墜毀」正式環境之前修正它。
3. X 光機 (政策分析器)
當醫生想查看體內的骨頭是否斷裂時,他們會使用 X 光。政策分析器 (Policy Analyzer) 就是你整個 Google Cloud 組織的 X 光機。它可以看穿層層的資料夾、專案和群組成員身份,回答關鍵問題:「到底『誰』真正擁有這個敏感資料集的存取權限?」
IAM 條件中的屬性定義
IAM 條件會評估要求 (Request)、資源 (Resource) 和環境 (Environment) 的屬性。
1. 時間屬性 (Temporal Attributes)
將存取權限限制在特定的時間窗口內。
request.time:要求發出的當前時間。- 使用場景: 僅在值班期間授予「值班 (On-Call)」工程師存取權限。
2. 資源屬性
根據資源的名稱、類型或服務限制存取。
resource.name:資源的完整路徑。resource.service:例如storage.googleapis.com。resource.type:例如storage.googleapis.com/Bucket。
3. 資源標記 (Resource Tags)
一種現代化的大規模管理存取範圍的方法。與標籤 (Labels) 不同,標記 (Tags) 是在組織/資料夾級別管理的,且安全性極高。
resource.matchTag():檢查資源是否具有特定的標記。
IAM 條件 (IAM Conditions) 是你新增到角色繫結 (Role Bindings) 中的邏輯運算式。當發出要求時,Google Cloud 會評估該條件;如果結果為真 (True),則授予存取權限。
通用運算式語言 (CEL) 語法
CEL 是一種快速、可移植且安全的運算式語言,廣泛應用於 Google Cloud。
基本 CEL 語法
- 邏輯運算子:
&&(且)、||(或)、!(非)。 - 比較:
==、!=、<、>。 - 字串函式:
startsWith()、endsWith()、contains()。
CEL 運算式範例
request.time < timestamp("2026-01-01T00:00:00Z") &&
resource.matchTag("123456789/env", "prod")
翻譯:僅在 2026 年之前且資源被標記為 'prod' 時才授予存取權限。
政策疑難排解工具 (Policy Troubleshooter)
當使用者抱怨「我有角色但收到權限被拒絕 (Permission Denied)」時,政策疑難排解工具是你的首選。
- 分析: 它會檢查階層中所有的「允許政策」和「拒絕政策」。
- 清晰度: 它會明確告訴你哪一個繫結授予了存取權限,以及哪一個條件 (或拒絕政策) 阻止了存取。
政策疑難排解工具只能分析「呼叫者」擁有可見權限的政策。如果你沒有組織級別的檢視權限,專案管理員就無法排解從組織級別繼承的政策問題。
政策分析器 (Policy Analyzer):深層可見性
政策分析器 協助你在複雜的結構中尋找「誰擁有什麼的存取權限」。
- 群組展開: 它會自動展開 Google 群組,顯示個別成員。
- 繼承解析: 它會考慮在組織、資料夾和專案級別授予的角色。
- 匯出: 結果可以匯出到 BigQuery,以便進行長期的合規性報告。
使用政策分析器來找出所有擁有存取公司資源權限的外部使用者 (例如 @gmail.com)。
政策模擬器 (Policy Simulator):安全第一
政策模擬器 允許你在套用 IAM 政策變更之前先進行測試。
- 重播 (Replay): 它會針對「建議的」政策「重播」過去 90 天的存取記錄。
- 影響評估: 它會列出哪些原本被允許的要求現在會被拒絕,反之亦然。
對於以公司 IP 限制存取的 PSE 場景,正確的屬性是 request.auth.access_levels,這需要搭配 Access Context Manager 的 Access Level(最好再加上 VPC Service Controls)——在 CEL 裡直接寫 origin.ip 並非 IAM 條件支援的屬性。同時為角色繫結加上清楚的標題(例如 Contractor_Access_Limit),方便日後稽核追蹤。
根據標記 (Tags) 設定存取範圍
資源標記 (Resource Tags) 是 PSE 大規模管理存取的首選方式。
- 標記 (Tags) vs. 標籤 (Labels): 標籤用於計費/組織管理;標記用於安全性/IAM。
- 繼承: 標記可以沿著資源階層向下繼承。
- 強制執行: 你可以在 IAM 條件中使用標記來建立「安全區域」。
基於 IP 的存取限制
你可以使用 IAM 條件將存取限制在特定的 IP 範圍內。
- 屬性:
request.auth.access_levels。 - 注意: 這需要 Access Context Manager 和 VPC 服務控制 (VPC Service Controls) 才能完整實施。
用於安全性邏輯的進階 CEL 函式
request.auth.claims: 檢查使用者身分的屬性 (例如:「使用者的電子郵件是否已驗證?」)。resource.matchTagId(): 使用標記的唯一永久 ID 而非顯示名稱進行比對 (安全性更高)。
在資料夾間管理複雜的 IAM 條件
隨著政策變得複雜,管理難度也會增加。
- 邏輯集中化: 在資料夾級別使用資源標記,以簡化專案級別的條件。
- 限制嵌套: 避免在 CEL 中使用深層的
if/else邏輯,以保持可讀性。 - 定期稽核: 使用政策分析器來確保「臨時」存取權限確實已經過期。
政策智慧的 CLI 指令
執行政策分析
gcloud iam experts analyze-policy \
--organization="123456789" \
--identity="user:[email protected]"
透過 CEL 測試 IAM 條件
(CEL 通常在角色繫結期間透過 JSON/YAML 檔案傳遞):
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="user:[email protected]" \
--role="roles/viewer" \
--condition="expression=request.time < timestamp('2026-01-01T00:00:00Z'),title=Expires_2026"
政策模擬器 (Policy Simulator) 使用歷史資料來預測未來政策變更的影響。
政策分析器 (Policy Analyzer) 只回答「誰擁有 Allow 繫結」,並不會完整解析 拒絕政策 (Deny Policies) 或 組織政策限制 (Organization Policy Constraints)——所以使用者在 Analyzer 看起來有權限,實際呼叫時仍可能收到 Permission Denied。出現這種落差時,改用 政策疑難排解工具 (Policy Troubleshooter),它會評估包含拒絕規則在內的有效政策。另外請記得 Troubleshooter 只能看到「呼叫者」自身有可見權限的部分,務必以具備組織層級檢視權限的身分執行。
PSE 安全性最佳實務
- 始終使用標題與說明: 每個 IAM 條件都必須有清晰的標題 (例如 "Contractor_Access_Limit")。
- 先模擬再套用: 絕對不要在未執行模擬的情況下更改正式環境的組織級別政策。
- 使用標記進行環境隔離: 將資源標記為
env:prod或env:dev,並使用 IAM 條件來防止交叉污染。 - 監控 CEL 效能: 極其複雜的 CEL 運算式理論上可能會增加 API 要求的延遲。
故障排除場景
場景:時間限制條件未按預期運作。
診斷: CEL 的 timestamp() 使用 UTC。如果管理員是以當地時間思考,則時間窗口可能會發生偏移。
修正: 驗證時間戳記格式,並確保其符合 UTC 的 ISO 8601 標準。
場景:政策分析器顯示使用者擁有存取權,但他們仍被拒絕。
診斷: 政策分析器可能未考慮到拒絕政策 (Deny Policies) 或組織政策限制 (Organization Policy Constraints)。 修正: 執行政策疑難排解工具,它會評估包含拒絕規則在內的完整「有效」政策。
PSE 考試場景
場景 1:地端 IP 限制
「如何確保開發人員只能從公司 VPN IP 範圍存取 Cloud Console?」
答案: 使用具有 request.auth.access_levels 屬性的 IAM 條件,或實施 身分識別感知代理伺服器 (IAP)。
場景 2:保護敏感標記
「如何防止專案所有者從資源中移除『高安全性』標記,以繞過 IAM 條件?」
答案: 使用組織政策來限制誰可以管理標記,並確保只有中央安全團隊擁有 roles/resourcemanager.tagAdmin 角色。
常見問題 (FAQ)
Q1:IAM 中 CEL 運算式的最大長度是多少? A1:2,000 個字元。
Q2:我可以在自訂角色中使用 IAM 條件嗎? A2:可以,IAM 條件適用於基礎角色、預定義角色和自訂角色。
Q3:政策模擬器需要付費嗎? A3:政策模擬器是 Security Command Center (SCC) Premium 層級的一部分,或者在標準層級中具有特定的配額限制。
總結檢查清單
- 編寫一個基於時間存取規則的 CEL 運算式。
- 解釋政策分析器與政策疑難排解工具之間的區別。
- 描述政策模擬器中的「重播」機制。
- 列出三個可用於 IAM 條件的屬性。
- 解釋為什麼資源標記在安全性方面優於標籤。