

# 使用 IAM policy simulator 测试 IAM 策略
<a name="access_policies_testing-policies"></a>

使用 IAM 策略模拟器，您可以测试您提供的基于身份的策略、IAM 权限边界、服务控制策略（SCP）和基于资源的策略。您可以模拟 AWS 如何根据这些策略评估请求，而不会向任何 AWS 服务发送真实请求。每次模拟都会为测试的每个操作和资源返回一个二进制授权结果：操作要么被允许，要么被拒绝。当结果为允许或显式拒绝时，模拟器还会显示产生此结果的策略，以便您了解并修复原因。

有关如何以及为何使用 IAM policy 的更多信息，请参阅。[AWS Identity and Access Management 中的策略和权限](access_policies.md)

**重要**  
策略模拟器的结果可能与您的实时 AWS 环境不同。我们建议您在使用策略模拟器进行测试后，根据真实 AWS 环境检查您的策略，以确认您获得了预期的结果。有关更多信息，请参阅 [IAM policy simulator 的工作方式](#policies_policy-simulator-how-it-works)。

以下屏幕截图显示了 IAM 策略模拟器，您可以在其中选择身份及其策略，并在运行模拟之前选择要测试的操作和资源。

![主体模式下的 IAM 策略模拟器控制台。](https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/policysim-console-screenshot-1.png)


**Topics**
+ [策略模拟器模式](#policies_policy-simulator-modes)
+ [您可以使用策略模拟器执行的操作](#policies_policy-simulator-what-you-can-do)
+ [IAM policy simulator 的工作方式](#policies_policy-simulator-how-it-works)
+ [IAM 策略模拟器中的条件键评估的工作原理](#policies_policy-simulator-condition-keys)
+ [使用策略模拟器所需的权限](permissions-required_policy-simulator.md)
+ [如何模拟策略](policies_policy-simulator-how-to.md)

## 策略模拟器模式
<a name="policies_policy-simulator-modes"></a>

策略模拟器有两种模式。请根据您的需求选择相应模式：是测试账户中已存在的策略，还是测试仍在起草中的策略。

**主体模式**  
在主体模式下，您可以测试已附加到现有 IAM 用户、角色或组的策略。为模拟选择一个身份，模拟器将评估附加到此身份的策略。您还可以在模拟中包含或排除自定义身份策略或权限边界。这些新增内容将模拟为附加到主体，而不会实际附加到 IAM 中，因此您的账户保持不变。

**自定义模式**  
在自定义模式下，您可以测试一个或多个自行编写或粘贴的策略。要在附加策略之前检查策略，这非常有用。自定义策略将单独进行模拟，不会保存到您的账户中。

有关选择模式和运行模拟的详细分步说明，请参阅[如何模拟策略](policies_policy-simulator-how-to.md)。

## 您可以使用策略模拟器执行的操作
<a name="policies_policy-simulator-what-you-can-do"></a>

以下是您可以使用策略模拟器执行的一些常见操作。请参阅[如何模拟策略](policies_policy-simulator-how-to.md)，了解更详细的分步指南以及 API 与控制台行为之间的区别。
+ 测试基于身份的策略，无论这些策略是已附加到 IAM 用户、组或角色的策略，还是您编写或粘贴的新策略，都能测试。对于附加了多个策略的身份，您可以同时测试所有策略，也可以选择单个策略，然后查看特定资源的允许或拒绝的操作。新策略的评估方式与附加到身份时相同，不会实际附加到账户中；策略仅在模拟中使用，不会保存到您的账户中。
+ 测试限制性控制对访问权限的效果。一次只能模拟一个权限边界。如果您的 AWS 账户是 [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/) 中某个组织的成员，则您还可以测试服务控制策略（SCP）对基于身份的策略的影响。模拟器会告知您 SCP 是允许还是拒绝某项操作，但出于安全考虑，模拟器不会像处理其他策略类型那样显示 SCP 的匹配语句。
+ 测试您提供的基于资源的策略的效果。模拟器不会为您检索资源的策略，但在控制台中检索除外。要在模拟中包含基于资源的策略，您需要同时提供策略与资源。
+ 在真实条件下测试特定服务、操作和资源，并确定影响结果的因素。例如，您可以测试策略是否允许在 Amazon S3 中对特定存储桶执行 `ListAllMyBuckets`、`CreateBucket` 和 `DeleteBucket` 操作，并提供上下文键，例如所测试策略的 `Condition` 元素中引用的 IP 地址或日期。对于每个结果，模拟器都会识别允许或拒绝了访问的特定语句；匹配的语句可能来自您提供的基于身份的策略和基于资源的策略。

## IAM policy simulator 的工作方式
<a name="policies_policy-simulator-how-it-works"></a>

当您运行模拟时，策略模拟器会针对请求来评估范围内的策略、范围内的任何 SCP 以及您提供的输入，例如操作、资源和上下文键值。在自定义模式下，您可以直接提供策略。在主体模式下，模拟器使用附加到所选身份的策略，您可以在模拟中包含或排除更多策略。每个操作和资源的结果是一个二进制结果：允许或拒绝。

策略模拟器在以下几方面与真实 AWS 环境不同：
+ 策略模拟器不会发出真实的 AWS 服务请求，因此您可以安全地测试那些在真实 AWS 环境中可能会产生意外更改的请求。模拟器不使用生产环境中的真实上下文键值，且因为操作实际上并未运行，所以不会返回任何服务响应。唯一的结果是每个请求的操作是被允许还是被拒绝。
+ 如果您在策略模拟器中编辑策略，所做的更改只会影响模拟。您的 AWS 账户 中的相应策略保持不变。
+ 策略模拟器会评估 SCP，包括拒绝语句中的条件键和资源范围限定，但模拟器不支持资源控制策略（RCP）。对于某些高级配置，例如 VPC 端点策略、角色链或单个资源上的多个基于资源的策略，模拟结果仍可能与实际行为有所不同。
+ 跨账户模拟会在 `EvalDecisionDetails` 中返回按策略类型（身份策略和资源策略）划分的决策。

## IAM 策略模拟器中的条件键评估的工作原理
<a name="policies_policy-simulator-condition-keys"></a>

许多策略使用依赖条件键的 `Condition` 元素，例如 `aws:RequestedRegion` 或 `aws:MultiFactorAuthPresent`。运行模拟时，策略模拟器会从两个来源获取条件键的值：模拟器自动填充的值和您作为模拟输入提供的值。如果某个值不满足条件，则操作将被拒绝。

**模拟器自动填充的上下文**  
模拟器为评估填充以下主体和组织上下文键：
+ 主体上下文：`aws:PrincipalAccount`、`aws:PrincipalId`、`aws:PrincipalType`、`aws:Type`、`aws:UserId`、`aws:UserName`
+ 组织上下文：`aws:PrincipalOrgID`、`aws:PrincipalOrgMasterAccountId`、`aws:PrincipalOrgPaths`

由于这些键已自动填充，使用主体或组织条件的 SCP 及其他策略均可正确评估。您需要为策略引用的所有其他条件键提供值。查看您正在测试的策略中的 `Condition` 元素，并为不在上述列表中的任何键提供值。

**全局条件键和服务支持**  
对于基于身份的策略和基于资源的策略，模拟器不会确定哪些服务支持将给定的全局条件键用于授权。例如，策略模拟器不会识别某个服务不支持 `aws:TagKeys`。相比之下，服务控制策略（SCP）使用服务感知逻辑进行评估，包括 `aws:RequestedRegion` 和 `aws:PrincipalAccount` 等全局条件键。有关条件键的更多信息，请参阅 [AWS 全局条件上下文键](reference_policies_condition-keys.md)。

**服务控制策略（SCP）中的条件键**  
模拟器会评估 SCP 中的条件键和资源范围。如何为这些条件键提供值取决于模拟的运行方式：
+ 使用 AWS CLI 或 AWS API，您可以为 SCP 引用的条件键提供值。
+ 在 IAM 控制台中，您只能为基于身份的策略、权限边界或基于资源的策略中出现的条件键设置值。如果条件键仅由 SCP 引用，则无法在控制台中为其设置值。但是，如果同一条件键也出现在其他某个策略中，则您设置的值将在整个评估过程中使用，包括 SCP。

出于安全考虑，SCP 评估不会返回缺失的上下文值。您仍会收到相关请求的允许或拒绝决策。