本页面介绍了如何在意外更改或意外删除 IAM 允许政策后恢复到之前的版本。
如需恢复之前的 IAM 政策,请找到更改或删除操作之前的最后一次成功 setIamPolicy,并使用它来恢复政策。
所需的角色
如需获得恢复之前的允许政策所需的权限,请让管理员向您授予项目、文件夹或组织的以下 IAM 角色:
-
使用
setIamPolicy恢复允许政策:- Logging Viewer (
roles/logging.viewer) - Organization Administrator (
roles/resourcemanager.organizationAdmin) - Owner (
roles/owner)
- Logging Viewer (
-
使用 Cloud Asset Inventory 恢复允许政策:
Cloud Asset Owner (
roles/cloudasset.owner)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
使用setIamPolicy 恢复允许政策时,组织级和文件夹级允许政策需要组织管理员角色,项目级允许政策需要所有者角色。
恢复具有上次成功 setIamPolicy 实例的允许政策
如需将允许政策恢复到之前的版本,您可以查看审核日志,找到更改或删除操作之前最后一次成功执行 setIamPolicy 的实例,然后使用该实例中的信息来恢复政策。此过程包括以下步骤:
- 确定允许政策的最后一个成功
setIamPolicy实例,并检索insertId。 - 使用
setIamPolicy请求中的insertId以 YAML 或 JSON 格式导出允许政策。 - 修改输出文件,使其与之前的有效允许政策相匹配,并替换当前的允许政策。
确定 setIamPolicy 的上次成功实例并检索 insertId
如需确定 setIamPolicy 的上次成功运行实例并检索 isertId,请使用 Google Cloud 控制台或 gcloud CLI 查看审核日志。
控制台
在 Google Cloud 控制台中,前往 Logs Explorer 页面。
在查询编辑器中,输入以下任一查询。这些查询会在您的审核日志中搜索
protoPayload的methodName字段中包含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:要为其列出审核日志的资源类型。有效值为projects、folders或organizations。RESOURCE_ID:您的 Google Cloud 项目、文件夹或组织 ID。项目 ID 为字母数字,例如my-project。文件夹和组织 ID 是数字,例如123456789012。EMAIL_ADDRESS:用户或服务账号的电子邮件地址,例如example-service-account@example-project.iam.gserviceaccount.com。
如需运行查询,请点击运行查询。
使用时间轴选择器为查询指定适当的时间范围。或者,您也可以直接向查询编辑器添加时间戳表达式。如需了解详情,请参阅按时间范围查看日志。
从更改或删除之前的最后一个成功实例中复制
setIamPolicy的insertId。
gcloud
gcloud logging read 命令用于读取日志条目。
在使用下面的命令数据之前,请先进行以下替换:
-
RESOURCE_TYPE:要为其列出审核日志的资源类型。使用值projects、folders或organizations。 -
RESOURCE_ID:您的 Google Cloud项目、组织或文件夹 ID。项目 ID 是字母数字字符串,例如my-project。文件夹和组织 ID 是数字,例如123456789012。 -
TIME_PERIOD:要为其列出审核日志的时间段。返回的条目不会早于此值。如果未指定,则默认值为1d。如需了解时间格式,请参阅 gcloud topic datetimes。 -
RESOURCE_TYPE_SINGULAR:要为其列出审核日志的资源类型。使用值project、folder或organization。
执行以下命令:
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_ID:setIamPolicy请求的insertId。 -
FORMAT:响应的格式。请使用json或yaml。 -
TIME_PERIOD:要为其列出审核日志的时间段。返回的条目不会早于此值。如果未指定,则默认值为1d。如需了解时间格式,请参阅 gcloud topic datetimes。 -
OUTPUT_FILE:输出的文件名和扩展名。例如,previous_policy.json或previous_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_ID:setIamPolicy请求的insertId。 -
TIME_PERIOD:要为其列出审核日志的时间段。返回的条目不会早于此值。如果未指定,则默认值为1d。如需了解时间格式,请参阅 gcloud topic datetimes。 -
FORMAT:响应的格式。请使用json或yaml。 -
OUTPUT_FILE:要保存输出的文件名,例如previous_policy.json或previous_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
修改输出文件并替换当前允许政策
按以下方式修改输出文件,并替换当前的允许政策。
以编程方式或使用文本编辑器修改输出文件,方法是删除以下行:
--- protoPayload: request: policy:生成的文件以
auditConfigs:开头。获取当前允许政策。
gcloud
gcloud get-iam-policy命令可获取项目、文件夹或组织的允许政策。在使用下面的命令数据之前,请先进行以下替换:
-
RESOURCE_TYPE:要获取允许政策的资源类型。有效值为projects、resource-manager folders或organizations。 -
RESOURCE_ID:您的 Google Cloud 项目、文件夹或组织 ID。项目 ID 为字母数字,例如my-project。文件夹和组织 ID 是数字,例如123456789012。 -
FORMAT:允许政策所需的格式。请使用json或yaml。 -
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 客户端库文档。
Java
如需向 Resource Manager 进行身份验证,请设置应用默认凭证。如需了解更多信息,请参阅准备工作。
如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库。
以下示例展示了如何获取项目的允许政策。如需了解如何获取文件夹或组织的允许政策,请查看适合您的编程语言的 Resource Manager 客户端库文档。
Python
如需向 Resource Manager 进行身份验证,请设置应用默认凭证。如需了解更多信息,请参阅准备工作。
如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库。
以下示例展示了如何获取项目的允许政策。如需了解如何获取文件夹或组织的允许政策,请查看适合您的编程语言的 Resource Manager 客户端库文档。
REST
Resource Manager API 的
get-iam-policy方法可获取项目、文件夹或组织的允许政策。在使用任何请求数据之前,请先进行以下替换:
API_VERSION:要使用的 API 版本。对于项目和组织,请使用v1。对于文件夹,请使用v2。RESOURCE_TYPE:您要管理其政策的资源类型。使用值projects、folders或organizations。RESOURCE_ID:您的 Google Cloud项目、组织或文件夹 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": [ "user:my-user@example.com" ] } ] }将响应保存在相应类型(
json或yaml)的文件中。-
从当前允许政策中复制
etag值。将输出文件中的
etag值替换为您从当前允许政策中复制的etag值。输出文件中的etag必须与当前的etag一致,才能发起新的setIamPolicy请求。确保输出文件中 etag 的间距未发生变化。检查该文件,确保其与之前的有效允许政策一致。您可以考虑创建一个新项目并应用该政策,以确保其按预期运行。
设置允许政策,以使用您创建的输出文件中的政策替换当前的允许政策。
gcloud
gcloud set-iam-policy命令会将请求中的政策设置为项目、文件夹或组织的新允许政策。在使用下面的命令数据之前,请先进行以下替换:
-
RESOURCE_TYPE:您要设置允许政策的资源的类型。有效值为projects、resource-manager folders或organizations。 -
RESOURCE_ID:您的 Google Cloud 项目、文件夹或组织 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#
Java
如需向 Resource Manager 进行身份验证,请设置应用默认凭证。如需了解更多信息,请参阅准备工作。
如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库。
以下示例展示了如何设置项目的允许政策。如需了解如何设置文件夹或组织的允许政策,请查看适合您的编程语言的 Resource Manager 客户端库文档。
Python
如需向 Resource Manager 进行身份验证,请设置应用默认凭证。如需了解更多信息,请参阅准备工作。
如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库。
以下示例展示了如何设置项目的允许政策。如需了解如何设置文件夹或组织的允许政策,请查看适合您的编程语言的 Resource Manager 客户端库文档。
REST
Resource Manager API 的
set-iam-policy方法会将请求中的政策设置为项目、文件夹或组织的新允许政策。在使用任何请求数据之前,请先进行以下替换:
API_VERSION:要使用的 API 版本。对于项目和组织,请使用v1。对于文件夹,请使用v2。RESOURCE_TYPE:您要管理其政策的资源类型。使用值projects、folders或organizations。RESOURCE_ID:您的 Google Cloud项目、组织或文件夹 ID。项目 ID 是字母数字字符串,例如my-project。文件夹和组织 ID 是数字,例如123456789012。-
POLICY:您要设置的政策的 JSON 格式。如需详细了解政策的格式,请参阅政策参考。
HTTP 方法和网址:
POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:setIamPolicy
请求 JSON 正文:
{ "policy": POLICY }如需发送您的请求,请展开以下选项之一:
响应包含更新后的允许政策。
-
使用 Cloud Asset Inventory 恢复允许政策
如需将允许政策恢复到之前的版本,您可以使用 Cloud Asset Inventory 查看资源允许政策的更改历史记录,并使用该信息来恢复政策。此过程包括以下步骤:
- 使用 Cloud Asset Inventory 查看允许政策的更改历史记录,并确定要恢复的允许政策。
- 复制允许政策,并以 JSON 格式创建一个新文件。
- 使用新文件中的允许政策替换当前允许政策。
使用 Cloud Asset Inventory 查看允许政策变更历史记录
控制台
在 Google Cloud 控制台中,前往 Asset Inventory 页面。
点击 IAM 政策标签页。
在过滤条件字段中运行以下查询:
Resource :
RESOURCE_ID将
RESOURCE_ID替换为您的 Google Cloud项目、文件夹或组织 ID。项目 ID 为字母数字,例如my-project。文件夹和组织 ID 是数字,例如123456789012。如需查看资源的许可政策的更改历史记录,请点击资源的名称,然后选择更改历史记录标签页。
如需比较对资源的许可政策所做的任何更改,请从选择要进行比较的记录菜单中选择两个带时间戳的不同记录。
gcloud
gcloud asset get-history 命令会获取与时间窗口重叠的资产的允许政策的更新历史记录。
在使用下面的命令数据之前,请先进行以下替换:
-
RESOURCE_TYPE:要为其列出审核日志的资源类型。使用值project、folder或organization。 -
RESOURCE_ID:您的 Google Cloud项目、组织或文件夹 ID。项目 ID 是字母数字字符串,例如my-project。文件夹和组织 ID 是数字,例如123456789012。 -
ASSET_NAME:您要查看其允许政策历史记录的资源的格式化资源名称的英文逗号分隔列表。例如//cloudresourcemanager.googleapis.com/projects/my-project。这些资源可以是接受允许政策的任何资源类型。 -
START_TIME:时间范围的开始时间。最大时间范围为 7 天。该值必须是当前时间或过去不超过 35 天的时间。如需了解时间格式,请参阅 gcloud topic datetimes。 -
END_TIME:可选。时间范围的结束点。最大时间范围为 7 天。该值必须是当前时间或过去不超过 35 天的时间。如果未提供,则结束时间将被视为当前时间。如需了解时间格式,请参阅 gcloud topic datetimes。
执行以下命令:
Linux、macOS 或 Cloud Shell
gcloud asset get-history \ --RESOURCE_TYPE=RESOURCE_ID \ --asset-names=ASSET_NAME_1,ASSET_NAME_2,... \ --content-type=iam-policy \ --start-time=START_TIME \ --end-time=END_TIME
Windows (PowerShell)
gcloud asset get-history ` --RESOURCE_TYPE=RESOURCE_ID ` --asset-names=ASSET_NAME_1,ASSET_NAME_2,... ` --content-type=iam-policy ` --start-time=START_TIME ` --end-time=END_TIME
Windows (cmd.exe)
gcloud asset get-history ^ --RESOURCE_TYPE=RESOURCE_ID ^ --asset-names=ASSET_NAME_1,ASSET_NAME_2,... ^ --content-type=iam-policy ^ --start-time=START_TIME ^ --end-time=END_TIME
响应包含更新后的允许政策历史记录。
创建新的允许政策文件
查看允许政策历史记录并确定要恢复的允许政策后,请完成以下步骤。
复制您要恢复的允许政策,从
"bindings"行复制到"etag"行。将复制的允许政策粘贴到新文件中,并使用大括号 (
{}) 将政策括起来。例如,允许政策可能如下所示:{ "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", }以 JSON 格式保存文件。例如,您可以将新文件命名为
previous_iam_policy.json。
设置新的允许政策
设置允许政策,以使用您创建的输出文件中的政策替换当前的允许政策。
gcloud
gcloud set-iam-policy 命令会将请求中的政策设置为项目、文件夹或组织的新允许政策。
在使用下面的命令数据之前,请先进行以下替换:
-
RESOURCE_TYPE:您要设置允许政策的资源的类型。有效值为projects、resource-manager folders或organizations。 -
RESOURCE_ID:您的 Google Cloud 项目、文件夹或组织 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#
Java
如需向 Resource Manager 进行身份验证,请设置应用默认凭证。如需了解更多信息,请参阅准备工作。
如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库。
以下示例展示了如何设置项目的允许政策。如需了解如何设置文件夹或组织的允许政策,请查看适合您的编程语言的 Resource Manager 客户端库文档。
Python
如需向 Resource Manager 进行身份验证,请设置应用默认凭证。如需了解更多信息,请参阅准备工作。
如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库。
以下示例展示了如何设置项目的允许政策。如需了解如何设置文件夹或组织的允许政策,请查看适合您的编程语言的 Resource Manager 客户端库文档。
REST
Resource Manager API 的 set-iam-policy 方法会将请求中的政策设置为项目、文件夹或组织的新允许政策。
在使用任何请求数据之前,请先进行以下替换:
API_VERSION:要使用的 API 版本。对于项目和组织,请使用v1。对于文件夹,请使用v2。RESOURCE_TYPE:您要管理其政策的资源类型。使用值projects、folders或organizations。RESOURCE_ID:您的 Google Cloud项目、组织或文件夹 ID。项目 ID 是字母数字字符串,例如my-project。文件夹和组织 ID 是数字,例如123456789012。-
POLICY:您要设置的政策的 JSON 格式。如需详细了解政策的格式,请参阅政策参考。
HTTP 方法和网址:
POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:setIamPolicy
请求 JSON 正文:
{
"policy": POLICY
}
如需发送您的请求,请展开以下选项之一:
响应包含更新后的允许政策。