Amazon Simple Email Service (Amazon SES) 如何使用 Amazon KMS - Amazon Key Management Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Amazon Simple Email Service (Amazon SES) 如何使用 Amazon KMS

您可以使用 Amazon Simple Email Service (Amazon SES) 接收电子邮件并(选择性地)加密收到的电子邮件,然后再将它们存储在您选择的 Amazon Simple Storage Service (Amazon S3) 存储桶中。如果您将 Amazon SES 配置为加密电子邮件,则必须选择 Amazon SES 加密邮件时要使用的 Amazon KMS Amazon KMS key。您可以为 Amazon SES(其别名为 aws/ses)选择 Amazon 托管式密钥,也可以选择您在 Amazon KMS 中创建的对称客户托管式密钥

重要

Amazon SES 仅支持对称 KMS 密钥。不能使用非对称 KMS 密钥来加密 Amazon SES 电子邮件。要获取确定 KMS 密钥是对称还是非对称的帮助,请参阅 识别非对称 KMS 密钥

有关如何使用 Amazon SES 接收电子邮件的更多信息,请转至 Amazon Simple Email Service 开发人员指南中的使用 Amazon SES 接收电子邮件

使用 Amazon KMS 的 Amazon SES 加密概述

当您将 Amazon SES 配置为接收电子邮件并加密电子邮件,然后将其保存到 S3 存储桶时,其过程将如下所述:

  1. 您为 Amazon SES 创建一个接收规则,同时指定 S3 操作、用于存储的 S3 存储桶以及用于加密的 Amazon KMS key。

  2. Amazon SES 接收与您的接收规则匹配的电子邮件。

  3. Amazon SES 请求已使用您在适用接收规则中指定的 KMS 密钥加密的唯一数据密钥。

  4. Amazon KMS 创建一个新的数据密钥,使用指定的 KMS 密钥对其进行加密,然后将已加密的数据密钥明文副本发送到 Amazon SES。

  5. Amazon SES 使用明文数据密钥加密电子邮件,并在使用后尽快从内存中删除该明文数据密钥。

  6. Amazon SES 将加密的电子邮件和加密的数据密钥放入指定的 S3 存储桶中。加密的数据密钥将存储为加密电子邮件的元数据。

为了通过 步骤 6 完成 步骤 3,Amazon SES 使用 Amazon 提供的 Amazon S3 加密客户端。使用同一客户端从 Amazon S3 检索加密的电子邮件并对其进行解密。有关更多信息,请参阅 获取和解密电子邮件

Amazon SES 加密上下文

当 Amazon SES 请求数据密钥来加密您收到的电子邮件时(使用 Amazon KMS 的 Amazon SES 加密概述 中的 步骤 3),它会在请求中包含加密上下文。加密上下文提供 Amazon KMS 用于确保数据完整性而使用的额外的身份验证数据 (AAD)。加密上下文也将写入您的 Amazon CloudTrail 日志文件,这有助于您了解为什么使用给定的 Amazon KMS key(KMS 密钥)。Amazon SES 会使用以下加密上下文:

  • 您已在其中将 Amazon SES 配置为接收电子邮件的 Amazon Web Services 账户 的 ID

  • 对电子邮件调用 S3 操作的 Amazon SES 接收规则的规则名称

  • 电子邮件的 Amazon SES 邮件 ID

以下示例显示了 Amazon SES 使用的加密上下文的 JSON 表示形式:

{ "aws:ses:source-account": "111122223333", "aws:ses:rule-name": "example-receipt-rule-name", "aws:ses:message-id": "d6iitobk75ur44p8kdnnp7g2n800" }

为 Amazon SES 提供使用您的 Amazon KMS key 的权限

要加密您的电子邮件,您可以将您账户中的 Amazon 托管式密钥 用于 Amazon SES (aws/ses),或者可以使用您创建的客户托管式密钥。Amazon SES 已有权代表您使用 Amazon 托管式密钥。但是,如果您在添加 S3 操作到您的 Amazon SES 接收规则时指定客户托管密钥,您必须授予 Amazon SES 使用 KMS 密钥加密您的电子邮件的权限。

要为 Amazon SES 提供使用客户托管密钥的权限,请将以下语句添加到 KMS 密钥的密钥策略中:

{ "Sid": "Allow SES to encrypt messages using this KMS key", "Effect": "Allow", "Principal": {"Service": "ses.amazonaws.com"}, "Action": [ "kms:Encrypt", "kms:GenerateDataKey*" ], "Resource": "*", "Condition": { "Null": { "kms:EncryptionContext:aws:ses:rule-name": false, "kms:EncryptionContext:aws:ses:message-id": false }, "StringEquals": {"kms:EncryptionContext:aws:ses:source-account": "ACCOUNT-ID-WITHOUT-HYPHENS"} } }

ACCOUNT-ID-WITHOUT-HYPHENS 替换为您已在其中将 Amazon SES 配置为接收电子邮件的 Amazon Web Services 账户 的 12 位数 ID。此策略语句仅允许 Amazon SES 在以下条件下使用此 KMS 密钥加密数据:

  • Amazon SES 必须在其 Amazon KMS API 请求的 EncryptionContext 中指定 aws:ses:rule-nameaws:ses:message-id

  • Amazon SES 必须在其 Amazon KMS API 请求的 EncryptionContext 中指定 aws:ses:source-account,并且 aws:ses:source-account 的值必须与密钥策略中指定的 Amazon Web Services 账户 ID 匹配。

有关 Amazon SES 在加密电子邮件时使用的加密上下文的更多信息,请参阅 Amazon SES 加密上下文。有关 Amazon KMS 如何使用加密上下文的一般信息,请参阅加密上下文

获取和解密电子邮件

Amazon SES 无权解密您的加密电子邮件,也无法为您解密它们。您必须编写代码以从 Amazon S3 获取电子邮件并解密它们。为方便起见,请使用 Amazon S3 加密客户端。以下 Amazon 开发工具包中包含 Amazon S3 加密客户端:

Amazon S3 加密客户端可简化以下工作:构建 Amazon S3 的必要请求,以检索加密电子邮件;构建对 Amazon KMS 的必要请求,以解密邮件的加密数据密钥;以及解密电子邮件。例如,要成功解密加密的数据密钥,您传递的加密上下文必须与 Amazon SES 在从 Amazon KMS 请求数据密钥时传递的加密上下文相同(使用 Amazon KMS 的 Amazon SES 加密概述 中的 步骤 3)。Amazon S3 加密客户端可以为您处理这一情况及其他许多工作。

对于使用 Amazon SDK for Java 中的 Amazon S3 加密客户端执行客户端解密的示例代码,请参阅以下内容: