本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon Cognito 中的数据保护
分担责任模型AWS分担责任模型适用于亚马逊 Cognito(Amazon 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 或软件开发工具包使用 Amazon Cognito 或其他AWS服务时。AWS CLI AWS您输入到 Amazon Cognito 或其他服务中的任何数据都可能被选取以包含在诊断日志中。当您向外部服务器提供网址时,请勿在网址中包含凭证信息来验证您对该服务器的请求。
数据加密
数据加密通常分为两类:静态加密和传输中加密。
静态加密
Amazon Cognito 用户池和身份池中的数据根据行业标准进行静态加密。
- AWS拥有的密钥
-
Amazon Cognito 使用AWS自有的 KMS 密钥对您的用户池或身份池中的数据进行加密。这种类型的密钥在中不可见AWS KMS。
- 客户自主管理型密钥
-
Amazon Cognito 使用客户托管密钥对您的用户池中的数据进行加密。您负责管理客户托管的密钥策略、轮换和计划删除。
某些用户池中可能无法使用客户托管密钥进行加密。 Newly-created 用户池始终可以使用这种形式的加密。
关于使用客户托管密钥加密用户池的注意事项
-
用户池中的所有客户数据都是静态加密的,即使您没有采取任何措施来配置加密设置。
-
Amazon Cognito 仅支持与您的用户池AWS 区域相同的对称 KMS 密钥进行静态用户池加密。您无法使用非对称密钥配置静态用户池加密。您可以使用与您的用户池位于同一区域的单区域密钥和多区域密钥配置静态加密。
-
您只能使用 KMS 密钥 ARN 而不是别名来配置用户池加密。
个人身份信息加密
Amazon Cognito 通过可搜索的加密技术支持用户属性搜索中个人身份信息 (PII) 的机密性、完整性和可用性。这些 Hash-based 消息身份验证码 (HMAC) 函数针对用户池数据集进行了性能优化,在用户属性的纯文本值和加密值之间映射。Amazon Cognito 使用加密您的用户池的 KMS 密钥计算 HMAC 值。此保护适用于以下属性:
-
sub
-
email
-
phone_number
-
given_name
-
family_name
-
name
-
username
-
preferred_username
-
cognito:user_status
以下过程在用户池中配置静态加密。有关委派访问权限(AWS 服务如 Amazon Cognito)的 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
-
在用户池中配置静态加密
-
转到 Amazon Cognito 控制台。系统可能会提示您输入 AWS 凭证。
-
选择 User Pools(用户池)。
-
从列表中选择一个现有用户池,或创建一个用户池。
-
选择 “设置” 菜单并导航到 “用户池安全” 选项卡。找到 “静态加密”,然后选择 “编辑”。
-
在密钥类型下,选择AWS自有密钥或客户管理的密钥。
-
如果您选择了AWS自有密钥,则无需进行其他配置。
-
如果您选择了客户托管密钥,请在客户托管密钥 ARN 中输入 KMS 密钥的 AR N。您也可以选择创建AWS KMS密钥并在AWS KMS控制台中打开一个新窗口来创建新的 KMS 密钥。
-
选择保存更改。
- Configure encryption at rest with the API
-
在CreateUserPool或 UpdateUserPoolAPI 请求中设置您的密钥配置。以下部分示例请求正文将用户池设置为使用提供的客户托管密钥。有关完整的示例请求,请参阅示例。
"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自有密钥对静态数据进行加密。
传输中加密
作为一项托管服务,Amazon Cognito 受到AWS全球网络安全的保护。有关AWS安全服务以及如何AWS保护基础设施的信息,请参阅AWS云安全。要使用基础设施安全的最佳实践来设计您的AWS环境,请参阅 S AWSecurity Pillar Well-Architected Fram ework 中的基础设施保护。
您可以使用AWS已发布的 API 调用通过网络访问 Amazon Cognito。客户端必须支持以下内容:
Amazon Cognito 用户池和身份池具有 IAM-authenticated未经身份验证和令牌授权的 API 操作。有些是用于管理操作(例如配置用户池域)的控制平面类型的操作,另一些是用于身份验证的数据平面类型的操作。有关更多信息,请参阅 按授权模型分组的 API 操作列表。所有类别的 Amazon Cognito API 操作共享一个命名空间(cognito-idp用于用户池、身份池)cognito-identity和服务终端节点。 AWS服务端点需要在传输过程中加密,最低 TLS 版本为 1.2。
Amazon Cognito 用户池将托管登录和经典托管用户界面托管在由服务自有亚马逊 CloudFront发行版提供的网络域上。Amazon Cognito 管理这些分配的传输中加密设置。有关托管登录的加密设置的更多信息,请参阅托管登录章节中的 TLS 版本。