AWS Key Management Service
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon WorkMail 如何使用 AWS KMS

本主题讨论 Amazon WorkMail 如何使用 AWS KMS 来加密电子邮件。

Amazon WorkMail 概述

Amazon WorkMail 是一种安全的托管式企业电子邮件和日历服务,支持用于现有桌面和移动电子邮件客户端。您可以创建一个 Amazon WorkMail 组织并为其分配一个或多个您拥有的电子邮件域。然后,您可以为组织中的电子邮件用户和通讯组创建邮箱。

Amazon WorkMail 在将所有 Amazon WorkMail 组织的邮箱中的所有消息写入磁盘之前会以透明方式对这些消息进行加密,并在用户访问这些消息时以透明方式对其进行解密。没有用于禁用加密的选项。为了确保用于保护消息的加密密钥的安全,Amazon WorkMail 将与 AWS Key Management Service (AWS KMS) 集成。

Amazon WorkMail 还提供了一个使用户能够发送已签名或加密的电子邮件的选项。此加密功能不使用 AWS KMS。

Amazon WorkMail 加密

在 Amazon WorkMail 中,每个组织可以包含多个邮箱,组织中的每个用户都有一个邮箱。所有消息(包括电子邮件和日历项)都存储在用户的邮箱中。

为了保护 Amazon WorkMail 组织中邮箱的内容,Amazon WorkMail 会在所有邮箱消息写入磁盘之前对其进行加密。任何客户提供的信息均为明文形式存储。

每条消息都使用唯一的数据加密密钥进行加密。邮件密钥受邮箱密钥保护,邮箱密钥是仅用于该邮箱的唯一加密密钥。对于始终对 AWS KMS 加密的组织,使用 AWS KMS 客户主密钥 (CMK) 对邮箱密钥进行加密。下图显示了 AWS KMS 中加密消息、加密消息密钥、加密邮箱密钥和组织中 CMK 之间的关系。


        对 Amazon WorkMail 邮箱加密

组织的 CMK

在创建 Amazon WorkMail 组织时,您可以为组织选择 AWS KMS 客户主密钥 (CMK)。此 CMK 保护该组织中的所有邮箱密钥。

如果您使用快速设置过程来创建组织,Amazon WorkMail 将使用 AWS 账户中适用于 Amazon WorkMail (aws/workmail) 的 AWS 托管 CMK。如果您使用标准设置,则可选择适用于 Amazon WorkMail 的 AWS 托管 CMK 或您拥有和管理的客户托管 CMK。您可以为每个组织选择相同的 CMK 或不同的 CMK,但在选择 CMK 后,无法更改它。

要查找组织的 CMK,请使用记录对 AWS KMS 的调用的 AWS CloudTrail 日志条目。

每个邮箱的唯一加密密钥

在创建新邮箱时,Amazon WorkMail 会在 AWS KMS 外部为邮箱生成唯一的 256 位高级加密标准 (AES) 对称加密密钥(称作其邮箱密钥)。Amazon WorkMail 使用邮箱密钥来保护邮箱中每个消息的加密密钥。

为了保护邮箱密钥,Amazon WorkMail 调用 AWS KMS 以使用组织的 CMK 加密邮箱密钥。然后,它将加密的邮箱密钥存储在邮箱元数据中。

注意

Amazon WorkMail 使用对称邮箱加密密钥来保护消息密钥。以前,Amazon WorkMail 使用非对称密钥对来保护每个邮箱。它使用公有密钥加密每个消息密钥,并使用私有密钥解密该密钥。私有邮箱密钥受组织的 CMK 保护。现有邮箱可能仍使用非对称邮箱密钥对。此更改不会影响邮箱或其消息的安全。

每个消息的唯一加密密钥

在将消息添加到邮箱时,Amazon WorkMail 在 AWS KMS 外部为消息生成唯一的 256 位 AES 对称加密密钥。它使用此消息密钥 加密消息。Amazon WorkMail 使用邮箱密钥加密消息密钥,并将加密消息密钥与消息一起存储。然后,它使用组织的 CMK 加密邮箱密钥。

创建新邮箱

当 Amazon WorkMail 创建新邮箱时,它使用以下过程准备邮箱以保存加密的消息。

  • Amazon WorkMail 在 AWS KMS 外部为邮箱生成一个唯一的 256 位 AES 对称加密密钥。

  • Amazon WorkMail 调用 AWS KMS Encrypt 操作。它为组织传入邮箱密钥和客户主密钥 (CMK) 的标识符。AWS KMS 返回使用 CMK 加密的邮箱密钥的密文。

  • Amazon WorkMail 将加密的邮箱密钥与邮箱元数据一起存储。

加密邮箱消息

要加密消息,Amazon WorkMail 使用以下过程。

  1. Amazon WorkMail 为消息生成一个唯一的 256 位 AES 对称密钥。它使用明文消息密钥和高级加密标准 (AES) 算法在 AWS KMS 外加密消息。

  2. 为保护邮箱密钥下的消息密钥,Amazon WorkMail 需要解密邮箱密钥(它始终以加密形式存储)。

    Amazon WorkMail 调用 AWS KMS Decrypt 操作,并传入加密的邮箱密钥。AWS KMS 使用组织的 CMK 解密邮箱密钥,并将明文邮箱密钥返回到 Amazon WorkMail。

  3. Amazon WorkMail 使用明文邮箱密钥和高级加密标准 (AES) 算法在 AWS KMS 外加密消息密钥。

  4. Amazon WorkMail 将加密的消息密钥存储在加密消息的元数据中,以便对其进行解密。

解密邮箱消息

为了解密消息,Amazon WorkMail 将使用以下过程。

  1. Amazon WorkMail 调用 AWS KMS Decrypt 操作,并传入加密的邮箱密钥。AWS KMS 使用组织的 CMK 解密邮箱密钥,并将明文邮箱密钥返回到 Amazon WorkMail。

  2. Amazon WorkMail 使用明文邮箱密钥和高级加密标准 (AES) 算法在 AWS KMS 外解密加密的消息密钥。

  3. Amazon WorkMail 使用明文消息密钥来解密加密的消息。

缓存邮箱密钥

为了提高性能并最大限度地减少对 AWS KMS 的调用,Amazon WorkMail 在本地为每个客户端缓存每个明文邮箱密钥最多 1 分钟。在缓存期结束时,将删除邮箱密钥。如果在缓存期间需要该客户端的邮箱密钥,则 Amazon WorkMail 可以从缓存中获取它而不是调用 AWS KMS。邮箱密钥在缓存中受保护,并且永远不会以明文形式写入磁盘中。

授权使用 CMK

当 Amazon WorkMail 在加密操作中使用客户主密钥 (CMK) 时,它代表邮箱管理员。

要代表您将 AWS KMS 客户主密钥 (CMK) 用于密钥,管理员必须拥有以下权限。您可以在 IAM 策略或密钥策略中指定这些所需的权限。

  • kms:Encrypt

  • kms:Decrypt

  • kms:CreateGrant

要仅允许将 CMK 用于源自 Amazon WorkMail 的请求,可将 kms:ViaService 条件密钥与 workmail.<region>.amazonaws.com 值结合使用。

您还可以在加密上下文中将密钥或值用作将 CMK 用于加密操作的条件。例如,可在 IAM 或密钥策略文档中使用字符串条件运算符,或在授权中使用授权约束。

组织 CMK 的密钥策略

仅当 Amazon WorkMail 代表用户发出请求时,用于 Amazon WorkMail 的 AWS 托管 CMK 的密钥策略才向用户授予将 CMK 用于指定操作的权限。密钥策略不允许任何用户直接使用 CMK。

此密钥策略与所有 AWS 托管密钥的策略类似,均由该服务来建立。您无法更改它,但可以随时查看它。要获取您的账户中 Amazon WorkMail 的密钥策略,请使用 GetKeyPolicy 操作。

密钥策略中的策略语句具有以下影响:

  • 仅当 Amazon WorkMail 代表账户和区域中的用户发出请求时,才允许这些用户使用 CMK 执行加密操作和创建授权。kms:ViaService 条件密钥可强制实施此限制。

  • 允许 AWS 账户创建 IAM 策略以允许用户查看 CMK 属性和撤销授权。

下面是用于 Amazon WorkMail 的 AWS 托管 CMK 示例的密钥策略。

{ "Version" : "2012-10-17", "Id" : "auto-workmail-1", "Statement" : [ { "Sid" : "Allow access through WorkMail for all principals in the account that are authorized to use WorkMail", "Effect" : "Allow", "Principal" : { "AWS" : "*" }, "Action" : [ "kms:Decrypt", "kms:CreateGrant", "kms:ReEncrypt*", "kms:DescribeKey", "kms:Encrypt" ], "Resource" : "*", "Condition" : { "StringEquals" : { "kms:ViaService" : "workmail.us-east-1.amazonaws.com", "kms:CallerAccount" : "111122223333" } } }, { "Sid" : "Allow direct access to key metadata to the account", "Effect" : "Allow", "Principal" : { "AWS" : "arn:aws:iam::111122223333:root" }, "Action" : [ "kms:Describe*", "kms:List*", "kms:Get*", "kms:RevokeGrant" ], "Resource" : "*" } ] }

使用授权来向 Amazon WorkMail 授权

除了密钥策略之外,Amazon WorkMail 使用授权将权限添加到每个组织的 CMK。要查看有关账户中 CMK 的授权,请使用 ListGrants 操作。

Amazon WorkMail 使用授权将以下权限添加到组织的 CMK。

  • 添加 kms:Encrypt 权限以允许 Amazon WorkMail 加密邮箱密钥。

  • 添加 kms:Decrypt 权限以允许 Amazon WorkMail 使用 CMK 解密邮箱密钥。Amazon WorkMail 在授予中需要此权限,因为读取邮箱消息的请求使用正在阅读消息的用户的安全上下文。该请求不使用 AWS 账户的凭证。当您选择组织的 CMK 时,Amazon WorkMail 会创建此授权。

为了创建授权,Amazon WorkMail 代表创建组织的用户调用 CreateGrant。用于创建授权的权限来自密钥策略。此策略允许账户用户在 Amazon WorkMail 代表授权用户发出请求时对组织的 CMK 调用 CreateGrant

该密钥策略还允许账户根用户撤销对 AWS 托管密钥的授权。但是,如果您撤销授权,Amazon WorkMail 无法解密邮箱中的已加密数据。

Amazon WorkMail 加密上下文

加密上下文是一组包含任意非机密数据的键值对。在请求中包含加密上下文以加密数据时,AWS KMS 以加密方式将加密上下文绑定到加密的数据。要解密数据,您必须传入相同的加密上下文。

Amazon WorkMail 在所有 AWS KMS 加密操作中使用相同的加密上下文格式。您可以使用加密上下文在审核记录和日志中标识加密操作(例如 AWS CloudTrail),并将加密上下文用作在策略和授权中进行授权的条件。

在其向 AWS KMS 发出的 EncryptDecrypt 请求中,Amazon WorkMail 使用加密上下文,其中密钥是 aws:workmail:arn,值是组织的 Amazon 资源名称 (ARN)。

"aws:workmail:arn":"arn:aws:workmail:region:account ID:organization/organization ID"

例如,以下加密上下文将示例组织 ARN 包含在 美国东部(俄亥俄州) (us-east-2) 区域中。

"aws:workmail:arn":"arn:aws:workmail:us-east-2:111122223333:organization/m-68755160c4cb4e29a2b2f8fb58f359d7"

监控 Amazon WorkMail 与 AWS KMS 的交互

您可以使用 AWS CloudTrail 和 Amazon CloudWatch Logs 来跟踪 Amazon WorkMail 代表您向 AWS KMS 发送的请求。

Encrypt

在创建新邮箱时,Amazon WorkMail 会生成邮箱密钥并调用 AWS KMS 以加密邮箱密钥。Amazon WorkMail 将包含明文邮箱密钥和 Amazon WorkMail 组织的 CMK 的标识符的 Encrypt 请求发送到 AWS KMS。

记录 Encrypt 操作的事件与以下示例事件类似。用户是 Amazon WorkMail 服务。参数包含 CMK ID (keyId) 和 Amazon WorkMail 组织的加密上下文。Amazon WorkMail 还传入邮箱密钥,而不是将它记录在 CloudTrail 日志中。

{ "eventVersion": "1.05", "userIdentity": { "type": "AWSService", "invokedBy": "workmail.eu-west-1.amazonaws.com" }, "eventTime": "2019-02-19T10:01:09Z", "eventSource": "kms.amazonaws.com", "eventName": "Encrypt", "awsRegion": "eu-west-1", "sourceIPAddress": "workmail.eu-west-1.amazonaws.com", "userAgent": "workmail.eu-west-1.amazonaws.com", "requestParameters": { "encryptionContext": { "aws:workmail:arn": "arn:aws:workmail:eu-west-1:111122223333:organization/m-c6981ff7642446fa8772ba99c690e455" }, "keyId": "arn:aws:kms:eu-west-1:111122223333:key/1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d" }, "responseElements": null, "requestID": "76e96b96-7e24-4faf-a2d6-08ded2eaf63c", "eventID": "d5a59c18-128a-4082-aa5b-729f7734626a", "readOnly": true, "resources": [ { "ARN": "arn:aws:kms:eu-west-1:111122223333:key/1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d", "accountId": "111122223333", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333", "sharedEventID": "d08e60f1-097e-4a00-b7e9-10bc3872d50c" }

Decrypt

在添加、查看或删除邮箱消息时,Amazon WorkMail 会让 AWS KMS 解密邮箱密钥。Amazon WorkMail 将包含加密的邮箱密钥和 Amazon WorkMail 组织的 CMK 的标识符的 Decrypt 请求发送到 AWS KMS。

记录 Decrypt 操作的事件与以下示例事件类似。用户是 Amazon WorkMail 服务。参数包含未记录在日志中的加密的邮箱密钥(作为密文 blob)和 Amazon WorkMail 组织的加密上下文。AWS KMS 从密文派生 CMK 的 ID。

{ "eventVersion": "1.05", "userIdentity": { "type": "AWSService", "invokedBy": "workmail.eu-west-1.amazonaws.com" }, "eventTime": "2019-02-20T11:51:10Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "eu-west-1", "sourceIPAddress": "workmail.eu-west-1.amazonaws.com", "userAgent": "workmail.eu-west-1.amazonaws.com", "requestParameters": { "encryptionContext": { "aws:workmail:arn": "arn:aws:workmail:eu-west-1:111122223333:organization/m-c6981ff7642446fa8772ba99c690e455" } }, "responseElements": null, "requestID": "4a32dda1-34d9-4100-9718-674b8e0782c9", "eventID": "ea9fd966-98e9-4b7b-b377-6e5a397a71de", "readOnly": true, "resources": [ { "ARN": "arn:aws:kms:eu-west-1:111122223333:key/1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d", "accountId": "111122223333", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333", "sharedEventID": "241e1e5b-ff64-427a-a5b3-7949164d0214" }