Amazon Simple Email Service (Amazon SES) で AWS KMS を使用する方法 - AWS Key Management Service

Amazon Simple Email Service (Amazon SES) で AWS KMS を使用する方法

Amazon Simple Email Service (Amazon SES) を使用して E メールを受信し、(オプションで) 受信した E メールメッセージを暗号化してから、選択した Amazon Simple Storage Service (Amazon S3) バケットに保存することができます。E メールメッセージを暗号化するよう Amazon SES を設定する場合は、Amazon SES がメッセージを暗号化する AWS KMS カスタマーマスターキー (CMK) を選択する必要があります。Amazon SES 用の AWS 管理 CMK を選択するか(エイリアスは aws/ses です)、AWS KMS で作成した対称カスタマー管理 CMK を選択できます。

重要

Amazon SES は、対称 CMK のみをサポートします。非対称 CMK を使用して Amazon SES E メールメッセージを暗号化することはできません。CMK が対称か非対称かを判断する方法については、「対称 CMK と非対称 CMK の識別」を参照してください。

Amazon SES を使用した E メールの受信の詳細については、『Amazon Simple Email Service 開発者ガイド』の「Amazon SES を使用した E メールの受信」を参照してください。

Amazon SES を使用した AWS KMS 暗号化の概要

受信した E メールメッセージを暗号化してから S3 バケットに保存するよう Amazon SES を設定する場合のプロセスは、次のようになります。

  1. Amazon SES の受信ルールを作成し、S3 アクション、ストレージの S3 バケット、および暗号化の KMS カスタマーマスターキー (CMK) を指定します。

  2. Amazon SES は、受信ルールに一致する E メールメッセージを受信します。

  3. Amazon SES は、該当する受信ルールで指定した KMS CMK を使って暗号化された一意のデータキーをリクエストします。

  4. AWS KMS は新しいデータキーを作成し、指定された CMK で暗号化して、データキーの暗号化されたコピーとプレーンテキストのコピーを Amazon SES に送信します。

  5. Amazon SES はプレーンテキストデータキーを使用して E メールメッセージを暗号化し、使用後できるだけ早くプレーンテキストデータキーをメモリから削除します。

  6. Amazon SES は暗号化された E メールメッセージと暗号化されたデータキーを、指定された S3 バケットに配置します。暗号化されたデータキーは、暗号化された E メールメッセージとともにメタデータとして保存されます。

ステップ 3 から ステップ 6 を実行するため 、Amazon SES は AWS–により提供された Amazon S3 暗号化クライアントを使用します。Amazon S3 から暗号化された E メールメッセージを取得して復号するには、同じクライアントを使用します。詳細については、「E メールメッセージの取得と復号」を参照してください。

Amazon SES の暗号化コンテキスト

Amazon SES が受信した E メールメッセージを暗号化するためにデータキーをリクエストすると (「ステップ 3」の Amazon SES を使用した AWS KMS 暗号化の概要)、リクエストに暗号化コンテキストが含まれます。暗号化コンテキストは、データの整合性を保証するために AWS KMS で使用される追加の認証データ (AAD) を提供します。また、暗号化コンテキストが AWS CloudTrail ログファイルに書き込まれるため、特定のカスタマーマスターキー (CMK) が使用された理由を理解するうえで役立ちます。Amazon SES では、次の暗号化コンテキストが使用されます

  • E メールメッセージを受信するよう Amazon SES を設定した AWS アカウントの ID

  • E メールメッセージで S3 アクションを呼び出した Amazon SES 受信ルールのルール名

  • E メールメッセージの 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 カスタマーマスターキー (CMK) を使用するためのアクセス許可を AWS KMS に付与する

E メールメッセージを暗号化するには、Amazon SES (aws/ses) のアカウントで AWS 管理のカスタマーマスターキー (CMK) を使用するか、作成したカスタマー管理の CMK を使用できます。Amazon SES にはすでに、お客様に代わって AWS 管理の CMK を使用するアクセス許可があります。ただし、Amazon SES 受信ルールに S3 アクションを追加するときにカスタマー管理の CMK を指定する場合は、CMK を使用して E メールメッセージを暗号化するアクセス許可を Amazon SES に付与する必要があります。

カスタマー管理の CMK を使用するアクセス許可を Amazon SES に付与するには、CMK のキーポリシーに以下のステートメントを追加します。

{ "Sid": "Allow SES to encrypt messages using this master 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 を、E メールメッセージを受信するよう Amazon SES を設定した AWS アカウントの 12 桁の ID で置き換えます。次のポリシーステートメントでは、Amazon SES が、これらの条件下でのみこの CMK でデータを暗号化することができます。

  • Amazon SES は、AWS KMS API リクエストの EncryptionContext で、aws:ses:rule-name および aws:ses:message-id を指定する必要があります。

  • Amazon SES は、AWS KMS API リクエストの EncryptionContextaws:ses:source-account を指定し、aws:ses:source-account の値は、キーポリシーで指定された AWS のアカウント ID と一致する必要があります。

E メールメッセージを暗号化する際に Amazon SES で使用される暗号化コンテキストの詳細については、「Amazon SES の暗号化コンテキスト」を参照してください。AWS KMS が暗号化テキストをどのように使用するかについての一般情報は、 暗号化コンテキストを参照してください。

E メールメッセージの取得と復号

Amazon SES には、暗号化された E メールメッセージを復号するアクセス権限がないため、メッセージを復号することができません。Amazon S3 から E メールメッセージを取得して復号化するコードを書く必要があります。これを簡単にするには、Amazon S3 暗号化クライアントを使用します。以下の AWS SDK には、Amazon S3 暗号化クライアントが含まれます。

Amazon S3 暗号化クライアントは、Amazon S3 が暗号化された E メールメッセージを取得し、AWS KMS がメッセージの暗号化されたデータキーを復号するために必要なリクエストを作成するために必要な作業と、E メールメッセージの復号の作業を簡略化します。たとえば、暗号化されたデータキーを正常に復号するには、Amazon SES からデータキーをリクエストした (「AWS KMS」の ステップ 3) ときに Amazon SES を使用した AWS KMS 暗号化の概要 が渡したのと同じ暗号化コンテキストを渡す必要があります。Amazon S3 暗号化クライアントが、この作業と他の作業の多くをユーザーに代わって処理します。

AWS SDK for Java で Amazon S3 暗号化クライアントをサンプルコードが使用してクライアント側の復号を実行する方法については、以下を参照してください。