📚
【初心者向け】AWS KMS CLIでエンベロープ暗号化を検証してみた
はじめに
本ページは個人の勉強で使用することを目的に作成しておりますが、記載の誤り等が含まれる場合がございます。
最新の情報についてはAWS公式ドキュメントをご参照ください。
やること
- KMS CMK(カスタマーマスターマネージドキー) を作成。
- 暗号化されたKMS CDK(カスタマーデータキー) を作成。
- プレーンテキストのKMS CDK(カスタマーデータキー) を作成。
- テキストファイルをプレーンテキストのKMS CDKで暗号化。
- プレーンテキストのKMS CDKを削除。
- 暗号化されたKMS CDKから、再度プレーンテキストのKMS CDKを作成。
- 再作成したプレーンテキストのKMS CDKでテキストファイルを復号。
※尚、AWS CLIはCloudShell上で実施します。
事前準備
- KMSコンソールから以下のKMS CMKを作成します。
- キーのタイプ:対称
- キーの使用:暗号化および復号化
- エイリアス:kms/envelope
- 作成したCMKのARNを控えておきます。
CDK(カスタマーデータキー)を作成
- CDKを作成します。
$ aws kms generate-data-key --key-id ${KMSのARN} --key-spec AES_256
※コマンドについて
-
aws kms generate-datak-key
:CDKのプレーンテキストコピーと、指定した対称暗号化 KMS キーで暗号化されたCDKのコピーを返す。-
--key-id
:CDKを暗号化するCMKを指定する -
--key-spec
:AES_256 | AES_128
-
- 出力
-
CiphertextBlob
:暗号化されたCDK -
Plaintext
:プレーンテキストのCDK
-
- Plaintextの値を
plain-data-key
ファイルに書き込み、プレーンテキストのCDKを作成します。
$ echo cTKodyQvuVz2kFcdnhE6PXa896M3YB/prlORSvzq+qg= > plain-data-key
- 手順1で出力されたCiphertextBlobの値をbase64でデコード後に
encrypted-data-key
ファイルに書き込み、暗号化されたCDKを作成します。
$ echo AQIDAHgG0it7Sq1uX+LJ0orCPp7rzqhU5KnlFKYnAxDGtyT0cwElpVMIQ1024GeAQQtSqdflAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMOHc8wmzJF1lpHLhfAgEQgDvFxnISsN6LdCO3ssziDytMJ1fVfmu0jApMrN8i94rWk7a27as3BQ/lpdwEi1hbIzUg4IQK8rzSM4jAzA== | base64 -d > encrypted-data-key
-
encrypted-data-key
ファイルの中身を確認します。
$ cat encrypted-data-key
テキストファイルの暗号化
- CloudShellのActionからUpload Fileを選択して、以下のテキストファイルをアップロードします。
- ファイル名:
neko.txt
- サイズ:
1.00 MB (1,048,576 バイト)
- 内容:(青空文庫「夏目漱石:吾輩は猫である」 )
-
neko.txt(テキストファイル)
をplain-data-key(プレーンテキストのCDK)
で暗号化します。
# opensslをインストール
$ sudo yum -y install openssl
# テキストファイルをplain-data-key(プレーンテキストのCDK)で暗号化
$ openssl aes-256-cbc -e -in neko.txt -out encrypted-neko.txt -pass file:plain-data-key
-
encrypted-neko.txt(暗号化されたテキストファイル)
の内容を先頭5行出力します。
- テキストファイルが暗号化されている事が確認できます。
$ head -n 5 encrypted-neko.txt
暗号化されていないCDKの削除
8. plain-data-key(暗号化されていないCDK)
を削除します。
- この時点でencrypted-data-key(暗号化されたCDK)が漏洩しても、CMKが漏洩しなければencrypted-neko.txt(暗号化されたテキストファイル)の内容を盗み見ることはできなくなります。
$ rm plain-data-key
暗号化されたテキストファイルの復号
-
encrypted-data-key(暗号化されたCDK)
を復号化し、decrypted-data-key(復号化されたCDK)
を生成します。
$ aws kms decrypt --ciphertext-blob fileb://encrypted-data-key --output text --query Plaintext > decrypted-data-key
※コマンドについて
-
aws kms decrypt
:CMKによって暗号化された暗号テキストを復号する。-
--ciphertext-blob(blob)
:復号化する暗号文。 -
--output (string)
:出力形式を以下から選択。- json
- text
- table
-
--query (string)
:応答データのフィルタリングに使用するJMESpathクエリ。
-
-
encrypted-neko.txt(暗号化されたテキストファイル)
を復号します。
$ openssl aes-256-cbc -d -in encrypted-neko.txt -out decrypted-neko.txt -pass file:decrypted-data-key
復号化されたテキストファイルの確認
-
decrypted-neko.txt(復号化されたテキストファイル)
の内容を出力します。
$ head -n 5 decrypted-neko.txt
-
neko.txt(元のテキストファイル)
とdecrypted-neko.txt(復号化されたテキストファイル)
に差分が無い事を確認します。
- 復号に成功!
$ diff dectypted-neko.txt neko.txt
おわりに
- KMSではCDKでデータを暗号化し、さらに暗号化したCDKを一緒に保管する。これをエンベロープ(封筒)暗号化という。
Discussion