Kinesisストリームのサーバーサイド暗号をAWS CLIから使ってみた
Kinesisストリームはストレージ保存時にデータを暗号化するサーバーサイド暗号(SSE)に対応しています。
SSEを利用すると、ストリームのストレージに書き込むときにデータを暗号化し、ストレージのデータにアクセスするときに復号し、保管時のデータを反故できます。
今回はAWS CLIからSSEを利用する手順を解説します。
管理画面からの利用は次のブログを参照下さい。
利用するAPIについて
Kinesis ストリームのサーバーサイド暗号操作では以下のAPIを利用します
- 暗号を有効化 : start-stream-encryption
- 暗号を無効化 : stop-stream-encryption
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 の一覧から確認します。
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" } ] }
作業の流れ
- Kinesis ストリームの作成
- Kinesis ストリームの暗号を有効化
- 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 の変更は完了したことになります。
参考
- AWS Documentation » Amazon Kinesis Streams » Developer Guide » Working With Amazon Kinesis Streams » Using Server-Side Encryption
- AWS CLI Command Reference : Kinesis stop-stream-encryption
- AWS CLI Command Reference : Kinesis start-stream-encryption
- New: Server-Side Encryption for Amazon Kinesis Streams | AWS Blog