[SQS] サーバーサイド暗号化(SSE)を有効化/無効化し挙動を検証する

2017.04.30

こんにちは。菊池です。

先のブログで紹介した通り、Amazon SQSでサーバーサイド暗号化(SSE)が可能になりました。

この暗号化を有効化・無効化した際の挙動について調べてみました。

はじめに

サーバーサイド暗号化の挙動については公式ドキュメントに記載がありますが、その中で以下のような記述があります。

Encrypting a message makes its contents unavailable to unauthorized or anonymous users. This doesn't affect the normal functioning of Amazon SQS:

  • A message is encrypted only if it is sent after the encryption of a queue is enabled. Amazon SQS doesn't encrypt backlogged messages.
  • Any encrypted message remains encrypted even if the encryption of its queue is disabled.

Moving a message to a dead letter queue does not affect its encryption:

  • When Amazon SQS moves a message from an encrypted source queue to a unencrypted dead letter queue, the message remains encrypted.
  • When Amazon SQS moves a message from a unencrypted source queue to an encrypted dead letter queue, the message remains unencrypted.

What Does SSE for Amazon SQS Encrypt?

 

  • 暗号化する前に保存されたメッセージは、キューの暗号化を有効化しても暗号化されないままである
  • 暗号化されたメッセージはキューの暗号化を無効にしても暗号化されたまま残る
  • 暗号化されたキューから暗号化されていないデッドレターキューにメッセージを移動しても暗号化はされたまま
  • 暗号化されていないメッセージを暗号化されたデッドレターキューに移動しても、暗号化はされない

要するに、メッセージを保存したタイミングで必要な場合のみ、暗号化の処理は行われ、その後にキューを暗号化/無効化してもメッセージに影響はないということです。

上記の仕様について実際に試してみたいと思います。

試してみた

KMSのカスタマーマスターキーを利用可能なIAM Role Aと、利用できないIAM Role Bの2つを用意し、暗号化有効/無効のキューに対しアクセスしてみます。

キューの暗号化解除後にメッセージを取得

  1. キューの暗号化を有効化
    • Role Aからメッセージ1送信(暗号化される)
  2. キューの暗号化を無効化
    1. Role Aからメッセージ2送信(暗号化はされない)
    2. Role Bからメッセージ受信

Role Bでメッセージ1、2がそれぞれ受信可能か確認します。

sqs-sse-bh-001

まずは暗号化されたキューにRole Aからメッセージ1を送信します。

sqs-sse-bh-004

$ aws --region us-west-2 sqs send-message --queue-url https://sqs.us-west-2.amazonaws.com/xxxxxxxxxxxx/test-que --message-body "message 01"
{
    "MD5OfMessageBody": "8ec92cc65f3b28d6d356d61d0ce42b60",
    "MessageId": "110705e5-3c15-4efe-a25f-81f48705a374"
}

続いて、暗号化を解除してメッセージ2を送信します。

sqs-sse-bh-005

$ aws --region us-west-2 sqs send-message --queue-url https://sqs.us-west-2.amazonaws.com/xxxxxxxxxxxx/test-que --message-body "message 02"
{
    "MD5OfMessageBody": "45c23b6731a7d059ae49c50a68d6990a",
    "MessageId": "85bd51a6-acee-494b-bf20-4c4d52b3b7b8"
}

この状態で、ロールBからメッセージを受信してみます。

$ aws --region us-west-2 sqs receive-message --queue-url https://sqs.us-west-2.amazonaws.com/xxxxxxxxxxxx/test-que
{
    "Messages": [
        {
            "Body": "message 02",
            "ReceiptHandle": "AQEBhTx6UPgqPsPmIdv4yvfCQMvOTghL4KKnDGo8tJZEYZiUD0f/zX4LONT0FFgEjd3ROLBBjQd2keytxIJwrfnAEkZQW1XqGvIBCmmRbY3Brb+lIM9DjDUUAheDEahK4XxXIGNXONYJ7jGSkZ0/2zWcY5lw2l4L6wlS1wZ2LTkClG8Y/ZKBx/wMkDsMz6eu+eQxIFfYj0wLG2Cb+jpjMN0BUXNRNXmLw3yhhGZA9pqMnEwlsCy1iYhWQ9orJ7zoCnWnWRTkLIyj3oWAy3Q+xOautK1yhexX2KeSS6fUKW7nR6RuMLgjFN4naKYIhAx5k2e5rubxL4uTr4qLlZwZfSN4Lsaf2ZtWb9DQNaVJBwOv2yGMIjFLrbNVTDU93a9BjEzPHiehC+C83tqcVqjlqpCsZA==",
            "MD5OfBody": "45c23b6731a7d059ae49c50a68d6990a",
            "MessageId": "85bd51a6-acee-494b-bf20-4c4d52b3b7b8"
        }
    ]
}
$ aws --region us-west-2 sqs receive-message --queue-url https://sqs.us-west-2.amazonaws.com/xxxxxxxxxxxx/test-que

An error occurred (KMS.AccessDeniedException) when calling the ReceiveMessage operation: The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access. (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: 761a5831-2d24-11e7-b571-95ae05cc52ee)

暗号化解除後に送信したメッセージ2は受信できましたが、暗号化状態で送信したメッセージ1は受信できませんでした。

CMKを利用できるロールAで受信してみます。

$ aws --region us-west-2 sqs receive-message --queue-url https://sqs.us-west-2.amazonaws.com/xxxxxxxxxxxx/test-que
{
    "Messages": [
        {
            "Body": "message 02",
            "ReceiptHandle": "AQEBMXjc+sNGhpwNjQXdEl1T5D1AuXSHniCQfhLmkT9AndjVgIVJW8lRq6scRpgpjOY/G3JZEZiOJT+2sAgfusDWgXOqofFNCLc8P0VQ2BIkvd0ChqAIdvZaEW+/RZbqtnuQqOK1jEQlI3aryGd7FiGJiKQFPcIgRXMViS/1640wrYEp7rr0CXsLxoIl+2cHLgzXAduHbX6IA95WdmlnhTuTIiFTmpYhS0x4fFY9ikyiua2jRquPZo6YimCHdaoQCa70L5QW/PdwbLSIO9WfBWEadRcW1TrvwE/kFHm9sszbCS8oJpPGvE1iBFsi+9kUOdAcMWup+gJuuGPfPQEBDZTO9brZidG2G2G+hFspx4pMj25NG9f6h8twUdL3jmfnOqBLPSjcz2lSSi8m3NPd+EvszQ==",
            "MD5OfBody": "45c23b6731a7d059ae49c50a68d6990a",
            "MessageId": "85bd51a6-acee-494b-bf20-4c4d52b3b7b8"
        }
    ]
}
$ aws --region us-west-2 sqs receive-message --queue-url https://sqs.us-west-2.amazonaws.com/xxxxxxxxxxxx/test-que
{
    "Messages": [
        {
            "Body": "message 01",
            "ReceiptHandle": "AQEBDfI7OyIvKAShYhgAYPuWd9NR69Fn5hVDwva2xakfof/b8XNHVDRHM7jxMipgxTsdRfMRjj3fZHYq3sxTGYRn+Dajc305GowednSRV2TUBZkPdfWj7+U1EHvRetkdhsGgGelEDiq/hzeyL6hcX/TjN+wg0bSMwAWFhJm2YVp1c6wiR8G4AkSH6PQbw5jO4rk8cp/OKQJIVuZdiUZwqFZhc/tk/oEZZBzORDjgCzz1UfAVDY6ZW8jIYnxDKQaYeNVX+uUSVOLclYkFj8XchrtgCBhxEc4TRC/Ec7k5KiN+0lYGq66Vxly66Ajkd0VMte+8yfkk2agJhOSU0D5YlV79b5rK+xjzm+7BYLD3JwrPn5knKcmc3+Wfkvna2JO8rFM8dQ22QJDXExl7catA2Rtd7w==",
            "MD5OfBody": "8ec92cc65f3b28d6d356d61d0ce42b60",
            "MessageId": "110705e5-3c15-4efe-a25f-81f48705a374"
        }
    ]
}

こちらはメッセージ1、2ともに受信できました。

キューの暗号化後にメッセージを取得

  1. キューの暗号化を無効化
    • Role Aからメッセージ3送信(暗号化されない)
  2. キューの暗号化を有効化
    1. Role Aからメッセージ4送信(暗号化はされる)
    2. Role Bからメッセージ受信

同様にロールBからメッセージの受信可否を試します。

sqs-sse-bh-002

まず、暗号化無効のキューにメッセージ3を送信します。

sqs-sse-bh-006

$ aws --region us-west-2 sqs send-message --queue-url https://sqs.us-west-2.amazonaws.com/xxxxxxxxxxxx/test-que --message-body "message 03"
{
    "MD5OfMessageBody": "8c0b39678acd2bfbda670584aa150d94",
    "MessageId": "25d89ee7-78fc-4cf5-8d57-5a850e490c28"
}

次に、キューの暗号化を有効化してメッセージ4を送信します。

sqs-sse-bh-007

$ aws --region us-west-2 sqs send-message --queue-url https://sqs.us-west-2.amazonaws.com/xxxxxxxxxxxx/test-que --message-body "message 04"
{
    "MD5OfMessageBody": "884ff59a6a9d784b55f1d510bfc477ea",
    "MessageId": "6fbd5f99-8abb-4015-a147-10b6d32b8ae8"
}

この状態で、ロールBからメッセージを受信してみます。

$ aws --region us-west-2 sqs receive-message --queue-url https://sqs.us-west-2.amazonaws.com/xxxxxxxxxxxx/test-que
{
    "Messages": [
        {
            "Body": "message 03",
            "ReceiptHandle": "AQEBSecxhuiZe4SSy11eteXC0NgbvSaOEBHe7Ej9SesFH8H5ZWJtPTjpL27xaRAQe9+0bHYlSRhaPjYoyjemqiwLCcA9y/B4bKwnrX8bVSLMe6//EoF3IUbWGMMjJRtk96aiC4ECWt0aXkd+wJD4NaAdSPhWTkwurPMA2NEJAyWwXy1AoSgp6Exswwvt9iGAK3QijTFNLbyBHOaQrFRzw49blAxFf5moxOIVL0lScls7EXQTzUD6onDyvztKzU+99Ux2G5AStLzZV9XaijWbHtXNDAiNB4mR+b14NPhZ7VQvtxYriyS2qAZYlyyJpnktnBmTCUBqnaqGH1c6pdSJrIvaMGarhKomhjRruq2gj+KFB4akDMvV0Vn+AFGeCR4zGM7VDswnDcMU/ryCyxJaa7ULMw==",
            "MD5OfBody": "8c0b39678acd2bfbda670584aa150d94",
            "MessageId": "25d89ee7-78fc-4cf5-8d57-5a850e490c28"
        }
    ]
}
$ aws --region us-west-2 sqs receive-message --queue-url https://sqs.us-west-2.amazonaws.com/xxxxxxxxxxxx/test-que

An error occurred (KMS.AccessDeniedException) when calling the ReceiveMessage operation: The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access. (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: 1dc7ea2e-2d25-11e7-93b5-3de3e360c5eb)

暗号化前に送信したメッセージ3は受信できましたが、暗号化後に送信したメッセージ4は受信できませんでした。

ロールAから受信してみます。

$ aws --region us-west-2 sqs receive-message --queue-url https://sqs.us-west-2.amazonaws.com/xxxxxxxxxxxx/test-que
{
    "Messages": [
        {
            "Body": "message 03",
            "ReceiptHandle": "AQEB+NL5zirNiJNF91iRHk85ArUs92vXJT8re6LB8mH4CIriJh4Vuhe8uGZ2EKSgkBvhWmns3xfYkRBW8qpCyRYyNErCifZrs4LvT7NXtqWmDSlJUVAln2v9PBCArZ0Aht01G0P9jG7HsFCP2tvmcLZ56FGrdU/Q6FnXVLMxViuwxBDAKSg53BkxU4VKl+M/qSaAgp8CDwZgZ31D0U1x3UO1RtZXMioayCjy60AQpr9KYIgheuRfJMZzgAqv1XHDp9H/t/VzYozqiH6ImlMfFBab+LAH3bTTIfaaO3AUe2J7OVd6C5HyXjDkWJOPfCGSZ6j+0DUfefbUN7XiUW0prP0YhFQbiF5j4xLFnUyJYMXQMT6QFfPZsiOon80jEuHVqpiHIfT7VqCl60ySsyxn5PnScA==",
            "MD5OfBody": "8c0b39678acd2bfbda670584aa150d94",
            "MessageId": "25d89ee7-78fc-4cf5-8d57-5a850e490c28"
        }
    ]
}
HL00190-2:~ kikuchi.shuji$ aws --region us-west-2 sqs receive-message --queue-url https://sqs.us-west-2.amazonaws.com/xxxxxxxxxxxx/test-que
{
    "Messages": [
        {
            "Body": "message 04",
            "ReceiptHandle": "AQEBpuNvqhGMnvVuzVMXQ8a50NY5pOItCPAGAjsP2p7+C5HjVlScPNbtl3R4u8AYJAhRgZq9YsFUtePW6OuE3RZgClK7GrZB0ELbVS2/6FyZuV1R20yRHEv9iKyrCSsua84fgiIIEBq5eFEsD6Fsc2fCHmgY++9MhTQlQAnEIccikRg9ZK87zbHnrEIMSCb40ydGPU0v1OjOxuf+QiuyhBwH1T+wc/HlSY6+t4nEtzQ1KGNHldo8idzjH4m8JvIoGic8nOVyQEHfevMK2cim1g/AeKevUd0/1JyuUwVzcnKamyy0MmiIP+38FpxFg6hdZidwlzCjmOwY+gE5feQyp0sw4TkJ5+1UcfhPaJgGKR3ny3TGtsBZfK2PfJnmpOglSxtq8t+LQLCAd0iMx5klCvTHeg==",
            "MD5OfBody": "884ff59a6a9d784b55f1d510bfc477ea",
            "MessageId": "6fbd5f99-8abb-4015-a147-10b6d32b8ae8"
        }
    ]
}

ロールAからはどちらのメッセージも受信できました。

暗号化されたキューから暗号化されていないデッドレターキューに移動

  1. Role Aからキューへメッセージ5送信(暗号化される)
  2. Role Aからメッセージを受信しデッドレターキュー(暗号化なし)へ移動
  3. Role Bからデッドレターキューへメッセージ6送信(暗号化されない)
  4. Role Bからデッドレターキューのメッセージ受信

sqs-sse-bh-003

デッドレターキューtest-dlqueを用意し、test-queのデットレターキューに指定します。

sqs-sse-bh-008

メッセージ5をtest-que送信、すぐに受信してデッドレターキューtest-dlqueに移動させます。

$ aws --region us-west-2 sqs send-message --queue-url https://sqs.us-west-2.amazonaws.com/xxxxxxxxxxxx/test-que --message-body "message 05"
{
    "MD5OfMessageBody": "483d60f224a698f55a00eb9e6a16352e",
    "MessageId": "ca044acd-afad-4786-b46c-555c2e32cc43"
}
$ aws --region us-west-2 sqs receive-message --queue-url https://sqs.us-west-2.amazonaws.com/xxxxxxxxxxxx/test-que
{
    "Messages": [
        {
            "Body": "message 05",
            "ReceiptHandle": "AQEBwcv6qzrTCa8fcWPbA3h5t7ehSNJfxz4G7x1+JlJRxdOKNcafCFpsC0z05vIhv9DYpS8l4kFXexRD47QPtZj70aLBkmxK0lw/zGrniCcjQ9NEbsANWPmsxIuN/y2CPK3SPyZp67fSSobxTht8Y/Iup6T9chHmA81SgCmbQ5Z2c2FW+O60sju0TzdHKU7mDNsQHjSSZIlJTv0V9xOo5dgCK6PLn88zju4rmmAGr7UN86fs8WFcQ0+kg8G/6SERj2niV7rb94wFo1uA5DlavtQMdjV+naly74B5lJapMSqmiMVuwbTS+uEUFINEIemxaANOzkuQFn8Lnooaq8FzqB29vetUET18RZj6mE9Jfu3CaDrUC5iURy+Vm5tp1aG79RXwE/efL7mJ2p/I+G4Spec8tA==",
            "MD5OfBody": "483d60f224a698f55a00eb9e6a16352e",
            "MessageId": "54c59adc-c66f-4363-b3ff-b77796288618"
        }
    ]
}

暗号化されていないデッドレターキューにもメッセージ6を送信します。

$ aws --region us-west-2 sqs send-message --queue-url https://sqs.us-west-2.amazonaws.com/xxxxxxxxxxxx/test-dlque --message-body "message 06"
{
    "MD5OfMessageBody": "028ee0bbccf17b2f9a27be1bf5351938",
    "MessageId": "8b00493d-8139-49de-8222-c1c3f5ccdfc1"
}

この状態で、ロールBからメッセージを受信してみます。

$ aws --region us-west-2 sqs receive-message --queue-url https://sqs.us-west-2.amazonaws.com/xxxxxxxxxxxx/test-dlque
{
    "Messages": [
        {
            "Body": "message 06",
            "ReceiptHandle": "AQEBbyxLdwEK7d0lxW/Q0l3ZGioR8juvMQhSTUVeeX2/QyCvf87GJIHh/AFNCkZRIH/4GfmwYrFGesM5OTwzsRouyo3ki/6nD1Qm+qd3ea44g4bL3O5auM9KsEOx0ZxHlXJU3/sZYLZICxUcO3dQUwBRVIMEexYLO4JkgwlsE5cCfe7oYT27n/TRXQMh/UVm3npyiDZwRrEcX8KYkIMkn2whtHeeHwL51J5zeDR53q/PBk6Vlqzr8XrpoJuiG2Ic/jgZv/mNPVPwFKFghw+pbcnQTrLLARebk/4oQ4d6BrYku2P6EbMXb6W9FdONCaSARN4UjqW4kEYLi6yRQ29ibxIJdRVBi9HYjM7iU7pBOy+Z+Z2ulcSKrHdued91NEBfb0/GFdLgCFHCB+U1SXZT6qSngQ==",
            "MD5OfBody": "028ee0bbccf17b2f9a27be1bf5351938",
            "MessageId": "8b00493d-8139-49de-8222-c1c3f5ccdfc1"
        }
    ]
}
$ aws --region us-west-2 sqs receive-message --queue-url https://sqs.us-west-2.amazonaws.com/xxxxxxxxxxxx/test-dlque

An error occurred (KMS.AccessDeniedException) when calling the ReceiveMessage operation: The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access. (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: aa35a8e7-2d26-11e7-944b-db6036f5aa29)

やはり、暗号化が有効化されていないデッドレターキューにメッセージが移動後も、暗号化されたメッセージは取得できませんでした。

まとめ

仕様通り、メッセージを送信した段階で暗号化されたものは、キューの暗号化無効化後も暗号化されたままでした。また、暗号化されなかったメッセージは、キューの暗号化設定後も暗号化されません。

また、暗号化されていて取得できないメッセージにも不可視タイマーは有効なようで、複数回受信を試したところ後から送信した暗号化されていないメッセージが取得可能でした。

これらの動きを理解するには、以下のKMSの資料がわかりやすかったです。

暗号化を有効化すると、暗号化したメッセージと一緒に、暗号化されたデータキーが保存されます。そのため、CMKが利用できないロールからはメッセージをキューから取り出すことはできても、データキー/メッセージを復号することができないようです。

ドキュメントに実際に書かれている仕様も、実際に手を動かして試してみることで理解が深まりました。