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