恢复 IAM 允许政策的先前版本

本页面介绍了如何在意外更改或意外删除 IAM 允许政策后恢复到之前的版本。

如需恢复之前的 IAM 政策,请找到更改或删除操作之前的最后一次成功 setIamPolicy,并使用它来恢复政策。

所需的角色

如需获得恢复之前的允许政策所需的权限,请让管理员向您授予项目、文件夹或组织的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

使用 setIamPolicy 恢复允许政策时,组织级和文件夹级允许政策需要组织管理员角色,项目级允许政策需要所有者角色。

您也可以使用自定义角色或其他预定义角色来获取这些权限。

恢复具有上次成功 setIamPolicy 实例的允许政策

如需将允许政策恢复到之前的版本,您可以查看审核日志,找到更改或删除操作之前最后一次成功执行 setIamPolicy 的实例,然后使用该实例中的信息来恢复政策。此过程包括以下步骤:

  1. 确定允许政策的最后一个成功 setIamPolicy 实例,并检索 insertId
  2. 使用 setIamPolicy 请求中的 insertId 以 YAML 或 JSON 格式导出允许政策。
  3. 修改输出文件,使其与之前的有效允许政策相匹配,并替换当前的允许政策。

确定 setIamPolicy 的上次成功实例并检索 insertId

如需确定 setIamPolicy 的上次成功运行实例并检索 isertId,请使用 Google Cloud 控制台或 gcloud CLI 查看审核日志。

控制台

  1. 在 Google Cloud 控制台中,前往 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:您的 Google Cloud 项目、文件夹或组织 ID。项目 ID 为字母数字,例如 my-project。文件夹和组织 ID 是数字,例如 123456789012
      • EMAIL_ADDRESS:用户或服务账号的电子邮件地址,例如 example-service-account@example-project.
  3. 如需运行查询,请点击运行查询

  4. 使用时间轴选择器为查询指定适当的时间范围。或者,您也可以直接向查询编辑器添加时间戳表达式。如需了解详情,请参阅按时间范围查看日志

  5. 从更改或删除之前的最后一个成功实例中复制 setIamPolicyinsertId

gcloud

gcloud logging read 命令用于读取日志条目。

在使用下面的命令数据之前,请先进行以下替换:

  • RESOURCE_TYPE:要为其列出审核日志的资源类型。使用值 projectsfoldersorganizations
  • RESOURCE_ID:您的 Google Cloud项目、组织或文件夹 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 导出允许政策

使用从上次成功运行 setIamPolicy 时检索到的 insertId,在 gcloud CLI 中运行以下命令,以导出 JSON 或 YAML 格式的许可政策。您可以导出组织和项目的允许政策。

组织级层

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:您的 Google Cloud 项目、文件夹或组织 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)
        {