Kinesisストリームのサーバーサイド暗号をAWS CLIから使ってみた

2017.07.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Kinesisストリームはストレージ保存時にデータを暗号化するサーバーサイド暗号(SSE)に対応しています。

SSEを利用すると、ストリームのストレージに書き込むときにデータを暗号化し、ストレージのデータにアクセスするときに復号し、保管時のデータを反故できます。

今回はAWS CLIからSSEを利用する手順を解説します。

管理画面からの利用は次のブログを参照下さい。

Kinesisストリームのサーバーサイド暗号を使ってみた

利用するAPIについて

Kinesis ストリームのサーバーサイド暗号操作では以下のAPIを利用します

KMS マスターキーについて

KinesisストリームのSSEでは暗号化のマスターキーにKMSを利用します。

鍵の指定方法

CLIの --key-id 引数に対して以下のいずれかの鍵情報を渡します。

  • Key ARN Example: arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012
  • Alias ARN Example: arn:aws:kms:us-east-1:123456789012:alias/MyAliasName
  • Globally Unique Key ID Example: 12345678-1234-1234-1234-123456789012
  • Alias Name Example: alias/MyAliasName
  • Kinesis-owned master key: alias/aws/kinesis

管理画面からの鍵情報の確認方法

管理画面の IAM 配下にある KMS の一覧から確認します。

amc-kms

CLI からの鍵情報の確認方法

CLI から KMS サービスに対して

  • list-keys
  • list-aliases

といったAPIで問い合わせて確認します。

list-aliasesの方が情報量が多くて便利です。

list-keys API : カスタマーマスターキーをリスト

$ aws kms list-keys
{
    "Keys": [
        {
            "KeyArn": "arn:aws:kms:eu-west-1:123456789012:key/13c27a98-f8a7-4463-b3ff-7f5e7cfafca1",
            "KeyId": "13c27a98-f8a7-4463-b3ff-7f5e7cfafca1"
        },
        ...
        {
            "KeyArn": "arn:aws:kms:eu-west-1:123456789012:key/785ed09f-093e-4470-a683-c895c4659c82",
            "KeyId": "785ed09f-093e-4470-a683-c895c4659c82"
        }
    ]
}

list-aliases API : アカウントにある全てのエイリアスキーをリスト

$ aws kms list-aliases
{
    "Aliases": [
        {
            "AliasArn": "arn:aws:kms:eu-west-1:123456789012:alias/CMK",
            "AliasName": "alias/CMK",
            "TargetKeyId": "2d90c20f-f675-48ed-8bb3-876faa175402"
        },
        ...,
        {
            "AliasArn": "arn:aws:kms:eu-west-1:123456789012:alias/aws/kinesis",
            "AliasName": "alias/aws/kinesis",
            "TargetKeyId": "5ea09198-4e57-4baf-8c23-411b9384f38a"
        },
        ...
        {
            "AliasArn": "arn:aws:kms:eu-west-1:123456789012:alias/aws/ssm",
            "AliasName": "alias/aws/ssm"
        }
    ]
}

作業の流れ

  1. Kinesis ストリームの作成
  2. Kinesis ストリームの暗号を有効化
  3. Kinesis ストリームの暗号を無効化

1. Kinesis ストリームの作成

Kinesisストリームを作成します。 サーバーサイド暗号が対応している以下のリージョンで作成して下さい。

  • US East (Ohio) us-east-2
  • US East (N. Virginia) us-east-1
  • US West (Oregon) us-west-2
  • US West (N. California) us-west-1
  • AWS GovCloud (US) us-gov-west-1
  • Canada (Central) ca-central-1
  • EU (Ireland) eu-west-1
  • EU (London) eu-west-2
  • EU (Frankfurt) eu-central-1
  • Asia Pacific (Tokyo) Region ap-northeast-1
  • Asia Pacific (Seoul) Region ap-northeast-2
  • Asia Pacific (Singapore) ap-southeast-1
  • Asia Pacific (Mumbai) ap-south-1
  • Asia Pacific (Sydney) ap-southeast-2
  • South America (São Paulo) sa-east-1

今回は EU (Ireland) を利用しました。

$ aws kinesis create-stream --stream-name foo --shard-count 1

 {
     "StreamDescription": {
         "KeyId": null,
         "EncryptionType": "NONE",
         "StreamStatus": "ACTIVE",
         "StreamName": "foo",
         "Shards": [
             {
                 "ShardId": "shardId-000000000000",
                 "HashKeyRange": {
                     "EndingHashKey": "340282366920938463463374607431768211455",
                     "StartingHashKey": "0"
                 },
                 "SequenceNumberRange": {
                     "StartingSequenceNumber": "49575038672772841309115505528461211366058561365902098434"
                 }
             }
         ],
         "StreamARN": "arn:aws:kinesis:eu-west-1:123456789012:stream/foo",
         "EnhancedMonitoring": [
             {
                 "ShardLevelMetrics": []
             }
         ],
         "RetentionPeriodHours": 24
     }
 }

初期状態ではストリームの暗号化は無効化されているため

  "KeyId": null,
  "EncryptionType": "NONE",

という表示になっています。

2. ストリームの暗号を有効化

暗号を有効化するにはstart-stream-encryption API を利用します。

鍵を付け替える時もこのAPIを利用します。

$ aws kinesis start-stream-encryption \
  --stream-name foo \
  --encryption-type KMS \
  --key-id "alias/aws/kinesis"

各オプションの意味について

オプション 備考
--stream-name ストリーム名
--encryption-type 鍵の種類。KMS固定
--key-id KMSマスター鍵

暗号化が有効になった状態が以下です。

$ aws kinesis describe-stream --stream-name foo
{
    "StreamDescription": {
        "KeyId": "alias/aws/kinesis",
        "EncryptionType": "KMS",
        "StreamStatus": "ACTIVE",
        "StreamName": "foo",
        "Shards": [
            {
                "ShardId": "shardId-000000000000",
                "HashKeyRange": {
                    "EndingHashKey": "340282366920938463463374607431768211455",
                    "StartingHashKey": "0"
                },
                "SequenceNumberRange": {
                    "StartingSequenceNumber": "49575028884351352808466151260471461389056657087524765698"
                }
            }
        ],
        "StreamARN": "arn:aws:kinesis:eu-west-1:123456789012:stream/foo",
        "EnhancedMonitoring": [
            {
                "ShardLevelMetrics": []
            }
        ],
        "RetentionPeriodHours": 24
    }
}

暗号化が有効な状態でデータを送受信します。

データの送信

暗号が有効になっていると、PutRecord/PutRecords のレスポンスに "EncryptionType": "KMS" のフィールドが含まれます。

$ aws kinesis put-record --stream-name foo --data b --partition-key b
{
    "ShardId": "shardId-000000000000",
    "EncryptionType": "KMS",
    "SequenceNumber": "49574905023871648630326283351698946508459383806471700482"
}

データの取得

暗号が有効になってた状態で保存されたデータを取得すると、GettRecords のレスポンスに "EncryptionType": "KMS" のフィールドが含まれます。

$ aws kinesis get-records --shard-iterator "DUMMY"
{
    "Records": [
        {
            "Data": "Yg==",
            "PartitionKey": "b",
            "ApproximateArrivalTimestamp": 1499878938.69,
            "EncryptionType": "KMS",
            "SequenceNumber": "49575030693030991390093810531763277195232933088973553666"
        }
    ],
    "NextShardIterator": "DUMMY-NEXT",
    "MillisBehindLatest": 0
}
$ echo "Yg==" | base64 -d
b

3. ストリームの暗号を無効化

暗号を無効化するには stop-stream-encryption API を利用します。

$ aws kinesis stop-stream-encryption \
  --stream-name foo \
  --encryption-type KMS \
  --key-id "alias/aws/kinesis"

各オプションの意味について

オプション 備考
--stream-name ストリーム名
--encryption-type 鍵の種類。KMS固定
--key-id KMSマスター鍵

暗号化が無効になった状態が以下です。

$ aws kinesis describe-stream --stream-name foo
{
    "StreamDescription": {
        "KeyId": null,
        "EncryptionType": "NONE",
        "StreamStatus": "ACTIVE",
        "StreamName": "foo",
        "Shards": [
            {
                "ShardId": "shardId-000000000000",
                "HashKeyRange": {
                    "EndingHashKey": "340282366920938463463374607431768211455",
                    "StartingHashKey": "0"
                },
                "SequenceNumberRange": {
                    "StartingSequenceNumber": "49575028884351352808466151260471461389056657087524765698"
                }
            }
        ],
        "StreamARN": "arn:aws:kinesis:eu-west-1:123456789012:stream/foo",
        "EnhancedMonitoring": [
            {
                "ShardLevelMetrics": []
            }
        ],
        "RetentionPeriodHours": 24
    }
}

注意

  • 同じストリームに対して24時間に25個までしか新しい鍵を登録できません。
  • start-stream-encryption/stop-stream-encryption API を呼び出し後、ストリームは UPDATING 状態に遷移します。 ACTIVE ステータスになると、API の変更は完了したことになります。

参考