

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon Cognito 身份池的安全最佳实践
<a name="identity-pools-security-best-practices"></a>

Amazon Cognito 身份池为您的 Amazon 应用程序提供临时证书。 Amazon Web Services 账户 通常包含应用程序用户所需的资源和私有后端资源。构成 Amazon 证书的 IAM 角色和策略可以授予对其中任何资源的访问权限。

身份池配置的主要最佳实践是确保您的应用程序可以在没有过多权限或意外权限的情况下完成工作。为防止安全配置错误，请在要发布到生产环境的每个应用程序启动之前查看这些建议。

**Topics**
+ [IAM 配置最佳实践](#identity-pools-security-best-practices-iam)
+ [身份池配置最佳实践](#identity-pools-security-best-practices-cib)

## IAM 配置最佳实践
<a name="identity-pools-security-best-practices-iam"></a>

当访客或经过身份验证的用户在您的应用程序中启动需要身份池凭证的会话时，您的应用程序会检索 IAM 角色的临时 Amazon 凭证。这些凭证可能是默认角色、由身份池配置中的规则选择的角色或应用程序选择的自定义角色的凭证。将权限分配给每个角色后，您的用户就可以访问您的 Amazon 资源。

有关常规 IAM 最佳实践的更多信息，请参阅 Amazon Identity and Access Management 用户指南[中的 IAM 最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)。

### 在 IAM 角色中使用信任策略条件
<a name="identity-pools-security-best-practices-iam-conditions"></a>

IAM 要求身份池的角色至少有一个信任策略条件。例如，此条件可以将角色的作用域设置为仅限经过身份验证的用户。 Amazon STS 还要求跨账户基本身份验证请求具有两个特定条件：`cognito-identity.amazonaws.com:aud`和。`cognito-identity.amazonaws.com:amr`作为一项最佳实践，请在信任身份池服务主体 `cognito-identity.amazonaws.com` 的所有 IAM 角色中应用这两个条件。
+ `cognito-identity.amazonaws.com:aud`：身份池令牌中的 *aud* 声明必须与可信身份池 ID 相匹配。
+ `cognito-identity.amazonaws.com:amr`：身份池令牌中的 *amr* 声明必须*经过身份验证*或*未经身份验证*。在这个条件下，您可以将角色的访问权限仅限于未经身份验证的访客，或者仅限于经过身份验证的用户。例如，您可以进一步细化此条件的值，将角色限制为来自特定提供商的用户，例如 `graph.facebook.com`。

以下示例角色信任策略在以下条件下授予对角色的访问权限：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.cn-north-1.amazonaws.com.cn"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com.cn:aud": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com.cn:amr": "authenticated"
        }
      }
    }
  ]
}
```

------

**与身份池相关的元素**
+ `"Federated": "cognito-identity.cn-north-1.amazonaws.com.cn"`：用户必须来自身份池。
+ `"cognito-identity.amazonaws.com.cn:aud": "us-east-1:a1b2c3d4-5678-90ab-cdef-example11111"`：用户必须来自特定身份池 `us-east-1:a1b2c3d4-5678-90ab-cdef-example11111`。
+ `"cognito-identity.amazonaws.com.cn:amr": "authenticated"`：用户必须已进行身份验证。访客用户无法代入该角色。

### 应用最低权限许可
<a name="identity-pools-security-best-practices-iam-least-privilege"></a>

在使用 IAM 策略为经过身份验证的访问或访客访问设置权限时，请仅授予执行特定任务所需的特定权限或*最低权限*。以下示例 IAM 策略在应用于角色时，授予对 Amazon S3 存储桶中单个映像文件的只读访问权限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::mybucket/assets/my_picture.jpg"]
    }
  ]
}
```

------

## 身份池配置最佳实践
<a name="identity-pools-security-best-practices-cib"></a>

身份池为生成 Amazon 凭证提供了灵活的选项。当您的应用程序可以使用更安全的方法时，不要在设计上采取捷径。

### 了解访客访问的影响
<a name="identity-pools-security-best-practices-cib-guest"></a>

未经身份验证的访客访问权限允许用户在登录之前从您的 Amazon Web Services 账户 检索数据。知道您的身份池 ID 的任何人都可以请求未经身份验证的凭证。您的身份池 ID 不是机密信息。激活访客访问 Amazon 权限后，所有人均可使用您授予未经身份验证的会话的权限。

妥善的做法是，停用访客访问权限，仅在用户进行身份验证后才获取必需的资源。如果您的应用程序需要在登录前访问资源，请采取以下预防措施。
+ 熟悉[对未经身份验证的角色设置的自动限制](iam-roles.md#access-policies-scope-down-services)。
+ 监控和调整未经身份验证的 IAM 角色的权限，以满足应用程序的特定需求。
+ 授予对特定资源的访问权限。
+ 保护默认未经身份验证的 IAM 角色的信任策略。
+ 只有当您确信自己要将 IAM 角色中的权限授予互联网上的任何人时，才激活访客访问权限。

### 默认使用增强型身份验证
<a name="identity-pools-security-best-practices-cib-enhanced"></a>

通过基本（经典）身份验证，Amazon Cognito 会将选择的 IAM 角色委派给您的应用程序。相比之下，增强型流程使用身份池中的集中式逻辑来确定 IAM 角色。它还通过[范围缩小策略](iam-roles.md#access-policies-scope-down-services)来设置 IAM 权限上限，为未经验证的身份提供了额外的安全性。增强型流程是更安全的选择，开发人员的工作量更少。要了解有关这些选项的更多信息，请参阅[身份池身份验证流程](authentication-flow.md)。

基本流程可以公开用于角色选择和组装 Amazon STS API 凭证请求的客户端逻辑。增强型流程通过身份池自动化隐藏了角色选择逻辑和代入角色请求。

配置基本身份验证时，请为您的 IAM 角色及其权限应用 [IAM 最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)。

### 安全地使用开发人员提供商
<a name="identity-pools-security-best-practices-cib-developer"></a>

经过开发人员验证的身份是服务器端应用程序身份池的一项特征。身份池开发者身份验证所需的唯一身份验证证据是身份池开发者的 Amazon 证书。身份池不会对您在此身份验证流程中提供的开发人员-提供商标识符的有效性施加任何限制。

作为一项最佳实践，仅在以下条件下实施开发人员提供商：
+ 为了确保使用经过开发人员验证的凭证的责任能够追溯，请将您的开发人员提供商名称和标识符设计为可指明身份验证来源。例如：`"Logins" : {"MyCorp provider" : "[provider application ID]"}`。
+ 避免使用长期用户凭证。将服务器端客户端配置为使用服务相关角色（如 [EC2 实例配置文件](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html)和 [Lambda 执行角色](https://docs.amazonaws.cn/lambda/latest/dg/lambda-intro-execution-role.html)）请求身份。
+ 避免在同一个身份池中混用内部和外部信任源。在单独的身份池中添加开发人员提供者和单点登录（SSO）提供者。