針對政策和角色繫結的「withcond」進行疑難排解

查看允許政策時,您可能會看到角色名稱包含 withcond 字串,後面接著雜湊值。舉例來說,您可能會看到 roles/iam.serviceAccountAdmin_withcond_2b17cc25d2cd9e2c54d8 這類角色名稱。

本頁面說明在允許政策中看到 withcond 字串的時機和原因。如果看到這個字串,系統也會建議您採取哪些行動。

政策版本和條件式角色繫結

允許政策可以採用多種形式。每個表單都稱為「允許政策版本」

在使用版本 1 的允許政策中,部分角色繫結可能會在角色名稱中包含 withcond 字串,後面接著雜湊值:

{
  "bindings": [
    {
      "members": [
        "principal://iam.googleapis.com/locations/global/workforcePools/example-pool/subject/dana@example.com"
      ],
      "role": "roles/iam.serviceAccountAdmin_withcond_2b17cc25d2cd9e2c54d8"
    }
  ],
  "etag": "BwUjMhCsNvY=",
  "version": 1
}

這個格式表示角色繫結是有條件的。換句話說,只有在符合特定條件時,系統才會授予角色。

1 版允許政策不會顯示這些條件。如果看到字串 withcond 和雜湊值,表示角色繫結包含您無法查看的條件。

解決方案:指定政策版本 3

為確保您能查看及更新整個允許政策 (包括政策條件),在取得或設定允許政策時,請務必指定版本 3。如要指定版本 3,請完成下列各節的任務。

更新 gcloud 工具

如果您使用 Google Cloud CLI,請執行 gcloud version 來檢查版本號碼。輸出內容會包含類似 Google Cloud CLI 279.0.0 的字串。

如果版本號碼小於 263.0.0,請執行 gcloud components update 更新 gcloud CLI。在 263.0.0 以上版本中,gcloud CLI 會自動指定支援條件的允許政策版本。

更新用戶端程式庫

如果應用程式使用用戶端程式庫,請按照下列步驟操作:

  1. 找出用戶端程式庫的名稱和版本號碼,然後查看支援允許政策版本的用戶端程式庫清單。

    • 如果您已使用最新版本的用戶端程式庫,且該程式庫支援允許政策版本,則不必更新用戶端程式庫。繼續執行下一步。

    • 如果您使用舊版用戶端程式庫,且較新版本支援允許政策版本,請將用戶端程式庫更新至最新版本。

    • 如果您使用的用戶端程式庫不支援允許政策版本,可以將支援允許政策版本的其他用戶端程式庫新增至應用程式。使用該用戶端程式庫處理允許政策。 或者,您也可以直接使用 IAM REST API

  2. 更新應用程式中取得及設定允許政策的所有程式碼:

    • 收到允許政策時,請務必在要求中指定版本 3
    • 設定允許政策時,請一律將允許政策的 version 欄位設為 3,並在要求中加入 etag 欄位

更新 REST API 呼叫

如果應用程式直接使用 IAM REST API,請更新所有取得及設定允許政策的程式碼:

  • 收到允許政策時,請務必在要求中指定版本 3
  • 設定允許政策時,請一律將允許政策的 version 欄位設為 3,並在要求中加入 etag 欄位

政策更新管理工具

如果您保留允許政策的本機副本 (例如將副本儲存在版本控制系統中,並視為程式碼),請確保使用的所有工具符合下列條件:

  • 所有取得或設定允許政策的要求都會指定版本 3
  • 所有設定允許政策的要求都會在要求中包含 etag 欄位

如果工具不符合這些條件,請檢查是否有更新版本。

此外,請確認管理工具會保留有條件的角色授予項目,而不是新增不含條件的重複角色授予項目。舉例來說,請參考以下情境:

  1. 您在資料夾 my-folder 上,將「建立服務帳戶」角色 (roles/iam.serviceAccountCreator) 授予使用者 Mahan。資料夾的允許政策類似以下範例:

    {
      "bindings": [
        {
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/example-pool/subject/mahan@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator"
        }
      ],
      "etag": "BuFmmMhCsNY=",
      "version": 1
    }
  2. 您可以使用工具擷取允許政策,並將其儲存在版本控制系統中。

  3. 您新增條件,讓 Mahan 只能在德國柏林的正常工作週期間建立服務帳戶。更新後的允許政策會類似以下範例:

    {
      "bindings": [
        {
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/example-pool/subject/mahan@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator",
          "condition": {
            "title": "work_week_only",
            "expression": "request.time.getDayOfWeek('Europe/Berlin') >= 1 && request.time.getDayOfWeek('Europe/Berlin') <= 5"
          }
        }
      ],
      "etag": "BwWcR/B3tNk=",
      "version": 3
    }
  4. 您可以使用工具擷取更新後的允許政策。這項工具要求允許政策時,不會指定允許政策版本,因此您會收到 1 版本的允許政策,且角色名稱已修改:

    {
      "bindings": [
        {
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/example-pool/subject/mahan@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator_withcond_a75dc089e6fa084bd379"
        }
      ],
      "etag": "BwWcR/B3tNk=",
      "version": 1
    }

此時,管理工具可能會判斷 Mahan 與角色 roles/iam.serviceAccountCreator 的繫結已消失,因此應將原始角色繫結還原至允許政策:

避免:沒有條件的其他角色繫結

{
  "bindings": [
    {
      "members": [
        "principal://iam.googleapis.com/locations/global/workforcePools/example-pool/subject/mahan@example.com"
      ],
      "role": "roles/iam.serviceAccountCreator_withcond_a75dc089e6fa084bd379"
    },
    {
      "members": [
        "principal://iam.googleapis.com/locations/global/workforcePools/example-pool/subject/mahan@example.com"
      ],
      "role": "roles/iam.serviceAccountCreator"
    }
  ],
  "etag": "BwWd3HjhKxE=",
  "version": 1
}

這項變更不正確。無論星期幾,都會將 roles/iam.serviceAccountCreator 角色授予 Mahan。因此,第一個角色繫結中的條件不會生效。

如果管理工具嘗試進行這類變更,請勿核准變更。您必須更新管理工具,在要求中指定版本 3

後續步驟