

# Amazon 执行代码逻辑如何评估允许或拒绝访问的请求
<a name="reference_policies_evaluation-logic_policy-eval-denyallow"></a>

Amazon 执行代码决定是应该允许还是拒绝发送到 Amazon 的请求。Amazon 评估适用于请求上下文的所有策略。下面概述了 Amazon 策略评估逻辑。
+ 默认情况下，除 Amazon Web Services 账户根用户 外，所有请求都被隐式否定，具有完全访问权限。
+ 请求必须由遵循以下被允许的评估逻辑的策略或一组策略明确允许。
+ 显式拒绝将会覆盖显式允许。

策略评估可能会有所不同，具体视请求是在单个账户内还是跨账户请求中而定。有关如何针对单一账户中的 IAM 角色或用户作出策略评估决策的详细信息，请参阅[对单个账户内的请求进行策略评估](reference_policies_evaluation-logic_policy-eval-basics.md)。有关如何针对跨账户请求作出策略评估决策的详细信息，请参阅[跨账户策略评估逻辑](reference_policies_evaluation-logic-cross-account.md)。
+ **Deny evaluation**（拒绝评估）- 默认情况下，所有请求都被拒绝。这称为[隐式拒绝](reference_policies_evaluation-logic_AccessPolicyLanguage_Interplay.md)。Amazon 执行代码评估账户中应用于请求的所有策略。其中包含 Amazon Organizations SCP 和 RCP、基于资源的策略、基于身份的策略、IAM 权限边界和会话策略。在所有这些策略中，执行代码查找应用于请求的 `Deny` 语句。这称为[显式拒绝](reference_policies_evaluation-logic_AccessPolicyLanguage_Interplay.md)。如果执行代码找到一个适用的显式拒绝，则该执行代码将返回 **Deny** 的最终决定。如果没有显式拒绝，则执行代码评估会继续。
+ **Amazon Organizations RCP**：执行代码会评估适用于请求的 Amazon Organizations 资源控制策略（RCP）。RCP 适用于附加了 RCP 的账户的资源。如果执行代码没有在 RCP 中找到任何适用的 `Allow` 语句，则执行代码将返回 **Deny** 的最终决定。请注意，当启用 RCP 时，系统会自动创建一个名为 `RCPFullAWSAccess` 的 Amazon 托管式策略，并将其附加到组织中的每个实体，包括根、每个 OU 和 Amazon Web Services 账户。`RCPFullAWSAccess` 无法分离，因此始终将有一个 `Allow` 语句。如果没有 RCP，或者 RCP 允许所请求的操作，则执行代码评估继续适用。
+ **Amazon Organizations SCP**：执行代码会评估适用于请求的 Amazon Organizations 服务控制策略（SCP）。SCP 适用于附加 SCP 的账户的主体。如果执行代码没有在 SCP 中找到任何适用的 `Allow` 语句，则执行代码将返回 **Deny** 的最终决定。如果没有 SCP，或者 SCP 允许所请求的操作，则执行代码评估继续。
+ **基于资源的策略** — 在同一账户中，基于资源的策略会对策略评估产生不同的影响，具体取决于访问资源的主体类型以及基于资源的策略中允许的主体。根据主体的类型，`Allow` 在基于资源的策略中可能会导致最终决定 `Allow`，即使基于身份的策略、权限边界或会话策略中存在隐式拒绝。

  对于大多数资源，您只需要在基于身份的策略或基于资源的策略中明确 `Allow` 主体访问权限。[IAM 角色信任策略](access_policies-cross-account-resource-access.md#access_policies-cross-account-delegating-resource-based-policies)和 [KMS 密钥策略](https://docs.amazonaws.cn/kms/latest/developerguide/key-policies.html)是此逻辑的例外，因为它们必须明确允许[主体](reference_policies_elements_principal.md)的访问权限。非 IAM 和 Amazon KMS 的基于资源的服务策略也可能要求在同一账户中作出显式 `Allow` 声明，才能授予访问权限。有关详细信息，请参阅您使用的特定服务的文档。

  对于单个账户策略评估请求，当指定的主体是 IAM 用户、IAM 角色或会话主体时，基于资源的策略逻辑会与其他策略类型有所不同。会话主体包括 [IAM 角色会话](reference_policies_elements_principal.md#principal-role-session)或 [Amazon STS 联合用户主体](reference_policies_elements_principal.md#sts-session-principals)。如果基于资源的策略直接向提出请求的 IAM 用户或会话主体授予权限，则基于身份的策略、权限边界或会话策略中的隐式拒绝不会影响最终决策。
  + **IAM 角色** — 授予 IAM 角色 ARN 权限的基于资源的策略受权限边界或会话策略中隐式拒绝的限制。可以在 Principal 元素或 `aws:PrincipalArn` 条件键中指定角色 ARN。在这两种情况下，提出请求的主体都是 **IAM 角色会话**。

    权限边界和会话策略不限制在 Principal 元素中使用带通配符 (\$1) 的 `aws:PrincipalArn` 条件键授予权限，除非基于身份的策略包含显式拒绝。有关更多信息，请参阅 [IAM 角色主体](reference_policies_elements_principal.md#principal-roles)。

    **角色示例 ARN**

    ```
    arn:aws:iam::111122223333:role/examplerole
    ```
  + **IAM 角色会话**— 在同一账户中，向 IAM 角色会话 ARN 授予权限的基于资源的策略直接向担任的角色会话授予权限。直接授予会话的权限不受基于身份的策略、权限边界或会话策略中的隐式拒绝的限制。当您担任角色并提出请求时，发出请求的主体是 IAM 角色会话 ARN，而不是角色本身的 ARN。有关更多信息，请参阅 [角色会话主体](reference_policies_elements_principal.md#principal-role-session)。

    **示例角色会话 ARN**

    ```
    arn:aws:sts::111122223333:assumed-role/examplerole/examplerolesessionname
    ```
  + **IAM 用户** – 在同一账户中，向 IAM 用户 ARN（不是联合身份用户会话）授予权限的基于资源的策略不受基于身份的策略或权限边界中隐式拒绝的限制。

    **示例 IAM 用户 ARN**

    ```
    arn:aws:iam::111122223333:user/exampleuser
    ```
  + **Amazon STS 联合用户主体** – 联合用户会话是通过调用 [`GetFederationToken`](id_credentials_temp_request.md#api_getfederationtoken) 创建的会话。当联合身份用户发出请求时，发出请求的主体是联合身份用户 ARN，而不是联合身份的 IAM 用户的 ARN。在同一个账户中，将权限授予联合身份用户 ARN 的基于资源的策略直接将权限授予会话。直接授予会话的权限不受基于身份的策略、权限边界或会话策略中的隐式拒绝的限制。

    但是，如果基于资源的策略向联合身份的 IAM 用户的 ARN 授予权限，则联合身份用户在会话期间发出的请求将受权限边界或会话策略中隐式拒绝的限制。

    **示例联合用户会话 ARN**

    ```
    arn:aws:sts::111122223333:federated-user/exampleuser
    ```
+ **基于身份的策略**：执行代码会检查主体的基于身份的策略。对于 IAM 用户，这包括用户策略和来自用户所属组的策略。如果没有基于身份的策略或者基于身份的策略中没有允许请求动作的语句，那么请求被隐式否定，执行代码返回 **Deny** 的最终决定。如果任何适用的基于身份的策略中的任何语句都允许请求的动作，则代码评估继续适用。
+ **IAM 权限边界**：执行代码会检查主体使用的 IAM 实体是否具有权限边界。如果用于设置权限边界的策略不允许所请求的操作，则请求会被隐式拒绝。执行代码将返回**拒绝**最终决定。如果没有权限边界，或者权限边界允许所请求的操作，则代码评估继续适用。
+ **会话策略**：执行代码检查主体是否为会话主体。会话主体包括 IAM 角色会话或者 Amazon STS 联合用户会话。如果主体不是会话主体，执行代码将返回 **Allow** 的最终决定。

  对于会话主体，执行代码检查请求中是否传递了会话策略。您可以传递会话策略，同时使用 Amazon CLI 或 Amazon API 为某个角色或 Amazon STS 联合用户主体获取临时凭证。如果您没有传递会话策略，则会创建默认会话策略，执行代码返回 **Allow** 的最终决定。
  + 如果会话策略存在但不允许所请求的操作，则请求会被隐式拒绝。执行代码将返回**拒绝**最终决定。
  + 执行代码将检查主体是否为角色会话。如果主体是角色会话，那么请求是**已允许**。否则，请求被隐式拒绝，执行代码返回 **Deny** 的最终决定。
  + 如果会话策略在场并允许请求的动作，那么执行代码返回一个 **Allow** 的最终决策。