

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

# Amazon Cognito 中的数据保护
<a name="data-protection"></a>

分担责任模型 Amazon [分](https://www.amazonaws.cn/compliance/shared-responsibility-model/)适用于亚马逊 Cognito（Amazon Cognito）中的数据保护。如本模型所述 Amazon ，负责保护运行所有 Amazon 云的全球基础架构。您负责维护对托管在此基础结构上的内容的控制。此内容包括您使用的 Amazon 服务的安全配置和管理任务。有关数据隐私的更多信息，请参阅[数据隐私常见问题](https://www.amazonaws.cn/compliance/data-privacy-faq)。

出于数据保护目的，我们建议您保护 Amazon 账户凭证并使用 Amazon Identity and Access Management (IAM) 设置个人用户账户。这仅向每个用户授予履行其工作职责所需的权限。我们还建议您通过以下方式保护数据：
+ 对每个账户使用多重身份验证（MFA）。
+ 用于 SSL/TLS 与 Amazon 资源通信。
+ 使用设置 API 和用户活动日志 Amazon CloudTrail。
+ 使用 Amazon 加密解决方案以及 Amazon 服务中的所有默认安全控制。
+ 使用高级托管安全服务（例如 Amazon Macie），它有助于发现和保护存储在 Amazon S3 中的个人数据。

我们强烈建议您切勿将敏感的可识别信息（例如您客户的账号）放入自由格式字段（例如**名称**字段）。这包括您使用控制台、API 或软件开发工具包使用 Amazon Cognito 或其他 Amazon 服务时。 Amazon CLI Amazon 您输入到 Amazon Cognito 或其他服务中的任何数据都可能被选取以包含在诊断日志中。当您向外部服务器提供网址时，请勿在网址中包含凭证信息来验证您对该服务器的请求。

## 数据加密
<a name="data-encryption"></a>

数据加密通常分为两类：静态加密和传输中加密。

### 静态加密
<a name="data-encryption-at-rest"></a>

Amazon Cognito 用户池和身份池中的数据根据行业标准进行静态加密。
+ [Amazon Cognito 使用自有密钥对身份池中的客户数据进行加密。Amazon](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#aws-owned-cmk)你无法改变这种行为。
+ *默认情况下*，Amazon Cognito 还会使用自有密钥对用户池中的客户数据进行加密。 Amazon 您也可以将用户池配置为使用客户[管理的密钥来加密客户](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#customer-cmk)的信息。

**Amazon 拥有的密钥**  
Amazon Cognito 使用 Amazon 自有的 KMS 密钥对您的用户池或身份池中的数据进行加密。这种类型的密钥在中不可见 Amazon KMS。

**客户自主管理型密钥**  
Amazon Cognito 使用客户托管密钥对您的用户池中的数据进行加密。您负责管理客户托管的密钥策略、轮换和计划删除。  
某些用户池中可能无法使用客户托管密钥进行加密。 Newly-created 用户池始终可以使用这种形式的加密。

**关于使用客户托管密钥加密用户池的注意事项**

1. 用户池中的所有客户数据都是静态加密的，即使您没有采取任何措施来配置加密设置。

1. Amazon Cognito 仅支持与您的用户池 Amazon Web Services 区域 相同的对称 KMS 密钥进行静态用户池加密。您无法使用[非对称密钥](https://docs.amazonaws.cn/kms/latest/developerguide/symmetric-asymmetric.html)配置静态用户池加密。您可以使用与您的用户池位于同一区域的单区域密[钥和多区域密钥](https://docs.amazonaws.cn/kms/latest/developerguide/multi-region-keys-overview.html)配置静态加密。

1. 您只能使用 KMS 密钥 ARN 而不是别名来配置用户池加密。

**个人身份信息加密**  
[Amazon Cognito 通过可搜索的加密技术支持用户属性搜索中个人身份信息 (PII) 的机密性、完整性和可用性。](https://docs.amazonaws.cn/database-encryption-sdk/latest/devguide/searchable-encryption.html)这些 Hash-based 消息身份验证码 (HMAC) 函数针对用户池数据集进行了性能优化，在用户属性的纯文本值和加密值之间映射。Amazon Cognito 使用加密您的用户池的 KMS 密钥计算 HMAC 值。此保护适用于以下属性：
+ `sub`
+ `email`
+ `phone_number`
+ `given_name`
+ `family_name`
+ `name`
+ `username`
+ `preferred_username`
+ `cognito:user_status`

以下过程在用户池中配置静态加密。有关委派访问权限（ Amazon Web Services 服务 如 Amazon Cognito）的 KMS 密钥策略的更多信息，请参阅密钥策略中的 [Amazon Cognito 权限](https://docs.amazonaws.cn/kms/latest/developerguide/key-policy-services.html)。

------
#### [ Set customer managed key policy ]

要使用客户托管密钥，您的密钥必须信任 Amazon Cognito 服务主体才能对密钥执行加密和解密操作。配置您的 KMS 密[钥的密钥策略](https://docs.amazonaws.cn/kms/latest/developerguide/key-policies.html)，如以下示例所示。编写此策略的 IAM 委托人必须拥有对您的 KMS 密钥的写入权限，并获得`kms:PutKeyPolicy`许可。

```
{
    "Id": "cognito-cmk-policy",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Allow Amazon Cognito service access",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "cognito-idp.amazonaws.com",
                    "identitystore.amazonaws.com"
                ]
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKeyWithoutPlainText"
            ],
            "Resource": "*",
            "Condition": {
                "ArnEquals": {
                    "aws:SourceArn": [
                        "arn:{{aws}}:cognito-idp:{{us-east-1}}:{{111122223333}}:userpool/{{us-east-1_EXAMPLE}}"
                    ]
                },
                "StringEquals": {
                    "aws:SourceAccount": [
                        "{{111122223333}}"
                    ]
                },
                "StringLike": {
                    "kms:EncryptionContext:aws:cognito-idp:userpool-arn": "arn:{{aws}}:cognito-idp:{{us-east-1}}:{{111122223333}}:userpool/{{us-east-1_EXAMPLE}}"
                }
            }
        },
        {
            "Sid": "Allow Amazon Cognito service DescribeKey access",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "cognito-idp.amazonaws.com",
                    "identitystore.amazonaws.com"
                ]
            },
            "Action": [
                "kms:DescribeKey"
            ],
            "Resource": "*",
            "Condition": {
                "ArnEquals": {
                    "aws:SourceArn": [
                        "arn:{{aws}}:cognito-idp:{{us-east-1}}:{{111122223333}}:userpool/{{us-east-1_EXAMPLE}}"
                    ]
                },
                "StringEquals": {
                    "aws:SourceAccount": [
                        "{{111122223333}}"
                    ]
                }
            }
        },
        {
            "Sid": "Allow access through Amazon Cognito for all principals in account that are authorized to use Amazon Cognito",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "kms:DescribeKey"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": [
                        "cognito-idp.{{us-east-1}}.amazonaws.com"
                    ]
                }
            }
        },
        {
            "Sid": "Allow access through Amazon Cognito for all principals in account that are authorized to use Amazon Cognito",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKeyWithoutPlainText"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": [
                        "cognito-idp.{{us-east-1}}.amazonaws.com"
                    ]
                },
                "StringLike": {
                    "kms:EncryptionContext:aws:cognito-idp:userpool-arn": "arn:{{aws}}:cognito-idp:{{us-east-1}}:{{111122223333}}:userpool/{{us-east-1_EXAMPLE}}"
                }
            }
        },
        {
            "Sid": "Allow administrators to manage the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:{{aws}}:iam::{{111122223333}}:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        }
    ]
}
```

------
#### [ Set customer managed key policy with permissions for encryption of exported logs ]

配置[日志导出](exporting-quotas-and-usage.md)后，将此策略应用于您的 KMS 密钥。此策略允许 Amazon Cognito 在导出日志时对其进行加密，并允许中间服务在将日志写入您的 CloudWatch 日志组之前对其进行解密。配置您的 KMS 密[钥的密钥策略](https://docs.amazonaws.cn/kms/latest/developerguide/key-policies.html)，如以下示例所示。编写此策略的 IAM 委托人必须拥有对您的 KMS 密钥的写入权限，并获得`kms:PutKeyPolicy`许可。

```
{
    "Id": "cognito-cmk-policy",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Allow Amazon Cognito service access",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "cognito-idp.amazonaws.com",
                    "identitystore.amazonaws.com"
                ]
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKeyWithoutPlainText"
            ],
            "Resource": "*",
            "Condition": {
                "ArnEquals": {
                    "aws:SourceArn": [
                        "arn:{{aws}}:cognito-idp:{{us-east-1}}:{{111122223333}}:userpool/{{us-east-1_EXAMPLE}}"
                    ]
                },
                "StringEquals": {
                    "aws:SourceAccount": [
                        "{{111122223333}}"
                    ]
                },
                "StringLike": {
                    "kms:EncryptionContext:aws:cognito-idp:userpool-arn": "arn:{{aws}}:cognito-idp:{{us-east-1}}:{{111122223333}}:userpool/{{us-east-1_EXAMPLE}}"
                }
            }
        },
        {
            "Sid": "Allow Amazon Cognito service DescribeKey access",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "cognito-idp.amazonaws.com",
                    "identitystore.amazonaws.com"
                ]
            },
            "Action": [
                "kms:DescribeKey"
            ],
            "Resource": "*",
            "Condition": {
                "ArnEquals": {
                    "aws:SourceArn": [
                        "arn:{{aws}}:cognito-idp:{{us-east-1}}:{{111122223333}}:userpool/{{us-east-1_EXAMPLE}}"
                    ]
                },
                "StringEquals": {
                    "aws:SourceAccount": [
                        "{{111122223333}}"
                    ]
                }
            }
        },
        {
            "Sid": "Allow access through Amazon Cognito for all principals in account that are authorized to use Amazon Cognito",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "kms:DescribeKey"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": [
                        "cognito-idp.{{us-east-1}}.amazonaws.com"
                    ]
                }
            }
        },
        {
            "Sid": "Allow access through Amazon Cognito for all principals in account that are authorized to use Amazon Cognito",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKeyWithoutPlainText"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": [
                        "cognito-idp.{{us-east-1}}.amazonaws.com"
                    ]
                },
                "StringLike": {
                    "kms:EncryptionContext:aws:cognito-idp:userpool-arn": "arn:{{aws}}:cognito-idp:{{us-east-1}}:{{111122223333}}:userpool/{{us-east-1_EXAMPLE}}"
                }
            }
        },
        {
            "Sid": "Allow Amazon Cognito service log delivery access",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "cognito-idp.amazonaws.com"
                ]
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Encrypt"
            ],
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "kms:EncryptionContext:SourceArn": "arn:{{aws}}:logs:{{us-east-1}}:{{111122223333}}:*"
                }
            }
        },
        {
            "Sid": "Allow IngestionHub service log delivery access",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "delivery.logs.amazonaws.com"
                ]
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "kms:EncryptionContext:SourceArn": "arn:{{aws}}:logs:{{us-east-1}}:{{111122223333}}:*"
                }
            }
        },
        {
            "Sid": "Allow administrators to manage the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:{{aws}}:iam::{{111122223333}}:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        }
    ]
}
```

------
#### [ Configure encryption at rest in the console ]

**在用户池中配置静态加密**

1. 转到 [Amazon Cognito 控制台](https://console.amazonaws.cn/cognito/home)。系统可能会提示您输入 Amazon 凭证。

1. 选择 **User Pools**（用户池）。

1. 从列表中选择一个现有用户池，或[创建一个用户池](https://docs.amazonaws.cn/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)。

1. 选择 “**设置**” 菜单并导航到 “**用户池安全**” 选项卡。找到 “静**态加密**”，然后选择 “**编辑”**。

1. 在**密钥类型**下，选择**Amazon 自有密钥**或**客户管理的密钥**。

   1. 如果您选择了**Amazon 自有密钥**，则无需进行其他配置。

   1. 如果您选择了**客户托管密钥**，请在**客户托管密钥 ARN 中输入 KMS 密钥的 AR** N。您也可以选择**创建 Amazon KMS 密钥**并在 Amazon KMS 控制台中打开一个新窗口来创建新的 KMS 密钥。

1. 选择**保存更改**。

------
#### [ Configure encryption at rest with the API ]

在[CreateUserPool](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#CognitoUserPools-CreateUserPool-request-KeyConfiguration)或 [UpdateUserPool](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html#CognitoUserPools-UpdateUserPool-request-KeyConfiguration)API 请求中设置您的密钥配置。以下部分示例请求正文将用户池设置为使用提供的客户托管密钥。有关完整的示例请求，请参阅[示例](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#API_CreateUserPool_Examples)。

```
"KeyConfiguration": { 
   "KeyType": "CUSTOMER_MANAGED_KEY",
   "KmsKeyArn": "arn:aws:kms:{{us-east-1}}:{{111122223333}}:key/{{a1b2c3d4-5678-90ab-cdef-EXAMPLE22222}}"
},
```

以下部分示例请求正文将用户池设置为使用 Amazon 自有密钥。

```
"KeyConfiguration": { 
   "KeyType": "AWS_OWNED_KEY"
},
```

如果您的[DescribeUserPool](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_DescribeUserPool.html)响应不包含`KeyConfiguration`参数，则您的用户池将配置为使用 Amazon 自有密钥对静态数据进行加密。

------

## 传输中加密
<a name="data-encryption-in-transit"></a>

作为一项托管服务，Amazon Cognito 受到 Amazon 全球网络安全的保护。有关 Amazon 安全服务以及如何 Amazon 保护基础设施的信息，请参阅[Amazon 云安全](https://www.amazonaws.cn/security/)。要使用基础设施安全的最佳实践来设计您的 Amazon 环境，请参阅 S * Amazon ecurity Pillar Well-Architected Fram* ework 中的[基础设施保护](https://docs.amazonaws.cn/wellarchitected/latest/security-pillar/infrastructure-protection.html)。

您可以使用 Amazon 已发布的 API 调用通过网络访问 Amazon Cognito。客户端必须支持以下内容：
+ 传输层安全性协议（TLS）。我们要求使用 TLS 1.2，建议使用 TLS 1.3。
+ 具有完全向前保密 (PFS) 的密码套件，例如 DHE（短暂的）或 ECDHE（椭圆曲线短暂的 Diffie-Hellman）。 Diffie-Hellman大多数现代系统（如 Java 7 及更高版本）都支持这些模式。

Amazon Cognito 用户池和身份池具有 IAM-authenticated未经身份验证和令牌授权的 API 操作。有些是用于管理操作（例如配置用户池域）的*控制平面*类型的操作，另一些是用于身份*验证的数据平面*类型的操作。有关更多信息，请参阅 [按授权模型分组的 API 操作列表](authentication-flows-public-server-side.md#user-pool-apis-auth-unauth)。所有类别的 Amazon Cognito API 操作共享一个命名空间（`cognito-idp`用于用户池、身份池）`cognito-identity`和服务终端节点。 [Amazon 服务端点](https://docs.amazonaws.cn/general/latest/gr/rande.html)需要在传输过程中加密，[最低 TLS 版本为 1.2](https://www.amazonaws.cn/blogs/security/tls-1-2-required-for-aws-endpoints/)。

Amazon Cognito 用户池将托[管登录](cognito-user-pools-managed-login.md)和经典托管用户界面托管在由服务自有亚马逊 CloudFront发行版提供的网络域上。Amazon Cognito 管理这些分配的传输中加密设置。有关托管登录的加密设置的更多信息，请参阅托管登录章节中的 [TLS 版本](cognito-user-pools-managed-login.md#managed-login-things-to-know-TLSversion)。