Amazon Simple Queue Service
開発者ガイド

サーバー側の暗号化を使用したデータの保護 (SSE) および AWS KMS

SSE を使用すると、暗号化されたキューで機密データを送信できます。SSE では、AWS Key Management Service (AWS KMS) で管理されているキーを使用して Amazon SQS キュー内のメッセージの内容を保護します。AWS マネジメントコンソール または AWS SDK for Java (および CreateQueueSetQueueAttributesGetQueueAttributes の各アクション) を使用して SSE を管理する方法については、以下のチュートリアルを参照してください。

Amazon SQS が受信したメッセージはすぐに、SSE によって暗号化されます。メッセージは暗号化された形式で保存され、承認済みのコンシューマーに送信された場合のみ、Amazon SQS によって解読されます。

重要

SSE が有効なキューへのすべてのリクエストでは、HTTPS と署名バージョン 4 を使用する必要があります。

Amazon SQS 用 AWS マネージドカスタマーマスターキーを使用する暗号化されたキューを、別の AWS アカウントの Lambda 関数と関連付けることはできません。

AWS Security Token Service AssumeRole アクションを使用して Amazon SQS に通知を送信できる AWS のサービスの一部の機能は SSE と互換性がありますが、スタンダード キューでのみ動作します。

Amazon SQS に通知を送るその他の AWS サービスまたはサードパーティーサービスの機能の一部には、暗号化されたキューをターゲットに設定できるにもかかわらず、SSE に対応していないものがあります。

他のサービスと暗号化されたキューとの互換性については、「を使用して AWS サービスとキューの間で互換性を保つ 」とサービスのドキュメントを参照してください。

AWS KMS は、安全で可用性の高いハードウェアとソフトウェアを組み合わせて、クラウド向けに拡張されたキー管理システムを提供します。AWS KMS と共に Amazon SQS を使用する場合は、メッセージデータを暗号化したデータキーも暗号化され、保護対象のデータと共に格納されます。

AWS KMS を使用する利点は次のとおりです。

  • カスタマーマスターキー (CMK) を自分で作成して管理することができます。

  • AWS で管理されている Amazon SQS 用 CMK を使用することもできます。このキーは、各アカウントおよびリージョンで一意です。

  • AWS KMS のセキュリティ標準は、暗号化関連のコンプライアンス要件を満たすために役立ちます。

詳細については、『AWS Key Management Service Developer Guide』の「AWS Key Management Service とは何ですか?」および「AWS Key Management Service 暗号化の詳細」ホワイトペーパーを参照してください。

Amazon SQS 用 SSE による暗号化の対象

SSE では、Amazon SQS キュー内のメッセージの本文が暗号化されます。

SSE では、以下は暗号化されません。

  • キューのメタデータ (キュー名と属性)

  • メッセージのメタデータ (メッセージ ID、タイムスタンプ、属性)

  • キューごとのメトリクス

メッセージを暗号化すると、未承認ユーザーまたは匿名ユーザーはそのメッセージを利用できなくなります。これは、Amazon SQS の正常な機能には影響しません。

  • メッセージが暗号化されるのは、キューの暗号化が有効になった後に送信される場合のみです。Amazon SQS では、バックログメッセージの暗号化は行われません。

  • キューの暗号化が無効になっても、暗号化されたメッセージは暗号化された状態で維持されます。

メッセージをデッドレターキューに移動しても、暗号化には影響しません。

  • 暗号化されたソースキューから暗号化されていないデッドレターキューにメッセージが Amazon SQS によって移動された場合も、メッセージは暗号化された状態で維持されます。

  • 暗号化されていないソースキューから暗号化されたデッドレターキューにメッセージが Amazon SQS によって移動された場合、メッセージは暗号化されていない状態で維持されます。

重要な用語

以下の重要な用語は、SSE の機能を理解するうえで役立ちます。詳細については、「Amazon Simple Queue Service API Reference」を参照してください。

データキー

データ暗号化キー (DEK) は、Amazon SQS メッセージの内容を暗号化します。

詳細については、『AWS Key Management Service Developer Guide』の「データキー」、および『AWS 暗号化 SDK 開発者ガイド』の「エンベロープ暗号化」を参照してください。

データキー再利用期間

Amazon SQS がデータキーを再利用して、もう一度 AWS KMS を呼び出す前にメッセージを暗号化または復号できる時間の長さ (秒)。60 秒 (1 分) ~ 86,400 秒 (24 時間) の秒数を表す整数。デフォルトは 300 (5 分) です。詳細については、「データキー再利用期間のしくみ」を参照してください。

注記

万一 AWS KMS に到達できない場合には、接続が再度確立されるまで、Amazon SQS ではキャッシュされたデータキーが継続的に使用されます。

カスタマーマスターキー ID

AWS によってユーザーのアカウント内または別のアカウント内で管理されているカスタマーマスターキー (CMK) またはカスタム CMK のエイリアス、エイリアス ARN、キー ID、またはキー ARN。AWS で管理されている Amazon SQS 用 CMK のエイリアスは常に alias/aws/sqs ですが、カスタム CMK のエイリアスは、alias/MyAlias のように設定できます。これらの CMK を使用して、Amazon SQS キュー内のメッセージを保護することができます。

注記

以下に留意してください。

  • カスタム CMK を指定しない場合、Amazon SQS は Amazon SQS に AWS 管理の CMK を使用します。カスタム CMK を作成する手順については、AWS Key Management Service Developer Guideの「キーの作成」を参照してください。

  • 初めて AWS マネジメントコンソールを使用してキューに Amazon SQS の AWS 管理の CMK を指定する場合、AWS KMS は Amazon SQS 用に AWS 管理の CMK を作成します。

  • または、SSE が有効なキューで SendMessage または SendMessageBatch アクションを初めて使用する場合、AWS KMS は Amazon SQS の AWS 管理の CMK を作成します。

CMK の作成、CMK の使用方法を制御するポリシーの定義、CMK の使用状況の監視を行うには、AWS KMS コンソールの [暗号化キー] セクション、または AWS KMS アクションを使用します。CMK の詳細については、『AWS Key Management Service Developer Guide』の「カスタマーマスターキー」を参照してください。CMK 識別子のその他の例については、『AWS Key Management Service API Reference』の「KeyId」を参照してください。

重要

AWS KMS キーを使用するための追加料金はかかります。詳細については、「AWS KMS の使用料を見積もる方法」 と 「AWS Key Management Service 料金表」を参照してください。

データキー再利用期間のしくみ

Amazon SQS では、単一のカスタマーマスターキー (AWS で管理されている Amazon SQS 用 CMK またはカスタムの CMK) を使用して、データキー再利用期間内に複数の Amazon SQS メッセージのエンベロープ暗号化および復号化が行われます。データキー再利用期間を最大限に活用するには、以下に注意してください。

  • 再利用期間を短くする方がセキュリティを強化できますが、結果として AWS KMS への呼び出しが多くなり、無料利用枠を超える料金が発生することがあります。

  • データキーは暗号化用と復号化用に別々にキャッシュされますが、再利用期間はデータキーの両方のコピーに適用されます。

  • プリンシパル (AWS アカウトまたは IAM ユーザー) は、データキーを共有しません (一意のプリンシパルから送信されたメッセージには、常に一意のデータキーが設定されます)。このため、AWS KMS への呼び出しのボリュームは、データキー再利用期間中に使用されている一意のプリンシパル数の倍数になります。

    • SendMessage アクションまたは SendMessageBatch アクションを使用してメッセージを送信した場合、通常 Amazon SQS はデータキー再利用期間ごとに 1 回、AWS KMS GenerateDataKey アクションと Decrypt アクションを呼び出します。

      注記

      AWS KMS で生成されるデータキーごとに、SSE は Decrypt アクションを呼び出し、使用する前にデータキーの整合性を確認します。

    • ReceiveMessage アクションを使用してメッセージを受信した場合、通常 Amazon SQS はデータキー再利用期間ごとに 1 回、AWS KMS の Decrypt アクションを呼び出します。

AWS KMS の使用料を見積もる方法

AWS のコストを予測し、請求内容をより正確に把握するには、Amazon SQS でカスタマーマスターキー (CMK) が使用される頻度を調べることをお勧めします。

注記

コストは下の計算式でかなり正確に予測できますが、Amazon SQS の分散性により、実際のコストの方が高くなることがあります。

キューあたりの API リクエスト数 (R) を計算するには、次の計算式を使用します。

R = B / D * (2 * P + C)

B は請求期間 (秒) です。

D は、データキー再利用期間 (秒) です。

P は、Amazon SQS キューに送信する、プロデューサー側のプリンシパル数です。

C は、Amazon SQS キューから受信する、コンシューマー側のプリンシパル数です。

重要

一般的に、プロデューサー側プリンシパルで発生するコストはコンシューマー側プリンシパルの倍程度になります。詳細については、「データキー再利用期間のしくみ」を参照してください。

プロデューサーとコンシューマーの IAM ユーザーが異なる場合、コストは増加します。

以下は計算の例です。正確な料金情報については、「AWS Key Management Service の料金」を参照してください。

例 1: AWS KMS API 呼び出し数の計算 (2 プリンシパル、1 キュー)

この例では、次のように想定しています。

  • 請求期間は 1 月 1 日~ 31 日 (2,678,400 秒) です。

  • データキー再利用期間は 5 分 (300 秒) に設定されています。

  • キューの数は 1 つです。

  • プロデューサー側プリンシパルが 1 つ、コンシューマー側プリンシパルが 1 つあります。

2,678,400 / 300 * (2 * 1 + 1) = 26,784

例 2: AWS KMS API 呼び出し数の計算 (複数のプロデューサーとコンシューマー、2 キュー)

この例では、次のように想定しています。

  • 請求期間は 2 月 1 日~ 28 日 (2,419,200 秒) です。

  • データキー再利用期間は 24 時間 (86,400 秒) に設定されています。

  • キューの数は 2 つです。

  • 1 つ目のキューのプロデューサー側プリンシパルは 3 つ、コンシューマー側プリンシパルは 1 つです。

  • 2 つ目のキューのプロデューサー側プリンシパルは 5 つ、コンシューマー側プリンシパルは 2 つです。

(2,419,200 / 86,400 * (2 * 3 + 1)) + (2,419,200 / 86,400 * (2 * 5 + 2)) = 532

Amazon SQS 用の SSE を使用する場合に必要な AWS KMS アクセス許可

SSE を使用するには、キューの暗号化およびメッセージの暗号化と復号を許可するよう AWS KMS キーポリシーを設定する必要があります。 AWS KMS アクセス許可の例と詳細については、『AWS Key Management Service Developer Guide』の「AWS KMS API のアクセス権限: アクションとリソースのリファレンス」を参照してください。

注記

IAM ポリシーを使用して KMS キーのアクセス許可を管理することもできます。詳細については、「AWS KMS での IAM ポリシーの使用」を参照してください。

Amazon SQS との間の送受信のグローバルなアクセス許可を設定できますが、AWS KMS では IAM ポリシーの Resource セクションで、特定リージョンで CMK の完全 ARN を明示的に指定することが求められます。

また、カスタマーマスターキー (CMK) のキーポリシーで、必要なアクセス権限を許可していることを確認する必要があります。 これには、Amazon SQS で暗号化されたメッセージを作成するプリンシパルと消費するプリンシパルをユーザーとして CMK キーポリシーで指定します。

または、必要な AWS KMS アクションと CMK ARN を IAM ポリシーで指定して、暗号化されたメッセージを Amazon SQS で作成するプリンシパルと消費するプリンシパルに、このポリシーを割り当てます。詳細については、『AWS Key Management Service Developer Guide』の「AWS KMS CMK へのアクセスの管理」を参照してください。

例 1: SSE を使用してキューへの単独またはバッチでのメッセージ送信をユーザーに許可する

プロデューサーには、カスタマーマスターキー (CMK) に対する kms:GenerateDataKey アクセス許可および kms:Decrypt アクセス許可が必要です。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "arn:aws:kms:us-east-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab" }, { "Effect": "Allow", "Action": [ "sqs:SendMessage", "sqs:SendMessageBatch" ], "Resource": "arn:aws:sqs:*:123456789012:MyQueue" }] }

例 2: SSE を使用してキューからのメッセージの受信をユーザーに許可する

コンシューマーには、指定されたキュー内でメッセージを暗号化するために使用されるカスタマーマスターキー (CMK) に対する kms:Decrypt アクセス許可が必要です。キューをデッドレターキューとして使用する場合、コンシューマーには、ソースキュー内でメッセージの暗号化に使用される CMK に対する kms:Decrypt アクセス許可も必要です。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "arn:aws:kms:us-east-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab" }, { "Effect": "Allow", "Action": [ "sqs:ReceiveMessage" ], "Resource": "arn:aws:sqs:*:123456789012:MyQueue" }] }

例 3: SSE を使用して、Amazon CloudWatch Events、Amazon S3、Amazon SNSなどの AWS サービスとキューの間で互換性を保つ

Amazon CloudWatch Events、Amazon S3 イベント通知、または Amazon SNS トピックサブスクリプションが暗号化されたキューを使用できるようにするには、以下のステップを実行します。

  1. カスタマーマスターキー (CMK) を作成します。

  2. AWS サービス機能に kms:GenerateDataKey* および kms:Decrypt アクセス許可を付与するには、以下のステートメントを CMK のポリシーに追加します。

    注記

    • Amazon CloudWatch Events の場合は events を使用する

    • Amazon S3 イベント通知の場合は s3 を使用する

    • Amazon SNS トピックサブスクリプションの場合は sns を使用する

    { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Service": "service.amazonaws.com" }, "Action": [ "kms:GenerateDataKey*", "kms:Decrypt" ], "Resource": "*" }] }
  3. 新しい SSE キューを作成するか、CMK の ARN を使用して既存の SSE キューを設定します。

詳細はこちら

エラー

Amazon SQS および AWS KMS を使用する場合、エラーが発生することがあります。次のリストは、エラーおよび考えられるトラブルシューティング策を示しています。

KMSAccessDeniedException

暗号化テキストは、存在しないキーまたはアクセス権限のないキーを参照しています。

HTTP ステータスコード: 400

KMSDisabledException

指定された CMK が有効ではないため、リクエストが拒否されました。

HTTP ステータスコード: 400

KMSInvalidStateException

指定されたリソースの状態がこのリクエストに対して有効ではないため、リクエストが拒否されました。詳細については、『AWS Key Management Service Developer Guide』の「キーステータスがカスタマーマスターキーの使用に与える影響」を参照してください。

HTTP ステータスコード: 400

KMSNotFoundException

指定されたエンティティまたはリソースが見つからないため、リクエストが拒否されました。

HTTP ステータスコード: 400

KMSOptInRequired

サービスを利用するためには、AWS アクセスキー ID を取得する必要があります。

HTTP ステータスコード: 403

KMSThrottlingException

リクエストは、制限が必要なために実行が拒否されました。スロットリングの詳細については、『AWS Key Management Service Developer Guide』の「制限」を参照してください。

HTTP ステータスコード: 400