View a markdown version of this page

Amazon Cognito 中的数据保护 - Amazon Cognito

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

Amazon Cognito 中的数据保护

AWS 分担责任模型分适用于亚马逊 Cognito(亚马逊 Cognito)中的数据保护。如该模型所述 AWS ,负责保护运行所有 AWS 云的全球基础设施。您负责维护对托管在此基础结构上的内容的控制。此内容包括您使用的 AWS 服务的安全配置和管理任务。有关数据隐私的更多信息,请参阅数据隐私常见问题

出于数据保护的目的,我们建议您保护 AWS 账户凭证并使用 AWS Identity and Access Management (IAM) 设置个人用户账户。这仅向每个用户授予履行其工作职责所需的权限。我们还建议您通过以下方式保护数据:

  • 对每个账户使用多重身份验证(MFA)。

  • 用于 SSL/TLS 与 AWS 资源通信。

  • 使用设置 API 和用户活动日志 AWS CloudTrail。

  • 使用 AWS 加密解决方案以及 AWS 服务内的所有默认安全控件。

  • 使用高级托管安全服务(例如 Amazon Macie),它有助于发现和保护存储在 Amazon S3 中的个人数据。

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

数据加密

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

静态加密

Amazon Cognito 用户池和身份池中的数据根据行业标准进行静态加密。

AWS 自有密钥

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

客户自主管理型密钥

Amazon Cognito 使用客户管理的密钥对用户池中的数据进行加密。您负责管理客户管理的密钥策略、轮换和预定删除。

注意

某些用户池可能无法使用客户管理的密钥进行加密。 Newly-created 用户池始终可以使用这种形式的加密。

有关使用客户管理密钥进行用户池加密的注意事项
  1. 即使您未采取任何操作来配置加密设置,用户池中的所有客户数据都将进行静态加密。

  2. Amazon Cognito 仅支持与您的用户池 AWS 区域 相同的对称 KMS 密钥,用于静态用户池加密。您无法使用非对称密钥配置静态用户池加密。您可以使用单区域密钥和与用户池位于同一区域的多区域密钥配置静态加密。

  3. 您只能使用 KMS 密钥 ARN 配置用户池加密,不能使用别名。

个人身份信息加密

Amazon Cognito 通过可搜索加密支持用户属性搜索中个人身份信息 (PII) 的机密性、完整性和可用性。https://docs.aws.amazon.com/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 Cognito AWS 服务 等机构委派访问权限的 KMS 密钥策略的更多信息,请参阅密钥策略中的 Amazon Cognito 权限。

Set customer managed key policy

要使用客户管理的密钥,您的密钥必须信任 Amazon Cognito 服务主体才能对密钥执行加密和解密操作。配置您的 KMS 密的密钥策略,如以下示例所示。编写此策略的 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

配置了日志导出后,将此策略应用于您的 KMS 密钥。此政策允许 Amazon Cognito 在导出日志时对其进行加密,并允许中间服务在将其写入您的 CloudWatch 日志日志组之前对其进行解密。配置您的 KMS 密的密钥策略,如以下示例所示。编写此策略的 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 控制台。系统可能会提示您输入 AWS 凭证。

  2. 选择 User Pools(用户池)。

  3. 从列表中选择一个现有用户池,或创建一个用户池

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

  5. 密钥类型下,选择AWS 自有密钥客户管理的密钥

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

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

  6. 选择保存更改

Configure encryption at rest with the API

CreateUserPool UpdateUserPool API 请求中设置您的密钥配置。以下部分示例请求正文将用户池设置为使用提供的客户管理密钥。有关完整的示例请求,请参阅示例

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

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

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

如果您的DescribeUserPool响应不包含KeyConfiguration参数,则您的用户池将配置为使用 AWS 自有密钥加密静态数据。

传输中加密

作为一项托管服务,亚马逊 Cognito 受到 AWS 全球网络安全的保护。有关 AWS 安全服务以及如何 AWS 保护基础设施的信息,请参阅AWS 云安全。要使用基础设施安全的最佳实践来设计您的 AWS 环境,请参阅安全支柱架 AWS 构完善框架中的基础设施保护。

您可以使用 AWS 已发布的 API 调用通过网络访问亚马逊 Cognito。客户端必须支持以下内容:

  • 传输层安全性协议(TLS)。我们要求使用 TLS 1.2,建议使用 TLS 1.3。

  • 具有完美向前保密 (PFS) 的密码套件,例如 DHE(短暂的)或 ECDHE(椭圆曲线短暂的 Diffie-Hellman)。 Diffie-Hellman大多数现代系统(如 Java 7 及更高版本)都支持这些模式。

Amazon Cognito 用户池和身份池具有 IAM-authenticated未经身份验证和代币授权的 API 操作。有些是用于管理操作(例如配置用户池域)的控制平面类型的操作,而另一些是用于身份验证的数据平面类型的操作。有关更多信息,请参阅 按授权模型分组的 API 操作列表。所有类别的 Amazon Cognito API 操作共享一个命名空间cognito-idp(用户池、cognito-identity身份池)和服务终端节点。AWS 服务端点在传输过程中需要加密,TLS 最低版本为 1.2

Amazon Cognito 用户池托管登录和由服务自有亚马逊 CloudFront发行版提供的网络域名上的经典托管用户界面。Amazon Cognito 管理这些发行版中传输中的加密设置。有关托管登录的加密设置的更多信息,请参阅托管登录章节中的 TLS 版本。