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) バケットに保存することができます。Amazon SES が E メールメッセージを暗号化するように設定する際、Amazon SES がメッセージを暗号化する AWS KMS AWS KMS key を選択する必要があります。Amazon SES 用の AWS マネージドキー (エイリアスは aws/ses)、または AWS KMS で作成した対称カスタマーマネージドキーを選択できます。

重要

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

Amazon SES を使用する E メールの受信方法の詳細については、Amazon Simple Email Service デベロッパーガイドAmazon SES を使用して E メールを受信するを参照してください。

AWS KMS を使用する Amazon SES 暗号化の概要

S3 バケットに保存する前に E メールを受信し、E メールメッセージを暗号化するように Amazon SES を設定すると、プロセスは次のように動作します。

  1. Amazon SES の受信ルールを作成し、S3 アクション、ストレージ用の S3 バケット、暗号化用の AWS KMS key を指定します。

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

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

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

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

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

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

Amazon SES 暗号化コンテキスト

Amazon SES が受信した E メールメッセージを暗号化するデータキーをリクエストすると(ステップ 3AWS KMS を使用する Amazon SES 暗号化の概要)、リクエストに 暗号化コンテキスト が含まれます。暗号化コンテキストは、データの整合性を保証するために AWS KMS で使用される追加の認証データ (AAD) を提供します。また、暗号化コンテキストは AWS CloudTrail ログファイルにも書き込まれるため、特定の AWS KMS key (KMS キー) が使用された原因を理解するのに役立ちます。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" }

AWS KMS key を使用するためのアクセス許可を Amazon SES に付与する

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

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"} } }

E メールメッセージを受信するように Amazon SES を設定した AWS アカウント の 12 桁の ID を、ACCOUNT-ID-WITHOUT-HYPHENS の代わりに置き換えます。このポリシーステートメントは以下の条件下でのみ、Amazon SES がこの KMS キーを使用してデータを暗号化することを許可します。

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

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

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

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

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

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

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