本頁說明如何搭配使用標記和 Identity and Access Management (IAM),控管 Google Cloud 資源的存取權。
如要進一步瞭解代碼,請參閱「代碼總覽」。
標記總覽
標記是附加至Google Cloud 資源的鍵/值組合。您可以根據資源是否具備特定標記,有條件地授予 IAM 角色或有條件地拒絕 IAM 權限。
資源會繼承上層機構、資料夾和專案的標記值。因此,您可以使用標記管理任何Google Cloud 資源的存取權。
以下是使用標記管理存取權的一些常見用途:
- 開發、測試和實際工作環境。舉例來說,您可以在開發環境中加入
environment: dev
標記,在正式環境中加入environment: prod
標記。 - 元件類型。舉例來說,您可以為前端資源新增
component: frontend
標記,並為批次處理資源新增component: batch
標記。 - 專案名稱。舉例來說,如果團隊正在處理代號為「Atlas」的專案,您可以將
project: atlas
標記新增至團隊的開發資源。
標記定義和 ID
將標記附加至資源前,您必須定義標記的鍵,以及標記允許的值。您可以在機構或專案層級建立這些定義。您可以使用資源管理工具管理代碼定義。詳情請參閱「建立及定義新代碼」。
每個標記鍵和值都有幾種不同的 ID:
-
永久 ID:全域不重複,且不得重複使用。舉例來說,標記鍵可能具有永久 ID
tagKeys/123456789012
,標記值可能具有永久 IDtagValues/567890123456
。 -
簡稱。每個鍵的簡稱在定義鍵的專案或機構中不得重複,且每個值的簡稱在相關聯的鍵中不得重複。舉例來說,標記鍵的簡稱可以是
env
,標記值的簡稱可以是prod
。 -
命名空間名稱:將機構的數字 ID 或專案 ID 新增至標記鍵的簡稱。舉例來說,為機構建立的標記鍵可能具有
123456789012/env
這個命名空間名稱。如要瞭解如何取得機構 ID,請參閱「取得機構資源 ID」。為專案建立的標記鍵可能具有命名空間名稱myproject/env
。如要瞭解如何取得專案 ID,請參閱「識別專案」。
如本頁所述,將標記附加至資源後,您就可以根據標記編寫條件來授予存取權。如要編寫條件,您必須選擇要在條件中使用哪種識別碼。請按照下列規範選擇:
- 如要實驗標記,請考慮使用命名空間限定名稱 (適用於鍵) 和簡稱 (適用於值)。這些 ID 較容易理解和記憶,特別適合新手。
如果您以宣告方式管理設定 (例如使用 Terraform 這類工具),請考慮使用命名空間名稱 (適用於鍵) 和簡短名稱 (適用於值)。您可以重複使用這些 ID,也就是說,宣告式工具可以刪除並重新建立這些 ID,而您的條件仍可繼續運作。
這種做法有其缺點:假設您刪除標記鍵或值,然後建立名稱相同但意義不同的新鍵或值。如果條件是指命名空間名稱或簡稱,則條件會繼續套用至新鍵或值。
在某些情況下,主體可能會因此取得您不希望他們擁有的存取權。
為盡量降低風險,建議使用永久 ID,這類 ID 絕不會重複使用。
以下說明永久 ID 如何協助降低風險:假設您刪除代碼鍵或值,然後建立名稱相同但意義不同的新鍵或值。如果條件是指永久 ID,則條件不適用於新鍵或值。因此,主體較不可能取得您不希望他們擁有的存取權。
缺點是,如果您刪除並重新建立鍵和值,且想保留主體的存取權,就必須更新允許政策,以參照新的永久 ID。
存取已加上標記的資源
您可以使用 IAM 條件搭配標記,根據資源附加或沿用的標記,有條件地授予角色。如果條件評估結果為 true
,系統就會授予存取權;否則不會授予存取權。詳情請參閱 IAM 條件總覽。
Google Cloud 主控台的某些區域無法辨識具有標記條件的允許政策角色繫結。因此,如果您擁有附有標記條件的角色, Google Cloud 控制台可能會錯誤地禁止您執行特定動作。如果遇到這個問題,請使用其他方法 (例如 gcloud CLI) 執行動作。
下列各節顯示條件運算式的範例,這些運算式會檢查資源上的標記。視檢查永久 ID 或簡短名稱而定,條件會呼叫不同的函式。如要進一步瞭解這些功能,請參閱「資源標記」。
使用永久 ID 的條件
這項條件會授予具有 tagKeys/123456789012: tagValues/567890123456
標記的資源角色:
resource.matchTagId('tagKeys/123456789012', 'tagValues/567890123456')
這項條件會授予具有任何標記 (含鍵 tagKeys/123456789012
) 的資源角色,不論標記值為何:
resource.hasTagKeyId('tagKeys/123456789012')
這項條件會授予同時具有 tagKeys/123456789012: tagValues/567890123456
標記和使用 tagKeys/987654321098
鍵的任何標記的資源角色:
resource.matchTagId('tagKeys/123456789012', 'tagValues/567890123456') &&
resource.hasTagKeyId('tagKeys/987654321098')
使用命名空間名稱和簡稱的條件
這項條件會授予含有 env: prod
標記的資源角色,表示資源位於實際工作環境:
resource.matchTag('123456789012/env', 'prod')
這項條件會授予角色給具有任何標記 (鍵為 env
) 的資源,不論標記值為何:
resource.hasTagKey('123456789012/env')
這項條件會對同時具有 env: prod
標記和使用 project
鍵的任何標記的資源,授予角色:
resource.matchTag('123456789012/env', 'prod') &&
resource.hasTagKey('123456789012/project')
後續步驟
- 瞭解如何管理標記,以及將標記附加至資源。
- 進一步瞭解在條件中檢查標記。