還原 IAM 允許政策的先前版本

本頁面說明在不慎變更或意外刪除 IAM 允許政策後,如何還原先前的版本。

如要還原先前的 IAM 政策,請找出變更或刪除政策前最後一次成功的 setIamPolicy,並使用該政策還原。

必要的角色

如要取得還原先前允許政策所需的權限,請要求管理員在專案、資料夾或組織中,授予您下列 IAM 角色:

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

使用 setIamPolicy 還原允許政策時,您必須具備機構管理員角色,才能還原機構和資料夾層級的允許政策;如要還原專案層級的允許政策,則必須具備擁有者角色。

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

使用上次成功的 setIamPolicy 執行個體還原允許政策

如要將允許政策還原至先前版本,請查看稽核記錄,瞭解變更或刪除前最後一次成功執行 setIamPolicy 的情況,並使用該執行個體的資訊還原政策。這個程序包含下列步驟:

  1. 找出允許政策的最後一個成功 setIamPolicy 執行個體,並擷取 insertId
  2. 使用 setIamPolicy 要求中的 insertId,以 YAML 或 JSON 格式匯出允許政策。
  3. 修改輸出檔案,使其符合先前的有效允許政策,並覆寫目前的允許政策。

找出上次成功的 setIamPolicy 例項,並擷取 insertId

如要找出上次成功執行的 setIamPolicy 執行個體,並擷取 isertId,請使用 Cloud de Confiance 控制台或 gcloud CLI 查看稽核記錄。

控制台

  1. 前往 Cloud de Confiance 控制台的「Logs Explorer」頁面。

    前往 Logs Explorer

  2. 在查詢編輯器中輸入下列任一查詢。這些查詢會在稽核記錄中搜尋 protoPayloadmethodName 欄位含有 SetIamPolicy 的項目:

    • 如要取得資源的所有允許政策變更記錄,請使用下列查詢:

      logName="RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity"
      protoPayload.methodName:SetIamPolicy
      
    • 如要取得涉及特定使用者或服務帳戶的允許政策變更記錄,請使用下列查詢:

      logName="RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity"
      protoPayload.methodName:SetIamPolicy
      protoPayload.serviceData.policyDelta.bindingDeltas.member:"EMAIL_ADDRESS"
      

      更改下列內容:

      • RESOURCE_TYPE:您要列出稽核記錄的資源類型。有效值為 projectsfoldersorganizations
      • RESOURCE_ID:您的 Cloud de Confiance 專案、資料夾或機構 ID。專案 ID 為英數字元,例如 my-project。資料夾和機構 ID 是數字,例如 123456789012
      • EMAIL_ADDRESS:使用者或服務帳戶的電子郵件地址,例如 example-service-account@example-project.s3ns.iam.gserviceaccount.com
  3. 如要執行查詢,請按一下「執行查詢」

  4. 使用「時間軸」選取器,為查詢指定適當的時間範圍。或者,您也可以直接在查詢編輯器中新增時間戳記運算式。詳情請參閱「依時間範圍查看記錄」。

  5. 從變更或刪除前的最後一個成功執行個體複製 setIamPolicyinsertId

gcloud

gcloud logging read 指令會讀取記錄項目。

使用下方的任何指令資料之前,請先替換以下項目:

  • RESOURCE_TYPE:要列出稽核記錄的資源類型。請使用 projectsfoldersorganizations 值。
  • RESOURCE_ID:您的 Cloud de Confiance專案、機構或資料夾 ID。專案 ID 為英數字串,例如 my-project。資料夾和機構 ID 為數字,例如 123456789012
  • TIME_PERIOD:要列出稽核記錄的時間範圍。 傳回的項目不會早於這個值。如未指定,則預設值為 1d。如要瞭解時間格式,請參閱 gcloud topic datetimes
  • RESOURCE_TYPE_SINGULAR:要列出稽核記錄的資源類型。請使用 projectfolderorganization 值。

執行下列指令:

Linux、macOS 或 Cloud Shell

gcloud logging read \
    'logName:RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity
    AND protoPayload.methodName=SetIamPolicy' \
    --freshness=TIME_PERIOD \
    --RESOURCE_TYPE_SINGULAR=RESOURCE_ID

Windows (PowerShell)

gcloud logging read `
    'logName:RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity
    AND protoPayload.methodName=SetIamPolicy' `
    --freshness=TIME_PERIOD `
    --RESOURCE_TYPE_SINGULAR=RESOURCE_ID

Windows (cmd.exe)

gcloud logging read ^
    'logName:RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity
    AND protoPayload.methodName=SetIamPolicy' ^
    --freshness=TIME_PERIOD ^
    --RESOURCE_TYPE_SINGULAR=RESOURCE_ID

複製變更或刪除前,setIamPolicy 上次成功執行個體的 insertId

使用 insertId 匯出允許政策

使用您從上次成功執行的執行個體擷取的 insertId,在 gcloud CLI 中執行下列指令,以 JSON 或 YAML 格式匯出允許政策。setIamPolicy您可以匯出機構和專案的允許政策。

機構層級

gcloud logging read 指令會讀取記錄項目。

使用下方的任何指令資料之前,請先替換以下項目:

  • ORGANIZATION_ID:您要查看及匯出允許政策的機構。
  • INSERT_IDsetIamPolicy要求的 insertId
  • FORMAT:回應格式。使用 jsonyaml
  • TIME_PERIOD:要列出稽核記錄的時間範圍。 傳回的項目不會早於這個值。如未指定,則預設值為 1d。如要瞭解時間格式,請參閱 gcloud topic datetimes
  • OUTPUT_FILE:輸出內容的檔案名稱和副檔名。例如 previous_policy.jsonprevious_policy.yaml

執行下列指令:

Linux、macOS 或 Cloud Shell

gcloud logging read organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com
insertId="INSERT_ID"'
--organization=ORGANIZATION_ID
--format="FORMAT(protoPayload.request.policy)"
--freshness=TIME_PERIOD > OUTPUT_FILE

Windows (PowerShell)

gcloud logging read organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com
insertId="INSERT_ID"'
--organization=ORGANIZATION_ID
--format="FORMAT(protoPayload.request.policy)"
--freshness=TIME_PERIOD > OUTPUT_FILE

Windows (cmd.exe)

gcloud logging read organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com
insertId="INSERT_ID"'
--organization=ORGANIZATION_ID
--format="FORMAT(protoPayload.request.policy)"
--freshness=TIME_PERIOD > OUTPUT_FILE

專案層級

gcloud logging read 指令會讀取記錄項目。

使用下方的任何指令資料之前,請先替換以下項目:

  • INSERT_IDsetIamPolicy 要求的 insertId
  • TIME_PERIOD:要列出稽核記錄的時間範圍。 傳回的項目不會早於這個值。如未指定,則預設值為 1d。如要瞭解時間格式,請參閱 gcloud topic datetimes
  • FORMAT:回應格式。使用 jsonyaml
  • OUTPUT_FILE:要儲存輸出內容的檔案名稱,例如 previous_policy.jsonprevious_policy.yaml

執行下列指令:

Linux、macOS 或 Cloud Shell

gcloud logging read \
'protoPayload.methodName="SetIamPolicy" AND insertId="INSERT_ID"' \
--freshness=TIME_PERIOD \
--format="FORMAT(protoPayload.request.policy)" > OUTPUT_FILE

Windows (PowerShell)

gcloud logging read `
'protoPayload.methodName="SetIamPolicy" AND insertId="INSERT_ID"' `
--freshness=TIME_PERIOD `
--format="FORMAT(protoPayload.request.policy)" > OUTPUT_FILE

Windows (cmd.exe)

gcloud logging read ^
'protoPayload.methodName="SetIamPolicy" AND insertId="INSERT_ID"' ^
--freshness=TIME_PERIOD ^
--format="FORMAT(protoPayload.request.policy)" > OUTPUT_FILE

修改輸出檔案並覆寫目前的允許政策

按照下列方式修改輸出檔案,並覆寫目前的允許政策。

  1. 透過程式或使用文字編輯器修改輸出檔案,刪除下列程式碼行:

     ---
     protoPayload:
        request:
          policy:
    

    產生的檔案會以 auditConfigs: 開頭。

  2. 取得目前的允許政策。

    gcloud

    gcloud get-iam-policy 指令會取得專案、資料夾或機構的允許政策。

    使用下方的任何指令資料之前,請先替換以下項目:

    • RESOURCE_TYPE:要取得允許政策的資源類型。有效值為 projectsresource-manager foldersorganizations

    • RESOURCE_ID:您的 Cloud de Confiance 專案、資料夾或組織 ID。專案 ID 為英數字元,例如 my-project。資料夾和機構 ID 為數字,例如 123456789012

    • FORMAT:允許政策的所需格式。使用 jsonyaml

    • PATH:允許政策的新輸出檔案路徑。

    執行下列指令:

    Linux、macOS 或 Cloud Shell

    gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

    Windows (PowerShell)

    gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

    Windows (cmd.exe)

    gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

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

    gcloud projects get-iam-policy my-project --format json > ~/policy.json

    C#

    如要向 Resource Manager 進行驗證,請設定應用程式預設憑證。 詳情請參閱「事前準備」。

    如要瞭解如何安裝及使用 Resource Manager 的用戶端程式庫,請參閱「Resource Manager 用戶端程式庫」。

    以下範例說明如何取得專案的允許政策。如要瞭解如何取得資料夾或機構的允許政策,請參閱您所用程式設計語言的Resource Manager 用戶端程式庫說明文件

    
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.CloudResourceManager.v1;
    using Google.Apis.CloudResourceManager.v1.Data;
    
    public partial class AccessManager
    {
        public static Policy GetPolicy(string projectId)
        {
            var credential = GoogleCredential.GetApplicationDefault()
                .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
            var service = new CloudResourceManagerService(
                new CloudResourceManagerService.Initializer
                {
                    HttpClientInitializer = credential
                });
    
            var policy = service.Projects.GetIamPolicy(new GetIamPolicyRequest(),
                projectId).Execute();
            return policy;
        }
    }
    

    Java

    如要向 Resource Manager 進行驗證,請設定應用程式預設憑證。 詳情請參閱「事前準備」。

    如要瞭解如何安裝及使用 Resource Manager 的用戶端程式庫,請參閱「Resource Manager 用戶端程式庫」。

    以下範例說明如何取得專案的允許政策。如要瞭解如何取得資料夾或機構的允許政策,請參閱您所用程式設計語言的Resource Manager 用戶端程式庫說明文件

    import com.google.cloud.resourcemanager.v3.ProjectsClient;
    import com.google.iam.admin.v1.ProjectName;
    import com.google.iam.v1.GetIamPolicyRequest;
    import com.google.iam.v1.Policy;
    import java.io.IOException;
    
    public class GetProjectPolicy {
      public static void main(String[] args) throws IOException {
        // TODO(developer): Replace the variables before running the sample.
        // TODO: Replace with your project ID.
        String projectId = "your-project-id";
    
        getProjectPolicy(projectId);
      }
    
      // Gets a project's policy.
      public static Policy getProjectPolicy(String projectId) throws IOException {
        // Initialize client that will be used to send requests.
        // This client only needs to be created once, and can be reused for multiple requests.
        try (ProjectsClient projectsClient = ProjectsClient.create()) {
          GetIamPolicyRequest request = GetIamPolicyRequest.newBuilder()
                  .setResource(ProjectName.of(projectId).toString())
                  .build();
          return projectsClient.getIamPolicy(request);
        }
      }
    }

    Python

    如要向 Resource Manager 進行驗證,請設定應用程式預設憑證。 詳情請參閱「事前準備」。

    如要瞭解如何安裝及使用 Resource Manager 的用戶端程式庫,請參閱「Resource Manager 用戶端程式庫」。

    以下範例說明如何取得專案的允許政策。如要瞭解如何取得資料夾或機構的允許政策,請參閱您所用程式設計語言的Resource Manager 用戶端程式庫說明文件

    from google.cloud import resourcemanager_v3
    from google.iam.v1 import iam_policy_pb2, policy_pb2
    
    
    def get_project_policy(project_id: str) -> policy_pb2.Policy:
        """Get policy for project.
    
        project_id: ID or number of the Google Cloud project you want to use.
        """
    
        client = resourcemanager_v3.ProjectsClient()
        request = iam_policy_pb2.GetIamPolicyRequest()
        request.resource = f"projects/{project_id}"
    
        policy = client.get_iam_policy(request)
        print(f"Policy retrieved: {policy}")
    
        return policy

    REST

    Resource Manager API 的 get-iam-policy 方法會取得專案、資料夾或機構的允許政策。

    使用任何要求資料之前,請先修改下列項目的值:

    • API_VERSION:要使用的 API 版本。如果是專案和機構,請使用 v1。如果是資料夾,請使用 v2
    • RESOURCE_TYPE:要管理政策的資源類型。請使用 projectsfoldersorganizations 值。
    • RESOURCE_ID:您的 Cloud de Confiance專案、機構或資料夾 ID。專案 ID 為英數字串,例如 my-project。資料夾和機構 ID 為數字,例如 123456789012
    • POLICY_VERSION:要傳回的政策版本。要求應指定最新政策版本,也就是政策版本 3。詳情請參閱在取得政策時指定政策版本

    HTTP 方法和網址:

    POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:getIamPolicy

    JSON 要求主體:

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

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

    回應會包含資源的允許政策。例如:

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

    將回應儲存至適當類型的檔案 (jsonyaml)。

  3. 從目前的允許政策複製 etag 值。

  4. 將輸出檔案中的 etag 值,替換為您從目前允許政策複製的 etag 值。輸出檔案中的 etag 必須與目前的 etag 相符,才能啟動新的 setIamPolicy 要求。請確認輸出檔案中 ETag 的間距未變更。

  5. 檢查檔案,確認檔案與先前的有效允許政策相符。建議您建立新專案並套用政策,確保政策能正常運作。

  6. 設定允許政策,以您建立的輸出檔案中的政策,覆寫目前的允許政策。

    gcloud

    gcloud set-iam-policy 指令會將要求中的政策設為專案、資料夾或機構的新允許政策。

    使用下方的任何指令資料之前,請先替換以下項目:

    • RESOURCE_TYPE:要設定允許政策的資源類型。有效值為 projectsresource-manager foldersorganizations

    • RESOURCE_ID:您的 Cloud de Confiance 專案、資料夾或組織 ID。專案 ID 為英數字元,例如 my-project。資料夾和機構 ID 為數字,例如 123456789012

    • PATH:包含新允許政策的檔案路徑。

    執行下列指令:

    Linux、macOS 或 Cloud Shell

    gcloud RESOURCE_TYPE set-iam-policy RESOURCE_ID PATH

    Windows (PowerShell)

    gcloud RESOURCE_TYPE set-iam-policy RESOURCE_ID PATH

    Windows (cmd.exe)

    gcloud RESOURCE_TYPE set-iam-policy RESOURCE_ID PATH

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

    舉例來說,下列指令會將儲存在 policy.json 中的允許政策,設為專案 my-project 的允許政策:

    gcloud projects set-iam-policy my-project ~/policy.json

    C#

    
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.CloudResourceManager.v1;
    using Google.Apis.CloudResourceManager.v1.Data;
    
    public partial class AccessManager
    {
        public static Policy SetPolicy(string projectId, Policy policy)
        {
            var credential = GoogleCredential.GetApplicationDefault()
                .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
            var service = new CloudResourceManagerService(
                new CloudResourceManagerService.Initializer
                {
                    HttpClientInitializer = credential
                });
    
            return service.Projects.SetIamPolicy(new SetIamPolicyRequest
            {
                Policy = policy
            }, projectId).Execute();
        }
    }
    

    Java

    如要向 Resource Manager 進行驗證,請設定應用程式預設憑證。 詳情請參閱「事前準備」。

    如要瞭解如何安裝及使用 Resource Manager 的用戶端程式庫,請參閱「Resource Manager 用戶端程式庫」。

    以下範例說明如何為專案設定允許政策。如要瞭解如何設定資料夾或機構的允許政策,請參閱您所用程式設計語言的Resource Manager 用戶端程式庫文件

    import com.google.cloud.resourcemanager.v3.ProjectsClient;
    import com.google.iam.admin.v1.ProjectName;
    import com.google.iam.v1.Policy;
    import com.google.iam.v1.SetIamPolicyRequest;
    import com.google.protobuf.FieldMask;
    import java.io.IOException;
    import java.util.Arrays;
    import java.util.List;
    
    public class SetProjectPolicy {
      public static void main(String[] args) throws IOException {
        // TODO(developer): Replace the variables before running the sample.
        // TODO: Replace with your project ID.
        String projectId = "your-project-id";
        // TODO: Replace with your policy, GetPolicy.getPolicy(projectId, serviceAccount).
        Policy policy = Policy.newBuilder().build();
    
        setProjectPolicy(policy, projectId);
      }
    
      // Sets a project's policy.
      public static Policy setProjectPolicy(Policy policy, String projectId)
              throws IOException {
    
        // Initialize client that will be used to send requests.
        // This client only needs to be created once, and can be reused for multiple requests.
        try (ProjectsClient projectsClient = ProjectsClient.create()) {
          List<String> paths = Arrays.asList("bindings", "etag");
          SetIamPolicyRequest request = SetIamPolicyRequest.newBuilder()
                  .setResource(ProjectName.of(projectId).toString())
                  .setPolicy(policy)
                  // A FieldMask specifying which fields of the policy to modify. Only
                  // the fields in the mask will be modified. If no mask is provided, the
                  // following default mask is used:
                  // `paths: "bindings, etag"`
                  .setUpdateMask(FieldMask.newBuilder().addAllPaths(paths).build())
                  .build();
    
          return projectsClient.setIamPolicy(request);
        }
      }
    }

    Python

    如要向 Resource Manager 進行驗證,請設定應用程式預設憑證。 詳情請參閱「事前準備」。

    如要瞭解如何安裝及使用 Resource Manager 的用戶端程式庫,請參閱「Resource Manager 用戶端程式庫」。

    以下範例說明如何為專案設定允許政策。如要瞭解如何設定資料夾或機構的允許政策,請參閱您所用程式設計語言的Resource Manager 用戶端程式庫文件

    from google.cloud import resourcemanager_v3
    from google.iam.v1 import iam_policy_pb2, policy_pb2
    
    
    def set_project_policy(
        project_id: str, policy: policy_pb2.Policy, merge: bool = True
    ) -> policy_pb2.Policy:
        """
        Set policy for project. Pay attention that previous state will be completely rewritten.
        If you want to update only part of the policy follow the approach read->modify->write.
        For more details about policies check out https://cloud.google.com/iam/docs/policies
    
        project_id: ID or number of the Google Cloud project you want to use.
        policy: Policy which has to be set.
        merge: The strategy to be used forming the request. CopyFrom is clearing both mutable and immutable fields,
        when MergeFrom is replacing only immutable fields and extending mutable.
        https://googleapis.dev/python/protobuf/latest/google/protobuf/message.html#google.protobuf.message.Message.CopyFrom
        """
        client = resourcemanager_v3.ProjectsClient()
    
        request = iam_policy_pb2.GetIamPolicyRequest()
        request.resource = f"projects/{project_id}"
        current_policy = client.get_iam_policy(request)
    
        # Etag should as fresh as possible to lower chance of collisions
        policy.ClearField("etag")
        if merge:
            current_policy.MergeFrom(policy)
        else:
            current_policy.CopyFrom(policy)
    
        request = iam_policy_pb2.SetIamPolicyRequest()
        request.resource = f"projects/{project_id}"
    
        # request.etag field also will be merged which means you are secured from collision,
        # but it means that request may fail and you need to leverage exponential retries approach
        # to be sure policy has been updated.
        request.policy.CopyFrom(current_policy)
    
        policy = client.set_iam_policy(request)
        return policy
    
    

    REST

    Resource Manager API 的 set-iam-policy 方法會將要求中的政策設為專案、資料夾或機構的新允許政策。

    使用任何要求資料之前,請先修改下列項目的值:

    • API_VERSION:要使用的 API 版本。如果是專案和機構,請使用 v1。如果是資料夾,請使用 v2
    • RESOURCE_TYPE:要管理政策的資源類型。請使用 projectsfoldersorganizations 值。
    • RESOURCE_ID:您的 Cloud de Confiance專案、機構或資料夾 ID。專案 ID 為英數字串,例如 my-project。資料夾和機構 ID 為數字,例如 123456789012
    • POLICY:您要設定的政策的 JSON 表示法。如要進一步瞭解政策格式,請參閱政策參考資料

    HTTP 方法和網址:

    POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:setIamPolicy

    JSON 要求主體:

    {
      "policy": POLICY
    }
    

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

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