はじめに
機密性の高いデータを運用するには、暗号化の施策が必要になります。その際に重要になるのが、暗号化や復号化のための鍵の管理です。今回は KMS を使ってデータの暗号化と復号化をしてみようと思います。
KMS とは
AWS Key Management Service のことで CMK(カスタマーマスターキー)を管理して、データキーを生成・暗号化・復号するなど、暗号化に必要なキー管理、キーオペレーションを提供するマネージドサービスです。
対称暗号化とは
KMS は対称暗号化と非対称暗号化をサポートしており、今回は対称暗号化について書きます。対称暗号化では一つのデータキーを使った暗号化と復号を行います。
KMS の機能
機能 | 用途 |
---|---|
Encrypt | データの暗号化 |
Decrypt | データの復号化 |
GenerateDataKey | ユーザがデータを暗号化するための CMK を生成 |
CMK(カスタマーマスターキー)と CDK(カスタマーデータキー)
CMK は CDK を暗号化するための鍵で、CDK はデータを暗号化するための鍵です。KMS では CDK でデータを暗号化してから、CDK を CMK で暗号化する手法をとっています。これは CDK の保護のためで、この手法はエンベロープ暗号化と言われています。
KMS を使った暗号化
以下の順番でデータの暗号化を行います。
1. CMK を使って暗号化されている CDK と暗号化されていない CDK を作成する
2. 暗号化されていない CDK を使ってデータを暗号化する
3. 暗号化されていない CDK を削除する
KMS を使った復号化
以下の順番でデータの復号化を行います。
1. CMK を使って暗号化されている CDK を復号化する
2. 復号化された CDK を使って暗号化されているデータを復号化する
手順
- CMK の作成
- 暗号化
- CMK を使って暗号化されている CDK と暗号化されていない CDK を作成する
- 暗号化されていない CDK を使ってデータを暗号化する
- 暗号化されていない CDK を削除する
- 復号化
- CMK を使って暗号化されている CDK を復号化する
- 復号化された CDK を使って暗号化されているデータを復号化する
1. CMK の作成
キータイプを対称とします。
エイリアスを設定します。
キー管理者を設定します。
CMK が作成されました。
暗号化
1. CMK を使って暗号化されている CDK と暗号化されていない CDK を作成する
以下のように CMK に紐づく CDK を作成します。
aws kms generate-data-key --key-id arn:aws:kms:ap-northeast-1:xxxxxxxxxxxx --key-spec AES_256
このような結果が得られます。
{ "CiphertextBlob": "AQIDAH...", "Plaintext": "f6xFX4p...", "KeyId": "arn:aws:kms:ap-northeast-1:xxxxxxxxxxxxxxx:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
- Plaintext・・・暗号化されていない CDK
- CiphertextBlob・・・暗号化されている CDK
作成した CDK を保存します。
echo [Plaintext] > plain-data-key echo [CiphertextBlob] | base64 --decode > encrypted-data-key
2. 暗号化されていない CDK を使ってデータを暗号化する
以下のデータを暗号化してみます。
[ec2-user@ip-10-0-1-245 ~]$ cat test-document Welcome to Kamata!
暗号化されていない CDK を用いてデータを暗号化する。
openssl aes-256-cbc -e -in test-document -out encrypted-document -pass file:plain-data-key
このようにデータが暗号化されたことがわかります。
[ec2-user@ip-10-0-1-245 ~]$ cat encrypted-document Salted__ク^・_~%?ステ黑゚鮱゚~ネ_マW-ヨ・@!蘋
3. 暗号化されていない CDK を削除する
暗号化されていない CDK (plain-data-key)を削除してください。
rm plain-data-key
3. 復号化
1. CMK を使って暗号化されている CDK を復号化する
暗号化されている CDK を復号化します。
aws kms decrypt --ciphertext-blob fileb://encrypted-data-key --output text --query Plaintext > decrypted-datakey
2. 復号化された CDK を使って暗号化されているデータを復号化する
暗号化されているデータを復号化します。
openssl aes-256-cbc -d -in encrypted-document -out decrypted-document -pass file:decrypted-data-key
このようにデータが復号化されたことがわかります。
[ec2-user@ip-10-0-1-245 ~]$ cat decrypted-document Welcome to Kamata!
さいごに
KMS は AWS 認定試験において必ず出題されるサービスの一つで何となく理解したつもりでいたのですが、自分の中でモヤモヤする部分もありました。今回、実際に KMS を使うことによってサービスに対するイメージがより具体的になりました。次回は KMS とその他のサービスを連携させてみようと思います。