使用 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 方法,直到重播完成為止。

    如要輪詢作業,建議您重複叫用 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:要擷取結果的重播名稱。從 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,Policy Simulator 會在這個欄位中回報結果不明的原因。

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

錯誤 錯誤代碼 詳細資料
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,Policy Simulator 會在這個欄位中回報結果不明的原因。

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

錯誤 錯誤代碼 詳細資料
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 設定格式,請參閱格式

後續步驟