IAM 條件總覽

本頁說明 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"
    }
  }
]
如果您使用 Privileged Access Manager 授權,也可以在該授權的角色中新增條件。使用者成功要求該權利的授權後,系統就會授予符合指定條件的角色。

如要進一步瞭解條件中的欄位,請參閱本頁的「條件結構」。

只有部分資源類型接受角色繫結中的條件。不過,您可以在機構或專案層級授予角色,將條件式存取權授予其他資源類型

最佳做法是,單一允許政策的條件式角色繫結數量不要超過 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')

後續步驟