

# 如何模拟策略
<a name="policies_policy-simulator-how-to"></a>

您可以在 IAM 控制台中运行模拟，也可以使用 Amazon CLI 和 Amazon API 运行模拟。如需有关模拟器评估的内容、两种模式以及如何得出结果的概述，请参阅[使用 IAM policy simulator 测试 IAM 策略](access_policies_testing-policies.md)。有关所需权限，请参阅[使用策略模拟器所需的权限](permissions-required_policy-simulator.md)。

**Topics**
+ [模拟策略（控制台）](#policies_policy-simulator-how-to-console)
+ [模拟策略（Amazon CLI 和 Amazon API）](#policies_policy-simulator-how-to-cli-api)

## 模拟策略（控制台）
<a name="policies_policy-simulator-how-to-console"></a>

您可以通过 [IAM 控制台](https://console.amazonaws.cn/iam/)中的策略模拟器运行模拟。在导航窗格中，选择**策略模拟器**。

**注意**  
[https://policysim.aws.amazon.com/](https://policysim.aws.amazon.com/) 中的独立策略模拟器控制台已不再维护。在 IAM 控制台中使用策略模拟器。

### 主体模式
<a name="policies_policy-simulator-how-to-console-principal"></a>

#### 选择身份
<a name="policies_policy-simulator-how-to-console-principal-select"></a>

首先，您需要选择身份。您可以在该账户中选择 IAM 用户、角色或组。选择后，侧面板将填充附加到这些身份的策略。

#### 包含或排除策略
<a name="policies_policy-simulator-how-to-console-principal-include-exclude"></a>

侧面板列出了模拟范围内的策略，包括内联策略、Amazon 托管式策略和客户管理型策略，以及任何权限边界。您可以排除某个策略，以查看无此策略时结果会如何变化，然后再将其重新包含策略。排除授予了访问权限的策略会将结果更改为隐式拒绝。

#### 添加操作和资源
<a name="policies_policy-simulator-how-to-console-principal-actions-resources"></a>

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


在左侧面板中选择身份和策略后，添加要测试的操作。对于支持资源选择的操作，可以针对所有资源进行测试，也可以输入一个或多个特定的资源 ARN。多项操作使用相同的资源类型时，您可以将一个资源同时应用于所有这些操作，也可以将其范围限定为一项操作。

![IAM 策略模拟器中的操作，只需要一种资源类型。](https://docs.amazonaws.cn/IAM/latest/UserGuide/images/policysim-console-screenshot-2.png)


某些操作需要一组相关的资源类型，模拟器才能对其进行评估。例如，在模拟 `ec2:RunInstances` 时，控制台会提示您同时指定映像、实例和安全组，并指定子网或卷（取决于使用场景）。

![IAM 策略模拟器中的操作，需要多种资源类型。](https://docs.amazonaws.cn/IAM/latest/UserGuide/images/policysim-console-screenshot-3.png)


#### 提供条件键值
<a name="policies_policy-simulator-how-to-console-principal-condition-keys"></a>

如果您测试的策略包含条件键，模拟器会列出相关的键，并允许您在运行模拟之前设置值。显示的键反映了当前选择的策略，因此选择或取消选择策略，都会相应地添加或移除其键。如果某个值不满足条件，则操作将被拒绝。

模拟器在两个位置提供条件键的值。**全局请求条件**适用于整个模拟请求。这些键以 `aws:` 开头，例如 `aws:MultiFactorAuthPresent` 或 `aws:PrincipalServiceNamesList`，您只需在全局条件区域中设置其值一次即可。选择或清除策略会添加或移除其全局键，您输入的值在调整范围内策略时将予以保留。**特定于服务的条件**适用于单项操作。每个操作行都会显示其引用的条件数量，您可以打开该行，为该操作设置特定于服务的键，例如 `cloudwatch:namespace` 用于 `cloudwatch:PutMetricData`，或 `ram:PermissionResourceType` 用于 `ram:ListPermissionAssociations`。操作行可以同时包含全局键和特定于服务的键，如果任何值不满足条件，则该操作将被拒绝。

IAM 策略模拟器会自动为您填充部分主体和组织上下文键，其余键的值则需由您提供。有关自动填充的键列表以及条件键评估方式的更多信息，请参阅 [IAM 策略模拟器中的条件键评估的工作原理](access_policies_testing-policies.md#policies_policy-simulator-condition-keys)。

要了解如何使用条件键，请参阅 [Amazon 全局条件上下文键](reference_policies_condition-keys.md)。

#### 测试权限边界
<a name="policies_policy-simulator-how-to-console-principal-boundary"></a>

身份具有权限边界时，权限边界将显示在侧面板中，并默认包含在内。如果您想确定边界是否是某项操作被拒绝的原因，也可以排除该边界，然后再次运行模拟。

例如，假设您针对其边界不允许 `iam:DeleteRole` 的身份运行模拟。结果是拒绝，归因于权限边界。如果您随后添加了允许该操作且排除边界的策略，结果将变为允许。这证实了边界是阻止该操作的唯一控制因素。

![IAM 策略模拟器中归因于权限边界的模拟结果。](https://docs.amazonaws.cn/IAM/latest/UserGuide/images/policysim-console-screenshot-4.png)


#### 包含服务控制策略
<a name="policies_policy-simulator-how-to-console-principal-scp"></a>

如果您的账户是某个组织的成员，则可以通过侧面板将服务控制策略（SCP）包含在模拟中。模拟器会在确定结果时评估 SCP 中自动填充的条件键和资源范围。当 SCP 明确拒绝某项操作时，结果为归因于 Amazon Organizations 的显式拒绝，且其他策略中的允许无法覆盖该拒绝。关闭该控制因素再重新运行模拟，以查看不受组织控制因素影响时的结果。有关自动填充的条件键列表，请参阅 [IAM 策略模拟器中的条件键评估的工作原理](access_policies_testing-policies.md#policies_policy-simulator-condition-keys)。

**注意**  
出于安全考虑，模拟器不会显示 SCP 评估的详细信息。仅供 SCP 引用的条件键不会列出来供您设置值，且针对某一结果返回的匹配语句也不包含来自 SCP 的语句。键和匹配语句来自附加到身份的基于身份的策略，以及您提供的任何策略。

#### 测试基于资源的策略
<a name="policies_policy-simulator-how-to-console-principal-resource-policy"></a>

要在控制台模拟中加入基于资源的策略，请输入特定的资源 ARN，然后选择可包含资源策略的选项。基于资源的策略会显示在侧面板中，并在结果中进行评估。在控制台中，此功能适用于 Amazon S3 存储桶、Amazon SQS 队列、Amazon SNS 主题和 Amazon Glacier 保管库。

**注意**  
IAM 角色不支持基于资源的策略模拟。

#### 查看结果
<a name="policies_policy-simulator-how-to-console-principal-results"></a>

结果表中的每一行均显示操作是被允许、隐式拒绝还是显示拒绝，并附有对结果的简短说明。使用说明来确定由哪个策略或控制因素决定了结果，例如显示允许、缺少匹配语句、权限边界或组织控制因素。

### 自定义模式
<a name="policies_policy-simulator-how-to-console-custom"></a>

在自定义模式下，您可以使用 IAM 策略编辑器编写或粘贴基于身份的策略和权限边界。这些策略不会附加到任何身份，可在应用之前对其进行评估。您可以包含多个基于身份的策略，但只能包含一个用于模拟的权限边界。

**注意**  
在自定义模式下，控制台不支持传入自定义 SCP 或模拟基于资源的策略。要模拟自定义 SCP 或基于资源的策略，请使用 Amazon CLI 或 Amazon API。

![自定义模式下的 IAM 策略模拟器控制台。](https://docs.amazonaws.cn/IAM/latest/UserGuide/images/policysim-console-screenshot-5.png)


## 模拟策略（Amazon CLI 和 Amazon API）
<a name="policies_policy-simulator-how-to-cli-api"></a>

使用 Amazon CLI 或 Amazon API 模拟策略通常需要两个步骤：

1. 评估策略并返回策略引用的上下文键列表，以便您了解需要提供哪些上下文键值。此为可选步骤。

1. 模拟策略，在模拟过程中提供要使用的操作、资源和上下文键值。

每个操作都与每个资源配对，模拟将确定策略对该资源是允许还是拒绝该操作。您还可以为策略引用的任何上下文键提供值。如果没有为上下文键提供值，模拟仍会运行并返回隐式拒绝，缺少的键将在 `missingContextValues` 中返回，以便您了解需要添加哪些值。如果缺少的上下文键仅供 SCP 引用，则出于安全原因，该键不会返回，但您仍会收到决策结果。

API 操作分为两组：
+ 仅模拟以字符串形式直接传递给 API 的策略的操作：[GetContextKeysForCustomPolicy](https://docs.amazonaws.cn/IAM/latest/APIReference/API_GetContextKeysForCustomPolicy.html) 和 [SimulateCustomPolicy](https://docs.amazonaws.cn/IAM/latest/APIReference/API_SimulateCustomPolicy.html)。
+ 模拟附加到指定 IAM 用户、用户组、角色或资源的策略的操作：[GetContextKeysForPrincipalPolicy](https://docs.amazonaws.cn/IAM/latest/APIReference/API_GetContextKeysForPrincipalPolicy.html) 和 [SimulatePrincipalPolicy](https://docs.amazonaws.cn/IAM/latest/APIReference/API_SimulatePrincipalPolicy.html)。这些操作可能会显示分配给其他 IAM 实体的权限，因此建议限制可以使用这些操作的用户。

这些操作还支持：
+ [SimulateCustomPolicy](https://docs.amazonaws.cn/IAM/latest/APIReference/API_SimulateCustomPolicy.html) 上的 `OrderedOrganizationPolicyInputList`，您可以在不使用实际主体的情况下模拟组织 SCP 层次结构的效果。
+ [SimulatePrincipalPolicy](https://docs.amazonaws.cn/IAM/latest/APIReference/API_SimulatePrincipalPolicy.html) 上的 `PolicyExclusionList`，您可以测试“如果我删除此策略会怎样？” 的使用场景，无需更改附加到主体的策略。
+ 响应会为每个操作返回一个 `EvaluationResult`，顶层为汇总决策，`ResourceSpecificResults` 中为每个资源的详细信息。

### Amazon CLI 和 Amazon API 参考
<a name="policies_policy-simulator-how-to-cli-api-reference"></a>

有关模拟策略的 Amazon CLI 命令示例，请参阅以下内容：
+ Amazon CLI：[get-context-keys-for-custom-policy](https://docs.amazonaws.cn/cli/latest/reference/iam/get-context-keys-for-custom-policy.html)、[get-context-keys-for-principal-policy](https://docs.amazonaws.cn/cli/latest/reference/iam/get-context-keys-for-principal-policy.html)、[simulate-custom-policy](https://docs.amazonaws.cn/cli/latest/reference/iam/simulate-custom-policy.html)、[simulate-principal-policy](https://docs.amazonaws.cn/cli/latest/reference/iam/simulate-principal-policy.html)
+ Amazon API：[GetContextKeysForCustomPolicy](https://docs.amazonaws.cn/IAM/latest/APIReference/API_GetContextKeysForCustomPolicy.html)、[GetContextKeysForPrincipalPolicy](https://docs.amazonaws.cn/IAM/latest/APIReference/API_GetContextKeysForPrincipalPolicy.html)、[SimulateCustomPolicy](https://docs.amazonaws.cn/IAM/latest/APIReference/API_SimulateCustomPolicy.html)、[SimulatePrincipalPolicy](https://docs.amazonaws.cn/IAM/latest/APIReference/API_SimulatePrincipalPolicy.html)