本頁說明 Identity and Access Management (IAM) 的條件功能。您可以使用 IAM 條件,依據屬性為 Google Cloud 資源定義並強制執行條件式存取控管機制。
條件和政策類型
您可以在下列位置使用條件:
- 允許政策角色繫結,包括由 Privileged Access Manager 權限管理的角色繫結
- 拒絕政策規則
- 主體存取邊界政策的政策繫結
以下各節說明如何在這些位置使用條件,強制執行以屬性為準的存取控制。
允許政策中的條件
您可以在允許政策中使用條件,選擇只在符合指定條件時授予主體存取權。舉例來說,您可以授予使用者暫時存取權,讓他們解決生產問題,也可以只允許透過公司網路提出要求的員工存取。
條件可在資源的允許政策角色繫結中指定。如果角色繫結設有條件,只有在條件運算式評估為 true
時,角色中的主體才會獲得該角色。
如要為角色繫結新增條件,請定義 condition
欄位:
"bindings": [ { "role": "ROLE", "members": [ "MEMBER_1", "MEMBER_2" ], "condition": { "title": "TITLE", "description": "DESCRIPTION", "expression": "EXPRESSION" } } ]
如要進一步瞭解條件中的欄位,請參閱本頁的「條件結構」。
只有部分資源類型接受角色繫結中的條件。不過,您可以在機構或專案層級授予角色,將條件式存取權授予其他資源類型。
最佳做法是,單一允許政策的條件式角色繫結數量不要超過 100 個。如果您使用大量條件式角色繫結,可能會超過允許政策的整體大小限制。
如要瞭解如何新增、修改及移除條件式角色繫結,請參閱管理條件式角色繫結。
拒絕政策中的條件
您可以在拒絕政策中使用條件,只有在符合特定條件時才套用拒絕規則。舉例來說,只有在主體嘗試存取的資源標記為 prod
環境的一部分時,您才能拒絕權限。
條件是在資源拒絕政策的拒絕規則中指定。如果條件評估結果為 true
或無法評估,系統會套用拒絕規則,主體就無法使用指定的權限。如果條件評估結果為 false
,系統就不會套用拒絕規則,主體就能使用指定的權限 (如有)。
拒絕政策中的條件與允許政策中的條件結構相同,但只會辨識資源標記函式。
如要為拒絕規則新增條件,請定義 denialCondition
欄位:
"rules": [ { "denyRule": { "deniedPrincipals": [ "PRINCIPAL_1", "PRINCIPAL_2" ], "exceptionPrincipals": [ "EXCEPTION_PRINCIPAL_1", "EXCEPTION_PRINCIPAL_2" ], "deniedPermissions": [ "DENIED_PERMISSION_1", "DENIED_PERMISSION_2" ], "denialCondition": { "title": "TITLE", "description": "DESCRIPTION", "expression": "EXPRESSION" } } } ]
如要進一步瞭解條件中的欄位,請參閱本頁的「條件結構」。
如要瞭解如何建立及管理拒絕政策,請參閱「拒絕存取權」。
主體存取邊界政策繫結中的條件
您可以在主體存取邊界政策的政策繫結中使用條件,縮小主體存取邊界政策的適用主體範圍。舉例來說,您只能對服務帳戶強制執行政策,或是將 [email protected]
排除在政策之外。
條件是在每個政策繫結中指定。如果政策繫結有條件,則只有在條件評估為 true
時,才會強制執行政策繫結中的政策。
如要在政策繫結中新增條件,請在政策繫結中定義 condition
欄位:
{ "displayName": "DISPLAY_NAME", "target": { "principalSet": "PRINCIPAL_SET" }, "policyKind": "PRINCIPAL_ACCESS_BOUNDARY", "policy": "PAB_POLICY", "condition": { "title": "TITLE", "description": "DESCRIPTION", "expression": "EXPRESSION" } }
如要進一步瞭解條件中的欄位,請參閱本頁的「條件結構」。
如要瞭解如何為主體存取邊界政策建立政策繫結,請參閱「將主體存取邊界政策套用至主體集」。
條件結構
condition
物件的結構如下:
"condition": { "title": ..., "description": ..., "expression": ... }
條件的 title
為必填,但 description
為選填。標題和說明都是純資訊欄位,可協助您識別及說明條件。
expression
欄位為必填欄位。這個欄位會使用部分一般運算語言 (CEL),定義以屬性為基礎的邏輯運算式。條件運算式可包含多個陳述式,每個陳述式都會評估一個屬性。陳述式會按照 CEL 語言規格,使用邏輯運算子合併。
條件的 CEL
一般運算語言 (CEL) 是用來在 IAM Conditions 中指定運算式的運算式語言。專門用於表示以屬性為基礎的邏輯運算式。詳情請參閱 CEL 規格與相關語言定義說明頁面。
在 IAM 條件中,系統會使用 CEL 的子集,根據屬性資料做出布林授權決策。一般來說,條件運算式是由一或多個陳述式組成,並以邏輯運算子 (&&
、||
或 !
) 聯結。
IAM 條件中的條件會使用下列 CEL 功能:
- 變數:條件會使用變數表示特定屬性,例如
request.time
(類型為時間戳記) 或resource.name
(類型為字串)。這些變數會根據執行階段的內容填入值。 - 運算子:每種資料類型 (例如 Timestamp 或 String) 都支援一組運算子,可用於建立邏輯運算式。最常見的用法是使用運算子比較變數中包含的值與常值,例如
resource.service == 'compute.googleapis.com'
。在本例中,如果resource.service
的輸入值為compute.googleapis.com
,則運算式會評估為true
。 - 函式:函式是資料類型的複合運算子,支援更複雜的運算。在條件運算式中,您可以搭配特定資料類型使用預先定義的函式。舉例來說,
request.path.startsWith('/finance')
會使用字串前置字元比對函式,如果request.path
的值包含相符的前置字元 (例如/finance
),則評估結果為true
。 - 邏輯運算子:條件支援三種邏輯運算子,可用於從基本運算式陳述式建構複雜的邏輯運算式:
&&
、||
和!
。這些邏輯運算子可讓您在條件運算式中使用多個輸入變數。舉例來說:request.time.getFullYear() < 2020 && resource.service == 'compute.googleapis.com'
會結合兩個基本陳述式,且必須同時滿足這兩個陳述式,才能產生true
整體評估結果。
如要進一步瞭解支援的變數、運算子和函式,請參閱屬性參考資料。
條件屬性
條件屬性是以要求資源為依據 (例如其類型或名稱),或是以要求詳細資料為依據 (例如其時間戳記或目的地 IP 位址)。
您可以在條件運算式中使用的條件屬性,取決於您要為哪個政策類型編寫條件。如需條件屬性的完整清單,以及各政策類型支援的屬性相關資訊,請參閱屬性參考資料。
以下各節將舉例說明可在條件中使用的部分屬性。
資源屬性
您可以使用資源屬性編寫條件,評估存取要求中的資源。您可以評估的屬性包括:
- 資源類型
- 資源名稱
- 使用的 Google Cloud 服務
- 附加至資源的標記
您可以在允許政策角色繫結中使用任何這些屬性。此外,您可以在拒絕政策的拒絕規則中使用資源標記屬性。
如需完整的資源屬性清單,請參閱資源屬性參考資料。
如要瞭解如何使用資源屬性設定以資源為基礎的存取權,請參閱「設定以資源為基礎的存取權」。
運算式範例
在角色繫結中,下列條件運算式允許存取 Compute Engine VM 執行個體,但不允許存取其他類型的資源:
resource.type == 'compute.googleapis.com/Instance'
在角色繫結中,下列條件運算式允許存取 Cloud Storage 資源,但不允許存取其他服務的資源:
resource.service == 'storage.googleapis.com'
在角色繫結中,下列條件運算式只允許存取特定 bucket 內的 Cloud Storage 物件:
resource.type == 'storage.googleapis.com/Object' &&
resource.name.startsWith('projects/_/buckets/exampleco-site-assets/')
在拒絕規則中,下列條件運算式會拒絕存取具有 env: prod
標記的Google Cloud 資源:
resource.matchTag('123456789012/env', 'prod')
主要屬性
您可以使用主體屬性,根據發出要求的主體編寫條件。可評估的屬性包括:
- 要求中的主體類型
- 要求中主體的 ID
您可以在主體存取邊界政策的政策繫結中使用這些屬性。
詳情請參閱條件屬性參考資料。
運算式範例
在主體存取邊界政策繫結中,下列條件運算式可確保繫結中的政策只會對服務帳戶強制執行:
principal.type == 'iam.googleapis.com/ServiceAccount'
在主體存取邊界政策繫結中,下列條件運算式可確保繫結中的政策不會針對 [email protected]
強制執行:
principal.subject != '[email protected]'
要求屬性
您可以使用要求屬性編寫條件,評估要求的詳細資料,例如:
- 存取層級
- 日期和時間
- 目的地 IP 位址和通訊埠 (適用於 IAP TCP 通道)
- 預期的網址主機或路徑 (適用於 IAP)
您可以在允許政策角色繫結中使用這些屬性。
存取層級運算式範例 (僅適用於 IAP)
在下列範例中,貴機構定義了存取層級 CorpNet
,限制只有在流量進出公司網路的 IP 位址範圍內,才能存取資源。接著,您將下列條件運算式新增至角色繫結,只有在要求符合 CorpNet
存取層級時,才允許存取:
'accessPolicies/199923665455/accessLevels/CorpNet' in
request.auth.access_levels
貴機構會根據要求的屬性 (如原始 IP 位址、裝置屬性及時段等) 定義存取層級。詳情請參閱 Access Context Manager 說明文件。
API 屬性運算式範例
在具有 iam.projects.setIamPolicy
權限的角色繫結中,下列條件運算式可讓使用者在專案中授予及撤銷「帳單帳戶管理員」(roles/billing.admin
) 角色:
api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', [])
.hasOnly(['roles/billing.admin'])
如要進一步瞭解如何使用 API 屬性限制角色授予作業,請參閱「設定角色授予作業的限制」。
日期/時間運算式範例
在角色繫結中,下列條件運算式允許存取權,直到 2021 年 1 月 1 日午夜為止:
request.time < timestamp('2021-01-01T00:00:00Z')
在角色繫結中,下列條件運算式只允許在德國柏林時區的指定工作時間內存取:
request.time.getHours('Europe/Berlin') >= 9 &&
request.time.getHours('Europe/Berlin') <= 17 &&
// Days of the week range from 0 to 6, where 0 == Sunday and 6 == Saturday.
request.time.getDayOfWeek('Europe/Berlin') >= 1 &&
request.time.getDayOfWeek('Europe/Berlin') <= '
在角色繫結中,下列條件運算式只允許在 2020 年 6 月存取 (以德國柏林時區為準):
request.time.getFullYear('Europe/Berlin') == 2020
request.time.getMonth('Europe/Berlin') < 6
如要指定時間戳記,請使用 RFC 3339 格式。如要指定時區,請使用 IANA 時區資料庫中的 ID。
如要進一步瞭解日期/時間運算式,請參閱 CEL 規格。
如要瞭解如何使用日期/時間運算式設定臨時存取權,請參閱「設定臨時存取權」一文。
目的地 IP 和通訊埠運算式範例 (適用於 IAP TCP 通道)
在角色繫結中,下列條件運算式可允許存取內部目的地 IP 位址或通訊埠編號:
destination.ip == '14.0.0.1'
destination.ip != '127.0.0.1'
destination.port == 22
destination.port > 21 && destination.port <= 23
轉送規則運算式範例
在角色繫結中,如果要求不是建立轉送規則,或是要求是為內部 Google Cloud 負載平衡器建立轉送規則,以下條件運算式會允許主體存取:
!compute.isForwardingRuleCreationOperation() || (
compute.isForwardingRuleCreationOperation() &&
compute.matchLoadBalancingSchemes([
'INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'
])
)
如要瞭解負載平衡配置的詳細資料,請參閱在負載平衡器上使用 IAM 條件 Google Cloud 。
網址主機或路徑運算式範例 (適用於 IAP)
在角色繫結中,下列條件運算式只允許存取要求中的特定子網域或網址路徑:
request.host == 'hr.example.com'
request.host.endsWith('.example.com')
request.path == '/admin/payroll.js'
request.path.startsWith('/admin')
含有不同類型屬性的運算式範例
在角色繫結中,如果要求是在特定時段發出、符合資源名稱前置字串、具有所選存取層級,並且是針對特定資源類型,則下列條件運算式允許存取:
request.time > timestamp('2018-08-03T16:00:00-07:00') &&
request.time < timestamp('2018-08-03T16:05:00-07:00') &&
((resource.name.startsWith('projects/project-123/zones/us-east1-b/instances/dev') ||
(resource.name.startsWith('projects/project-123/zones/us-east1-b/instances/prod') &&
'accessPolicies/34569256/accessLevels/CorpNet' in request.auth.access_levels)) ||
resource.type != 'compute.googleapis.com/Instance')
後續步驟
- 取得可用於管理存取權的條件屬性詳細資料。
- 進一步瞭解允許政策。
- 找出接受條件式角色繫結的資源類型。