AWSの部屋

AWS学習者向けのブログです

KMS を使ってデータの暗号化と復号化をしてみる

はじめに

機密性の高いデータを運用するには、暗号化の施策が必要になります。その際に重要になるのが、暗号化や復号化のための鍵の管理です。今回は 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 を使って暗号化されているデータを復号化する

手順

  1. CMK の作成
  2. 暗号化
    1. CMK を使って暗号化されている CDK と暗号化されていない CDK を作成する
    2. 暗号化されていない CDK を使ってデータを暗号化する
    3. 暗号化されていない CDK を削除する
  3. 復号化
    1. CMK を使って暗号化されている CDK を復号化する
    2. 復号化された 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 とその他のサービスを連携させてみようと思います。