使用 Policy Simulator 測試角色變更

本頁說明如何使用 Policy Simulator,模擬 IAM 允許政策的變更。此外,本文也會說明如何解讀模擬結果,以及如何套用模擬的允許政策 (如果選擇這麼做)。

這項功能只會根據允許政策評估存取權。

如要瞭解如何模擬其他類型政策的變更,請參閱下列文章:

事前準備

所需權限

模擬變更允許政策前,請務必確認您具備適當的權限。執行模擬需要特定權限,其他權限則非必要,但有助於取得最完整的模擬結果。

如要進一步瞭解 Identity and Access Management (IAM) 角色,請參閱「瞭解角色」一文。

目標資源的必要權限

模擬的目標資源是您要模擬允許政策的資源。

如要取得執行模擬所需的權限,請要求管理員在目標資源上授予下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這些預先定義的角色具備執行模擬所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:

所需權限

如要執行模擬,必須具備下列權限:

  • cloudasset.assets.searchAllResources
  • policysimulator.replays.run
  • ,其中 resource 是目標資源的資源類型,service 是擁有該資源的 Google Cloud 服務名稱。 service.resource.getIamPolicy

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

必要主機資源權限

模擬作業的主機資源是建立及執行模擬作業的專案、資料夾或機構。主機資源不必與目標資源有任何關聯。

設定主機資源的方式取決於您使用的平台。

主控台

主機資源是指資源選取器中顯示的專案、資料夾或機構。

如要變更主機資源,請在資源選取器中選擇其他專案、資料夾或機構。

gcloud

主機資源是目前的配額專案。如要設定配額專案,請使用 gcloud auth application-default set-quota-project 指令。

REST

每次傳送要求時,您都必須手動指定主機資源。詳情請參閱本頁的「模擬政策變更」。

如要取得執行模擬作業所需的權限,請要求管理員為您授予主機資源的模擬工具管理員 (roles/policysimulator.admin) 身分與存取權管理角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這個預先定義的角色具備執行模擬作業所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:

所需權限

如要執行模擬,必須具備下列權限:

  • policysimulator.replayResults.list
  • policysimulator.replays.create
  • policysimulator.replays.get

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

如要從模擬作業取得最完整的結果,建議您具備特定 IAM 和 Google Workspace 權限。如果您沒有部分或全部權限,仍可執行模擬。不過,如果沒有這些權限就執行模擬作業,可能會導致不明存取權變更次數增加,因為您可能無法擷取會影響模擬結果的資訊。

執行模擬時,建議您為貴機構指派安全性審查員角色 (roles/iam.securityReviewer)。或者,如果您已具備安全管理員角色 (roles/iam.securityAdmin),則不需獲派任何其他角色。

這些角色會授予下列權限,協助您從模擬中取得最完整的結果:

  • 在定義自訂角色的任何相關專案、資料夾或機構中,按一下 iam.roles.getiam.roles.list。如果專案、資料夾或機構是您要模擬允許政策的資源的祖項或子項,則該專案、資料夾或機構就與該資源相關。
  • service.resource.getIamPolicy,其中 resource 是可套用允許政策的資源類型名稱,service 則是擁有該資源的Google Cloud 服務名稱。

    執行模擬時,建議您對符合下列條件的每個資源都擁有這項權限:

    • Policy Simulator 支援該資源
    • 資源有允許政策,可能會影響使用者的存取權。如果符合下列任一條件,即為擁有者:

      • 資源是您要模擬允許政策的資源後代,且會顯示在相關存取記錄中。
      • 資源是您要模擬允許政策的資源的祖先。

    舉例來說,假設您想模擬專案的允許政策。如果存取記錄包含專案中 Cloud Storage 值區的存取嘗試,您需要該值區的 storage.buckets.getIamPolicy 權限。如果專案的上層資料夾設有允許政策,您也需要該資料夾的 resourcemanager.folders.getIamPolicy 權限。

建議您在原始允許政策和建議的允許政策中,都具備擷取每個 Google 群組成員資訊的權限。

Google Workspace 超級管理員和群組管理員通常可以檢視群組成員。如果您不是超級管理員或群組管理員,請要求 Google Workspace 管理員建立自訂的 Google Workspace 管理員角色,這個角色包含 groups.read 權限 (位於「Admin API Privileges」(Admin API 權限) 下),然後將該角色指派給您。如此一來,您便可以查看網域中所有群組的成員身分,並更有效地模擬允許政策的變更。

模擬政策變更

請按照下列步驟模擬允許政策的變更。

控制台

以下範例示範如何模擬專案的允許政策變更。不過,您可以模擬變更任何具有允許政策的資源。

編輯主體的權限,然後按一下「測試變更」,不要點選「儲存」

  1. 前往 Google Cloud 控制台的「IAM」(身分與存取權管理) 頁面。

    前往「IAM」頁面

  2. 編輯現有主體的權限,建立允許政策的提議變更:

    1. 找出要編輯存取權的主體,然後按一下右側的「編輯」 按鈕。
    2. 新增角色,或撤銷/變更現有角色,即可編輯主體的存取權。
  3. 如要模擬建議的變更,請按一下「測試變更」

  4. 幾分鐘後, Google Cloud 控制台會以存取權變更清單的形式,顯示模擬結果。詳情請參閱本頁面的「瞭解政策模擬器結果」。

    如果現有允許政策與模擬允許政策的存取權沒有變更, Google Cloud 控制台就不會顯示任何存取權變更。

gcloud

如要模擬允許政策的變更,請按照「讀取 - 修改 - 寫入」模式操作,但請模擬允許政策,而非寫入政策。

  1. 執行下列指令,讀取目前的允許政策:

    gcloud resource-type get-iam-policy resource-id --format=format > filepath

    替換下列值:

    • resource-type:您要模擬允許政策的資源類型。例如:projects
    • resource-id:您要模擬允許政策的資源 ID。例如:my-project
    • format:回應格式。請使用 jsonyaml 值。
    • filepath:允許政策的新輸出檔案路徑。

    舉例來說,以下指令會以 JSON 格式取得專案 my-project 的允許政策,並將其儲存至使用者的主目錄:

    gcloud projects get-iam-policy my-project --format=json > ~/policy.json
  2. 修改 get-iam-policy 指令傳回的 JSON 或 YAML 允許政策,反映您要模擬的變更。

    您可以對允許政策進行多種變更,舉例來說,您可以從角色繫結新增或移除主體,也可以從允許政策中移除角色繫結。

  3. 執行下列指令,模擬允許政策的變更:

    gcloud iam simulator replay-recent-access \
        full-resource-name \
        filepath \
        --format=format

    替換下列值:

    • full-resource-name:要模擬允許政策的資源完整資源名稱。

      完整資源名稱是 URI,由服務名稱和資源路徑組成。舉例來說,如果您要模擬專案的允許政策,請使用 //cloudresourcemanager.googleapis.com/projects/project- id,其中 project-id 是要模擬允許政策的專案 ID。

      如需完整資源名稱格式清單,請參閱「完整資源名稱」。

    • filepath:包含要模擬的已修改允許政策的檔案路徑。例如:~/proposed_policy.json

    • format:回覆格式。例如 jsonyaml

    幾分鐘後,指令會列印重播結果清單,說明套用提議的允許政策後,主體的存取權會如何變更。這些結果也會列出模擬期間發生的任何錯誤,包括因不支援的資源類型而發生的錯誤。

    請參閱本頁的「瞭解政策模擬器結果」,瞭解如何解讀結果。如要瞭解如何儲存模擬結果而非列印,請參閱儲存模擬結果

    以下是允許政策模擬的回覆範例,其中涉及使用者 my-user@example.com。在這種情況下,如果套用建議的變更,my-user@example.com 可能會失去專案 my-projectresourcemanager.projects.listresourcemanager.projects.get 權限,且一定會失去專案 my-projectresourcemanager.projects.update 權限:

    [
      {
        "accessTuple": {
          "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
          "permission": "resourcemanager.projects.list",
          "principal": "my-user@example.com"
        },
        "diff": {
          "accessDiff": {
            "accessChange": "ACCESS_MAYBE_REVOKED",
            "baseline": {
              "accessState": "GRANTED"
            },
            "simulated": {
              "accessState": "UNKNOWN_INFO_DENIED",
              "errors": [
                {
                  "code": 7,
                  "details": [
                    {
                      "@type": "type.googleapis.com/google.rpc.ResourceInfo",
                      "description": "Missing permission to retrieve IAM policies above the resource in hierarchy.",
                      "resourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
                      "resourceType": "cloudresourcemanager.googleapis.com/projects"
                    }
                  ],
                  "message": "Missing permission to get relevant IAM policies."
                }
              ],
              "policies": [
                {
                  "access": "UNKNOWN_INFO_DENIED",
                  "policy": {}
                }
              ]
            }
          }
        },
        "lastSeenDate": {
          "day": 12,
          "month": 1,
          "year": 2021
        }
      },
      {
        "accessTuple": {
          "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
          "permission": "resourcemanager.projects.get",
          "principal": "my-user@example.com"
        },
        "diff": {
          "accessDiff": {
            "accessChange": "ACCESS_MAYBE_REVOKED",
            "baseline": {
              "accessState": "GRANTED"
            },
            "simulated": {
              "accessState": "UNKNOWN_INFO_DENIED",
              "errors": [
                {
                  "code": 7,
                  "details": [
                    {
                      "@type": "type.googleapis.com/google.rpc.ResourceInfo",
                      "description": "Missing permission to view group membership.",
                      "resourceName": "group:everyone@example.com",
                      "resourceType": "Google group"
                    }
                  ],
                  "message": "Missing permission to view group membership."
                },
                {
                  "code": 7,
                  "details": [
                    {
                      "@type": "type.googleapis.com/google.rpc.ResourceInfo",
                      "description": "Missing permission to retrieve IAM policies above the resource in hierarchy.",
                      "resourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
                      "resourceType": "cloudresourcemanager.googleapis.com/projects"
                    }
                  ],
                  "message": "Missing permission to get relevant IAM policies."
                }
              ],
              "policies": [
                {
                  "access": "UNKNOWN_INFO_DENIED",
                  "bindingExplanations": [
                    {
                      "access": "UNKNOWN_INFO_DENIED",
                      "memberships": {
                        "group:everyone@example.com": {
                          "membership": "MEMBERSHIP_UNKNOWN_INFO_DENIED"
                        }
                      },
                      "role": "roles/owner"
                    }
                  ],
                  "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
                  "policy": {
                    "bindings": [
                      {
                        "members": [
                          "group:everyone@example.com"
                        ],
                        "role": "roles/owner"
                      }
                    ],
                    "etag": "BwWgJSIInYA=",
                    "version": 3
                  }
                },
                {
                  "access": "UNKNOWN_INFO_DENIED",
                  "policy": {}
                }
              ]
            }
          }
        },
        "lastSeenDate": {
          "day": 10,
          "month": 1,
          "year": 2021
        }
      },
      {
        "accessTuple": {
          "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
          "permission": "resourcemanager.projects.update",
          "principal": "my-user@example.com"
        },
        "diff": {
          "accessDiff": {
            "accessChange": "ACCESS_REVOKED",
            "baseline": {
              "accessState": "GRANTED"
            },
            "simulated": {
              "accessState": "NOT_GRANTED"
            }
          }
        },
        "lastSeenDate": {
          "day": 15,
          "month": 1,
          "year": 2021
        }
      },
      {
        "accessTuple": {},
        "error": {
          "code": 12,
          "details": [
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.create"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.setIamPolicy"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.delete"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.update"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "pubsub.topics.publish"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.list"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.getIamPolicy"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.get"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            }
          ],
          "message": "Simulator does not yet support all resource types for 8 removed permissions."
        }
      }
    ]

    如果現有允許政策與模擬允許政策的存取權沒有變更,指令會列印 No access changes found in the replay

REST

如要模擬允許政策的變更,請按照「讀取 - 修改 - 寫入」模式操作,但請建立並執行模擬作業,而非寫入允許政策。

  1. 讀取資源的允許政策。

    如要取得專案的允許政策,請使用 Resource Manager API 的 projects.getIamPolicy 方法。

    使用任何要求資料之前,請先替換以下項目:

    • PROJECT_ID:您的 Google Cloud 專案 ID。專案 ID 為英數字串,例如 my-project
    • POLICY_VERSION:要傳回的政策版本。要求應指定最新政策版本,即政策版本 3。詳情請參閱在取得政策時指定政策版本

    HTTP 方法和網址:

    POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:getIamPolicy

    JSON 要求主體:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    如要傳送要求,請展開以下其中一個選項:

    您應該會收到如下的 JSON 回應:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/owner",
          "members": [
            "user:project-owner@example.com"
          ]
        },
        {
          "role": "roles/iam.securityReviewer",
          "members": [
            "user:fatima@example.com"
          ]
        }
      ]
    }
    

  2. 修改傳回的允許政策,以反映要模擬的變更。

    您可以對允許政策進行多種變更,舉例來說,您可以從角色繫結新增或移除主體,也可以從允許政策中移除角色繫結。

  3. 使用修改後的允許政策建立模擬或重播

    如要為專案、資料夾或機構建立 Replay,請使用 Policy Simulator API 的 replays.create 方法。

    使用任何要求資料之前,請先替換以下項目:

    • HOST_RESOURCE_TYPE:將代管 Replay 的資源類型。 這個值必須是 projectsfoldersorganizations
    • HOST_RESOURCE_ID:主機資源的 ID,例如 my-project
    • TARGET_FULL_RESOURCE_NAME:要模擬政策的資源完整資源名稱。這項資源可以是接受 IAM 政策的任何資源,不需與主機資源有任何關聯。

      完整資源名稱是 URI,由服務名稱和資源路徑組成。舉例來說,如果您要模擬專案的政策,請使用 //cloudresourcemanager.googleapis.com/projects/PROJECT_ID,其中 PROJECT_ID 是要模擬政策的專案 ID。

      如需資源名稱格式的完整清單,請參閱「完整資源名稱」。

    • POLICY:要模擬的政策。如需政策範例,請參閱 政策參考資料

      如要模擬多項政策,請在要求主體中加入多個 "OBJECT_FULL_RESOURCE_NAME" : POLICY 組合。

    • PROJECT_ID:您的 Google Cloud 專案 ID。專案 ID 為英數字串,例如 my-project

    HTTP 方法和網址:

    POST https://policysimulator.googleapis.com/v1/HOST_RESOURCE_TYPE/HOST_RESOURCE_ID/locations/global/replays

    JSON 要求主體:

    {
      "config": {
        "policyOverlay": {
          "TARGET_FULL_RESOURCE_NAME" : POLICY
        }
      }
    }
    

    如要傳送要求,請展開以下其中一個選項:

    回應會包含代表 Replay 的作業名稱:

    {
      "name": "operations/6de23e63-f61a-4b8c-b502-34d717d2d7f8",
      "metadata": {
        "type_url": "type.googleapis.com/google.cloud.policysimulator.v1.ReplayOperationMetadata"
      }
    }
    

  4. 輪詢 operations.get 方法,直到 Replay 完成為止。

    如要輪詢作業,建議您重複叫用 operations.get 方法,直到回應包含 "done": true 欄位和 name 欄位,且 name 欄位含有已完成重播的名稱為止。使用部分指數輪詢,在每次要求之間加入延遲。

    如要取得 Replay 的狀態,請使用 Policy Simulator API 的 operations.get 方法。

    使用任何要求資料之前,請先替換以下項目:

    • OPERATION_NAME:重播作業的名稱,包括 operations 前置字串。從 replays.create 回應的 name 欄位複製這個值。例如: operations/6de23e63-f61a-4b8c-b502-34d717d2d7f8
    • PROJECT_ID:您的 Google Cloud 專案 ID。專案 ID 為英數字串,例如 my-project

    HTTP 方法和網址:

    GET https://policysimulator.googleapis.com/v1/OPERATION_NAME

    如要傳送要求,請展開以下其中一個選項:

    執行中的作業會傳回類似以下的回應:

    {
      "name": "operations/42083b6b-3788-41b9-ae39-e97d7615a22d",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.policysimulator.v1.ReplayOperationMetadata",
        "startTime": "2021-01-15T05:34:14.732Z"
      }
    }
    

    完成的作業會傳回類似以下的回應:

    {
      "name": "operations/89ab4892-9605-4c84-aedb-4fce4fc5195b",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.policysimulator.v1.ReplayOperationMetadata",
        "startTime": "2021-01-15T05:40:15.922Z"
      },
      "done": true,
      "response": {
        "@type": "type.googleapis.com/google.cloud.policysimulator.v1.Replay",
        "replay": {
          "name": "projects/my-project/locations/global/replays/89ab4892-9605-4c84-aedb-4fce4fc5195b",
          "state": SUCCEEDED,
          "config": {},
          "resultsSummary": {
            "logCount": 1319,
            "unchangedCount": 1169,
            "differenceCount": 149,
            "errorCount": 1,
            "oldestDate": {
              "year": 2020,
              "month": 10,
              "day": 15
            },
            "newestDate": {
              "year": 2021,
              "month": 1,
              "day": 12
            }
          }
        }
      }
    }
    

  5. 取得重播結果。

    如要取得 Replay 的結果,請使用 Policy Simulator API 的 replays.results.list 方法。

    使用任何要求資料之前,請先替換以下項目:

    • REPLAY_NAME:要擷取結果的 Replay 名稱。從 operations.get 回應的 response.replay.name 欄位複製這個值。包括任何資源類型和位置前置字串。例如: "projects/my-project/locations/global/replays/89ab4892-9605-4c84-aedb-4fce4fc5195b"
    • PAGE_SIZE:選用。這項要求傳回的結果數上限。如未指定,伺服器會決定要傳回的結果數量。如果結果數量大於頁面大小,回應會包含分頁符記,可用於擷取下一頁結果。
    • PAGE_TOKEN:選用。這個方法先前回應中傳回的分頁符記。如有指定,結果清單會從上一個要求結束的位置開始。
    • PROJECT_ID:您的 Google Cloud 專案 ID。專案 ID 為英數字串,例如 my-project

    HTTP 方法和網址:

    GET https://policysimulator.googleapis.com/v1/REPLAY_NAME/results?pageSize=page-size&pageToken=PAGE_TOKEN

    如要傳送要求,請展開以下其中一個選項:

    回應會列出結果,說明套用提議的政策後,主體的存取權會如何變更。這些結果也會列出模擬期間發生的任何錯誤,尤其是不支援的資源類型造成的錯誤。

    請參閱本頁的「瞭解政策模擬器結果」,瞭解如何解讀結果。

    以下是涉及使用者 my-user@example.com 的政策模擬範例回應。在這種情況下,如果套用建議的變更,my-user@example.com 可能就不再擁有專案 my-projectresourcemanager.projects.listresourcemanager.projects.get 權限,而且肯定不再擁有專案 my-projectresourcemanager.projects.update 權限:

    {
      "replayResults": [
        {
          "accessTuple": {
            "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
            "permission": "resourcemanager.projects.list",
            "principal": "my-user@example.com"
          },
          "lastSeenDate": {
            "day": 27,
            "month": 3,
            "year": 2020
          },
          "diff": {
            "accessDiff": {
              "accessChange": "ACCESS_MAYBE_REVOKED",
              "baseline": {
                "accessState": "GRANTED"
              },
              "simulated": {
                "accessState": "UNKNOWN_INFO_DENIED",
                "errors": [
                  {
                    "code": 7,
                    "message": "Missing permission to get relevant IAM policies.",
                    "details": [
                      {
                        "@type": "type.googleapis.com/google.rpc.ResourceInfo",
                        "description": "Missing permission to retrieve IAM policies above the resource in hierarchy.",
                        "resourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
                        "resourceType": "cloudresourcemanager.googleapis.com/projects"
                      }
                    ]
                  }
                ],
                "policies": [
                  {
                    "access": "UNKNOWN_INFO_DENIED",
                    "policy": {}
                  }
                ]
              }
            }
          }
        },
        {
          "accessTuple": {
            "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
            "permission": "resourcemanager.projects.get",
            "principal": "my-user@example.com"
          },
          "lastSeenDate": {
            "day": 27,
            "month": 3,
            "year": 2020
          },
          "diff": {
            "accessDiff": {
              "accessChange": "ACCESS_MAYBE_REVOKED",
              "baseline": {
                "accessState": "GRANTED"
              },
              "simulated": {
                "accessState": "UNKNOWN_INFO_DENIED",
                "errors": [
                  {
                    "code": 7,
                    "message": "Missing permission to view group membership.",
                    "details": [
                      {
                        "@type": "type.googleapis.com/google.rpc.ResourceInfo",
                        "description": "Missing permission to view group membership.",
                        "resourceName": "group:everyone@example.com",
                        "resourceType": "Google group"
                      }
                    ]
                  },
                  {
                    "code": 7,
                    "message": "Missing permission to get relevant IAM policies.",
                    "details": [
                      {
                        "@type": "type.googleapis.com/google.rpc.ResourceInfo",
                        "description": "Missing permission to retrieve IAM policies above the resource in hierarchy.",
                        "resourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
                        "resourceType": "cloudresourcemanager.googleapis.com/projects"
                      }
                    ]
                  }
                ],
                "policies": [
                  {
                    "access": "UNKNOWN_INFO_DENIED",
                    "bindingExplanations": [
                      {
                        "access": "UNKNOWN_INFO_DENIED",
                        "memberships": {
                          "group:everyone@example.com": {
                            "membership": "MEMBERSHIP_UNKNOWN_INFO_DENIED"
                          }
                        },
                        "role": "roles/owner"
                      }
                    ],
                    "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
                    "policy": {
                      "bindings": [
                        {
                          "members": [
                            "group:everyone@example.com"
                          ],
                          "role": "roles/owner"
                        }
                      ],
                      "etag": "BwWgJSIInYA=",
                      "version": 3
                    }
                  },
                  {
                    "access": "UNKNOWN_INFO_DENIED",
                    "policy": {}
                  }
                ]
              }
            }
          }
        },
        {
          "accessTuple": {
            "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
            "permission": "resourcemanager.projects.update",
            "principal": "my-user@example.com"
          },
          "lastSeenDate": {
            "day": 27,
            "month": 3,
            "year": 2020
          },
          "diff": {
            "accessDiff": {
              "accessChange": "ACCESS_REVOKED",
              "baseline": {
                "accessState": "GRANTED"
              },
              "simulated": {
                "accessState": "NOT_GRANTED"
              }
            }
          }
        },
        {
          "accessTuple": {},
          "error": {
            "code": 12,
            "message": "Simulator does not yet support all resource types for 8 removed permissions.",
            "details": [
              {
                "@type": "type.googleapis.com/google.rpc.Status",
                "code": 12,
                "message": "Simulator does not yet support all resource types for 8 removed permissions.",
                "details": [
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.create"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.setIamPolicy"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.delete"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.update"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "pubsub.topics.publish"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.list"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.getIamPolicy"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.get"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  }
                ]
              }
            ]
          }
        }
      ],
      "nextPageToken": "AWukk3zjv80La+chWx6WNt7X8czGPLtP792gRpkNVEV/URZ/VdWzxmuJKr"
    }
    

    如果現有允許政策與模擬允許政策的存取權沒有變更,要求會傳回空白清單 ({})。

解讀政策模擬工具結果

Policy Simulator 會以存取權變更清單的形式,回報提議的允許政策變更所造成的影響。每項存取權變更都代表過去 90 天內的存取嘗試,在建議的允許政策下,結果會與目前的允許政策不同。

政策模擬器也會列出模擬期間發生的任何錯誤,協助您找出模擬作業中可能出現的缺口。

這些變更和錯誤的呈現方式取決於您使用的平台。

控制台

政策模擬工具結果頁面會以不同專區顯示模擬結果:

  • 政策變更:這個部分會列出您提議變更允許政策的資源、您提議移除的角色,以及您提議新增的角色。

    這個部分也包含「查看政策差異」按鈕。按一下這個按鈕,即可查看資源在建議變更前後的允許政策。

  • 權限變更:這個部分會列出已移除和新增的權限數量,說明套用建議變更後,主體的權限會如何變更。系統會比較主體在現有與預期角色之間的權限差異,接著計算出這些權限數量,但繼承的角色不會納入考量。

    這個部分也包含「查看權限差異」按鈕。按一下這個按鈕,即可並排比較主體在現有與預期角色之間的權限差異。

  • 過去 90 天內的存取權變更:這個部分會顯示過去 90 天內,哪些存取嘗試在提議的允許政策和目前的允許政策下,產生不同的結果。這個部分包含存取權變更的摘要,以及提供更詳細結果的表格。

    存取權變更摘要會列出各類型存取權變更的數量、錯誤和不明結果的數量,以及在建議的允許政策和目前的允許政策下,存取嘗試次數相同結果的數量。摘要也會顯示無法模擬的權限數量。詳情請參閱本頁的「錯誤」。

    這個部分也包含存取權變更表格。這份表格列出過去 90 天內,在建議允許政策和目前允許政策下,存取嘗試結果不同的情況。每個項目都包含主體嘗試存取的資源、要求日期、提出要求的主體、要求中的權限,以及與目前允許政策下的存取狀態相比,建議允許政策下的存取狀態。

    存取權變更類型如下:

    存取權限變更 詳細資料
    存取權已撤銷 主體目前具備存取權,但提案變更生效後,主體將無法再存取。
    可能已撤銷存取權限

    發生這種情況的原因如下:

    • 主體目前具備存取權,但根據建議的允許政策,主體的存取權不明
    • 根據目前的允許政策,主體的存取權不明,但提議的變更生效後,主體將無法存取。
    已授予存取權 主體目前不具備存取權,但建議的變更生效後,主體將具備存取權。
    可能已授予存取權

    發生這種情況的原因如下:

    • 根據目前的允許政策,主體不具備存取權,但建議變更後的存取權不明
    • 根據目前的允許政策,主體的存取權為不明,但提議的變更生效後,主體將可存取。
    存取權不明 在目前的允許政策和建議的允許政策下,主體的存取權不明,且建議的變更可能會影響主體的存取權。
    錯誤 模擬期間發生錯誤。

    如要查看存取權變更的其他詳細資料,請按一下存取權變更。這會開啟「存取權限變更詳細資料」面板,顯示存取權限變更的其他資訊,包括主體的現有存取權、主體的建議存取權,以及存取權限變更結果的其他詳細資料。

gcloud

使用 replay-recent-access 指令時,gcloud CLI 的回應會包含 replayResults 清單。

如果嘗試存取時已採用提議的允許政策,每個重播結果都會說明存取嘗試的結果有何不同。舉例來說,以下重播結果顯示 my-user@example.com 過去曾使用 resourcemanager.projects.update 權限,在專案 my-project 中執行動作。不過,如果當時已實施建議的允許政策,他們就會遭到拒絕存取。

{
  "accessTuple": {
    "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
    "permission": "resourcemanager.projects.update",
    "principal": "my-user@example.com"
  },
  "lastSeenDate": {
    "day": 15,
    "month": 1,
    "year": 2021
  },
  "diff": {
    "accessDiff": {
      "baseline": {
        "accessState": "GRANTED"
      },
      "simulated": {
        "accessState": "NOT_GRANTED"
      },
      "accessChange": "ACCESS_REVOKED"
    }
  }
}

每項重播結果都包含下列欄位:

  • accessTuple:與結果相關的存取嘗試。這個欄位包含嘗試存取時涉及的資源、權限和主體。

  • lastSeenDate:上次嘗試存取的日期。

  • diff.accessDiff error:如果成功重播存取嘗試,結果會包含 diff.accessDiff 欄位,其中會回報在目前允許政策和建議允許政策下,存取嘗試結果的差異。如果重播嘗試失敗,重播結果會包含 error 欄位,並說明錯誤。如要進一步瞭解模擬錯誤,請參閱本頁的「錯誤」一節。

每個存取差異都包含下列元件:

  • baseline:使用目前允許政策時的存取結果。這會回報為下列其中一個值:GRANTEDNOT_GRANTEDUNKNOWN_CONDITIONALUNKNOWN_INFO_DENIED。如果結果為 UNKNOWN_CONDITIONALUNKNOWN_INFO_DENIED,回應也會列出與不明資訊相關聯的任何錯誤,以及與該錯誤相關聯的允許政策。如要進一步瞭解UNKNOWN值,請參閱本頁的「不明結果」一節。
  • simulated:使用建議的允許政策時的存取結果。這會以下列其中一個值回報:GRANTEDNOT_GRANTEDUNKNOWN_CONDITIONALUNKNOWN_INFO_DENIED。如果結果為 UNKNOWN_CONDITIONALUNKNOWN_INFO_DENIED,回應也會列出與不明資訊相關聯的任何錯誤,以及與該錯誤相關聯的允許政策。如要進一步瞭解UNKNOWN值,請參閱本頁的「不明結果」一節。
  • accessChange:基準存取狀態與模擬存取狀態之間的變化。如需可能值的清單,請參閱下表:

    存取權限變更 詳細資料
    ACCESS_REVOKED 主體目前具備存取權,但提案變更生效後,主體將無法再存取。
    ACCESS_MAYBE_REVOKED

    發生這種情況的原因如下:

    • 主體目前具備存取權,但根據建議的允許政策,主體的存取權不明
    • 根據目前的允許政策,主體的存取權不明,但提議的變更生效後,主體將無法存取。
    ACCESS_GAINED 主體目前不具備存取權,但建議的變更生效後,主體將具備存取權。
    ACCESS_MAYBE_GAINED

    發生這種情況的原因如下:

    • 根據目前的允許政策,主體不具備存取權,但建議變更後的存取權不明
    • 根據目前的允許政策,主體的存取權為不明,但提議的變更生效後,主體將可存取。
    UNKNOWN_CHANGE 在目前的允許政策和建議的允許政策下,主體的存取權不明,且建議的變更可能會影響主體的存取權。

REST

呼叫 replays.results.list 方法時,回應會包含 replayResults 清單。

如果嘗試存取時已採用提議的允許政策,每個重播結果都會說明存取嘗試的結果有何不同。舉例來說,以下重播結果顯示 my-user@example.com 過去曾使用 resourcemanager.projects.update 權限,在專案 my-project 中執行動作。不過,如果當時已實施建議的允許政策,他們就會遭到拒絕存取。

{
  "accessTuple": {
    "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
    "permission": "resourcemanager.projects.update",
    "principal": "my-user@example.com"
  },
  "lastSeenDate": {
    "day": 15,
    "month": 1,
    "year": 2021
  },
  "diff": {
    "accessDiff": {
      "baseline": {
        "accessState": "GRANTED"
      },
      "simulated": {
        "accessState": "NOT_GRANTED"
      },
      "accessChange": "ACCESS_REVOKED"
    }
  }
}

每項重播結果都包含下列欄位:

  • accessTuple:與結果相關的存取嘗試。這個欄位包含嘗試存取時涉及的資源、權限和主體。

  • lastSeenDate:上次嘗試存取的日期。

  • diff.accessDiff error:如果成功重播存取嘗試,結果會包含 diff.accessDiff 欄位,其中會回報在目前允許政策和建議允許政策下,存取嘗試結果的差異。如果重播嘗試失敗,重播結果會包含 error 欄位,並說明錯誤。如要進一步瞭解模擬錯誤,請參閱本頁的「錯誤」一節。

每個存取差異都包含下列元件:

  • baseline:使用目前允許政策時的存取結果。這會回報為下列其中一個值:GRANTEDNOT_GRANTEDUNKNOWN_CONDITIONALUNKNOWN_INFO_DENIED。如果結果為 UNKNOWN_CONDITIONALUNKNOWN_INFO_DENIED,回應也會列出與不明資訊相關聯的任何錯誤,以及與該錯誤相關聯的允許政策。如要進一步瞭解UNKNOWN值,請參閱本頁的「不明結果」一節。
  • simulated:使用建議的允許政策時的存取結果。這會以下列其中一個值回報:GRANTEDNOT_GRANTEDUNKNOWN_CONDITIONALUNKNOWN_INFO_DENIED。如果結果為 UNKNOWN_CONDITIONALUNKNOWN_INFO_DENIED,回應也會列出與不明資訊相關聯的任何錯誤,以及與該錯誤相關聯的允許政策。如要進一步瞭解UNKNOWN值,請參閱本頁的「不明結果」一節。
  • accessChange:基準存取狀態與模擬存取狀態之間的變化。如需可能值的清單,請參閱下表:

    存取權限變更 詳細資料
    ACCESS_REVOKED 主體目前具備存取權,但提案變更生效後,主體將無法再存取。
    ACCESS_MAYBE_REVOKED

    發生這種情況的原因如下:

    • 主體目前具備存取權,但根據建議的允許政策,主體的存取權不明
    • 根據目前的允許政策,主體的存取權不明,但提議的變更生效後,主體將無法存取。
    ACCESS_GAINED 主體目前不具備存取權,但建議的變更生效後,主體將具備存取權。
    ACCESS_MAYBE_GAINED

    發生這種情況的原因如下:

    • 根據目前的允許政策,主體不具備存取權,但建議變更後的存取權不明
    • 根據目前的允許政策,主體的存取權為不明,但提議的變更生效後,主體將可存取。
    UNKNOWN_CHANGE 在目前的允許政策和建議的允許政策下,主體的存取權不明,且建議的變更可能會影響主體的存取權。

結果不明

如果存取結果為「不明」,表示 Policy Simulator 沒有足夠資訊,無法完整評估存取嘗試。

控制台

如果存取結果不明,存取權變更詳細資料面板會回報不明原因,以及無法存取或評估的特定角色、允許政策、群組成員資格和條件。

結果可能因下列原因而顯示為「不明」:

  • 角色資訊遭拒:執行模擬的主體沒有權限,無法查看一或多個模擬角色的詳細資料。
  • 無法存取政策:執行模擬的主體沒有權限,無法取得模擬中一或多項資源的允許政策。
  • 成員資訊遭拒:執行模擬的主體沒有權限,無法查看建議允許政策中一或多個群組的成員。
  • 不支援的條件:正在測試的允許政策中含有條件式角色繫結。政策模擬器不支援條件,因此無法評估繫結。

gcloud

在 gcloud CLI 中,模擬結果會回報存取差異中結果不明的原因。

存取結果不明的原因如下:

  • UNKNOWN_INFO_DENIED:使用者沒有權限存取評估存取狀態所需的資訊。發生這種情況的原因可能如下:

    • 使用者無權擷取模擬的允許政策,或無權擷取存取記錄中資源的允許政策。
    • 使用者沒有查看群組成員資格的權限。
    • 使用者無法擷取必要的角色資訊。

    如要瞭解缺少哪些資訊,請參閱回報存取狀態後顯示的錯誤資訊。

  • UNKNOWN_CONDITIONAL:正在測試的允許政策中含有條件式角色繫結。政策模擬器不支援條件,因此無法評估繫結。

如果結果不明,允許政策的欄位 (baselinesimulated) 會包含 errors 欄位,說明資訊不明的原因,以及 policies 欄位,列出與錯誤相關聯的允許政策。如要進一步瞭解錯誤,請參閱本頁的「錯誤」一節。

REST

在 REST API 中,模擬結果會回報存取差異中結果不明的原因。

存取結果不明的原因如下:

  • UNKNOWN_INFO_DENIED:使用者沒有權限存取評估存取狀態所需的資訊。發生這種情況的原因可能如下:

    • 使用者無權擷取模擬的允許政策,或無權擷取存取記錄中資源的允許政策。
    • 使用者沒有查看群組成員資格的權限。
    • 使用者無法擷取必要的角色資訊。

    如要瞭解缺少哪些資訊,請參閱回報存取狀態後顯示的錯誤資訊。

  • UNKNOWN_CONDITIONAL:正在測試的允許政策中含有條件式角色繫結。政策模擬器不支援條件,因此無法評估繫結。

如果結果不明,允許政策的欄位 (baselinesimulated) 會包含 errors 欄位,說明資訊不明的原因,以及 policies 欄位,列出與錯誤相關聯的允許政策。如要進一步瞭解錯誤,請參閱本頁的「錯誤」一節。

錯誤

政策模擬器也會回報模擬期間發生的任何錯誤。請務必查看這些錯誤,瞭解模擬結果可能出現的落差。

控制台

政策模擬器可能會回報下列幾種錯誤:

  • 作業錯誤:無法執行模擬作業。 政策模擬器會在結果頁面頂端回報作業錯誤。

    如果錯誤訊息指出專案或機構的記錄檔過多,導致無法執行模擬作業,您就無法對資源執行模擬作業。

    如果因其他原因收到這則錯誤訊息,請嘗試再次執行模擬作業。如果仍無法執行模擬,請傳送電子郵件至 policy-simulator-feedback@google.com。

  • 重播錯誤:單一存取嘗試的重播作業失敗,因此 Policy Simulator 無法判斷在提議的允許政策下,存取嘗試的結果是否會變更。

    Google Cloud 控制台會在「過去 90 天內的存取權變更」表格中列出重播錯誤。每個錯誤的「存取權變更詳細資料」面板都會顯示錯誤訊息,協助您瞭解問題,以及發生錯誤時模擬的資源和權限。

  • 不支援的資源類型錯誤:建議的允許政策會影響與不支援的資源類型相關聯的權限,而 Policy Simulator 無法模擬這類權限。

    Policy Simulator 會在模擬結果中列出這些權限,方便您瞭解哪些權限無法模擬。

gcloud

在 gcloud CLI 的模擬結果中,錯誤可能會出現在兩個位置:

  • replayResult.error 欄位:如果重播嘗試失敗,政策模擬工具會在 replayResult.error 欄位中回報錯誤。如果重播結果包含這個欄位,就不會包含 diff 欄位。
  • replayResult.diff.accessDiff.policy-type.errors 欄位,其中 policy-typebaselinesimulated。如果重播嘗試成功,但結果為 UNKNOWN_INFO_DENIEDUNKNOWN_CONDITIONAL,政策模擬工具會在該欄位中回報結果不明的原因。

政策模擬器會產生下列類型的錯誤:

錯誤 錯誤代碼 詳細資料
GENERIC_INTERNAL_ERROR 13 發生內部錯誤,因此模擬失敗。如要解決這個問題,請再次執行模擬。如果模擬作業仍失敗,請傳送電子郵件至 policy-simulator-feedback@google.com。
INVALID_ACCESS_TUPLE 3 存取嘗試含有無效的權限、資源名稱或主體,因此政策模擬工具無法重播。
OUT_OF_RANGE_GROUP_TOO_LARGE 11 由於群組的子群組過多,政策模擬工具無法評估主體的群組成員資格。這項錯誤與UNKNOWN_INFO_DENIED存取權變更有關。
PERMISSION_DENIED_ON_GROUP_MEMBERSHIP 7 由於呼叫者沒有查看群組成員資格的權限,因此政策模擬器無法評估使用者的存取權。這項錯誤與UNKNOWN_INFO_DENIED存取權變更有關。
PERMISSION_DENIED_ON_IAM_POLICY 7 由於呼叫者沒有權限擷取允許政策,因此政策模擬器無法評估使用者的存取權。這類錯誤與UNKNOWN_INFO_DENIED存取權變更有關。
PERMISSION_DENIED_ON_IAM_ROLE 7 由於呼叫者沒有權限可擷取 IAM 角色中的權限,因此政策模擬器無法評估使用者的存取權。這類錯誤與UNKNOWN_INFO_DENIED存取權變更有關。
PERMISSION_DENIED_ON_PARENT_IAM_POLICY 7 由於呼叫者沒有權限擷取上層資源的允許政策,因此政策模擬工具無法評估使用者的存取權。這類錯誤與UNKNOWN_INFO_DENIED存取權變更有關。
UNIMPLEMENTED_MEMBER_TYPE 12 存取元組含有 Policy Simulator 不支援的主體類型。
UNIMPLEMENTED_MEMBER 12 存取元組包含 Policy Simulator 不支援的主體。
UNIMPLEMENTED_CONDITION 12 存取元組含有 Policy Simulator 不支援的條件。這類錯誤與UNKNOWN_CONDITIONAL存取權變更有關。
LOG_SIZE_TOO_LARGE 8 資源關聯的存取記錄檔過多,因此政策模擬器無法執行模擬作業。詳情請參閱政策模擬器概念頁面的「記錄重播大小上限」。
UNSUPPORTED_RESOURCE 12

建議的允許政策變更與不支援的資源類型相關聯。這項錯誤會顯示在 replayResult.error 欄位中,並列出與不支援資源類型相關聯的權限。例如:

"error": {
  "code": 12,
  "details": [
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "policysimulator.googleapis.com",
      "metadata": {
        "permission": "storage.objects.create"
      },
      "reason": "UNSUPPORTED_RESOURCE"
    },
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "policysimulator.googleapis.com",
      "metadata": {
        "permission": "storage.objects.setIamPolicy"
      },
      "reason": "UNSUPPORTED_RESOURCE"
    },
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "policysimulator.googleapis.com",
      "metadata": {
        "permission": "storage.objects.get"
      },
      "reason": "UNSUPPORTED_RESOURCE"
    }
  ],
  "message": "unsupported-permissions-error-message"
}

如要進一步瞭解不支援的資源類型,請參閱「政策模擬器概念」頁面上的「資源類型支援等級」。

REST

在 REST API 模擬結果中,錯誤可能會出現在兩個位置:

  • replayResult.error 欄位:如果重播嘗試失敗,政策模擬工具會在 replayResult.error 欄位中回報錯誤。如果重播結果包含這個欄位,就不會包含 diff 欄位。
  • replayResult.diff.accessDiff.policy-type.errors 欄位,其中 policy-typebaselinesimulated。如果重播嘗試成功,但結果為 UNKNOWN_INFO_DENIEDUNKNOWN_CONDITIONAL,政策模擬工具會在該欄位中回報結果不明的原因。

政策模擬器會產生下列類型的錯誤:

錯誤 錯誤代碼 詳細資料
GENERIC_INTERNAL_ERROR 13 發生內部錯誤,因此模擬失敗。如要解決這個問題,請再次執行模擬。如果模擬作業仍失敗,請傳送電子郵件至 policy-simulator-feedback@google.com。
INVALID_ACCESS_TUPLE 3 存取嘗試含有無效的權限、資源名稱或主體,因此政策模擬工具無法重播。
OUT_OF_RANGE_GROUP_TOO_LARGE 11 由於群組的子群組過多,政策模擬工具無法評估主體的群組成員資格。這項錯誤與UNKNOWN_INFO_DENIED存取權變更有關。
PERMISSION_DENIED_ON_GROUP_MEMBERSHIP 7 由於呼叫者沒有查看群組成員資格的權限,因此政策模擬器無法評估使用者的存取權。這項錯誤與UNKNOWN_INFO_DENIED存取權變更有關。
PERMISSION_DENIED_ON_IAM_POLICY 7 由於呼叫者沒有權限擷取允許政策,因此政策模擬器無法評估使用者的存取權。這類錯誤與UNKNOWN_INFO_DENIED存取權變更有關。
PERMISSION_DENIED_ON_IAM_ROLE 7 由於呼叫者沒有權限可擷取 IAM 角色中的權限,因此政策模擬器無法評估使用者的存取權。這類錯誤與UNKNOWN_INFO_DENIED存取權變更有關。
PERMISSION_DENIED_ON_PARENT_IAM_POLICY 7 由於呼叫者沒有權限擷取上層資源的允許政策,因此政策模擬工具無法評估使用者的存取權。這類錯誤與UNKNOWN_INFO_DENIED存取權變更有關。
UNIMPLEMENTED_MEMBER_TYPE 12 存取元組含有 Policy Simulator 不支援的主體類型。
UNIMPLEMENTED_MEMBER 12 存取元組包含 Policy Simulator 不支援的主體。
UNIMPLEMENTED_CONDITION 12 存取元組含有 Policy Simulator 不支援的條件。這類錯誤與UNKNOWN_CONDITIONAL存取權變更有關。
LOG_SIZE_TOO_LARGE 8 資源關聯的存取記錄檔過多,因此政策模擬器無法執行模擬作業。詳情請參閱政策模擬器概念頁面的「記錄重播大小上限」。
UNSUPPORTED_RESOURCE 12

建議的允許政策變更與不支援的資源類型相關聯。這項錯誤會顯示在 replayResult.error 欄位中,並列出與不支援資源類型相關聯的權限。例如:

"error": {
  "code": 12,
  "details": [
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "policysimulator.googleapis.com",
      "metadata": {
        "permission": "storage.objects.create"
      },
      "reason": "UNSUPPORTED_RESOURCE"
    },
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "policysimulator.googleapis.com",
      "metadata": {
        "permission": "storage.objects.setIamPolicy"
      },
      "reason": "UNSUPPORTED_RESOURCE"
    },
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "policysimulator.googleapis.com",
      "metadata": {
        "permission": "storage.objects.get"
      },
      "reason": "UNSUPPORTED_RESOURCE"
    }
  ],
  "message": "unsupported-permissions-error-message"
}

如要進一步瞭解不支援的資源類型,請參閱「政策模擬器概念」頁面上的「資源類型支援等級」。

套用模擬政策變更

如要將模擬變更套用至允許政策,請按照下列步驟操作:

控制台

  1. 按一下「套用提議的變更」

  2. 在確認對話方塊中,按一下「套用」以確認變更。

gcloud

使用 set-iam-policy 指令,並提供包含要套用模擬允許政策的 JSON 檔案路徑:

gcloud resource-type set-iam-policy resource-id filepath

提供以下這些值:

  • resource-type:您要更新允許政策的資源類型。例如:projects
  • resource-id:您要更新允許政策的資源 ID。例如:my-project
  • filepath:包含更新後允許政策的檔案路徑。

回應包含更新後的允許政策。如果您將 IAM 允許政策視為程式碼,並儲存在版本控管系統中,則應儲存 gcloud CLI 傳回的允許政策,而非包含模擬允許政策的 JSON 檔案。

REST

將建議的允許政策設為資源的新允許政策。

如要將要求中的允許政策設為專案的新允許政策,請使用 Resource Manager API 的 projects.setIamPolicy 方法。

使用任何要求資料之前,請先替換以下項目:

  • PROJECT_ID:您的 Google Cloud 專案 ID。專案 ID 為英數字串,例如 my-project
  • POLICY:要設定的政策 JSON 表示法。如要進一步瞭解政策格式,請參閱政策參考資料

HTTP 方法和網址:

POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy

JSON 要求主體:

{
  "policy": {
    POLICY
  }
}

如要傳送要求,請展開以下其中一個選項:

回應會包含更新後的允許政策。


儲存模擬結果

如果您使用 gcloud CLI,可以將政策模擬器結果儲存為 JSON、YAML 或 CSV 檔案。

另存為 JSON 或 YAML

如要將模擬結果儲存為 JSON 或 YAML 檔案,請在執行模擬時,將下列旗標新增至 replay-recent-access 指令:

--output=output-format > filename

替換下列值:

  • output-format:匯出檔案的語言,可為 jsonyaml
  • filename:匯出檔案的名稱。

儲存為 CSV

如要儲存 CSV 檔案,請在執行模擬時,將下列標記新增至 replay-recent-access 指令:

--flatten="diffs[]" --format=csv(output-fields) > filename

替換下列值:

  • output-fields:以半形逗號分隔的欄位清單,列出要納入匯出結果的欄位。例如:diffs.accessTuple.principal, diffs.accessTuple.permission
  • filename:匯出檔案的名稱。

如有需要,您也可以新增其他欄位,例如 errors[]--flatten 旗標。在 --flatten 標記中新增欄位,即可在 CSV 檔案中,將這些欄位的元素列在不同行。

以下是 replay-recent-access 指令範例,可將模擬結果最重要的欄位儲存為 CSV 檔案 simulation-results.csv

gcloud iam simulator replay-recent-access --flatten="diffs[]" \
    --format="csv(diffs.accessTuple.principal, diffs.accessTuple.permission, \
    diffs.accessTuple.fullResourceName, diffs.diff.accessDiff.accessChange, \
    diffs.diff.accessDiff.baseline.accessState, \
    diffs.diff.accessDiff.simulated.accessState)" \
    //cloudresourcemanager.googleapis.com/projects/my-project \
    proposed-policy.json > simulation-results.csv

這個範例會模擬專案 my-projectproposed-policy.json,並將結果儲存為 simulation-results.csv。這份 CSV 檔案包含下列欄位:主體、權限、資源、存取權變更、基準存取權狀態和模擬存取權狀態。

如要進一步瞭解如何使用 gcloud CLI 設定格式,請參閱格式

後續步驟