📚

【初心者向け】AWS KMS CLIでエンベロープ暗号化を検証してみた

2024/08/19に公開

はじめに

本ページは個人の勉強で使用することを目的に作成しておりますが、記載の誤り等が含まれる場合がございます。
最新の情報についてはAWS公式ドキュメントをご参照ください。

やること

  1. KMS CMK(カスタマーマスターマネージドキー) を作成。
  2. 暗号化されたKMS CDK(カスタマーデータキー) を作成。
  3. プレーンテキストのKMS CDK(カスタマーデータキー) を作成。
  4. テキストファイルをプレーンテキストのKMS CDKで暗号化。
  5. プレーンテキストのKMS CDKを削除。
  6. 暗号化されたKMS CDKから、再度プレーンテキストのKMS CDKを作成。
  7. 再作成したプレーンテキストのKMS CDKでテキストファイルを復号。
    ※尚、AWS CLIはCloudShell上で実施します。

事前準備

  1. KMSコンソールから以下のKMS CMKを作成します。
  • キーのタイプ:対称
  • キーの使用:暗号化および復号化
  • エイリアス:kms/envelope
  1. 作成したCMKのARNを控えておきます。


CDK(カスタマーデータキー)を作成

  1. 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


  1. Plaintextの値をplain-data-keyファイルに書き込み、プレーンテキストのCDKを作成します。
$ echo cTKodyQvuVz2kFcdnhE6PXa896M3YB/prlORSvzq+qg= > plain-data-key


  1. 手順1で出力されたCiphertextBlobの値をbase64でデコード後にencrypted-data-keyファイルに書き込み、暗号化されたCDKを作成します。
$ echo AQIDAHgG0it7Sq1uX+LJ0orCPp7rzqhU5KnlFKYnAxDGtyT0cwElpVMIQ1024GeAQQtSqdflAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMOHc8wmzJF1lpHLhfAgEQgDvFxnISsN6LdCO3ssziDytMJ1fVfmu0jApMrN8i94rWk7a27as3BQ/lpdwEi1hbIzUg4IQK8rzSM4jAzA== | base64 -d > encrypted-data-key


  1. encrypted-data-keyファイルの中身を確認します。
$ cat encrypted-data-key 


テキストファイルの暗号化

  1. CloudShellのActionからUpload Fileを選択して、以下のテキストファイルをアップロードします。
  1. 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
  1. 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


暗号化されたテキストファイルの復号

  1. 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クエリ。
  1. encrypted-neko.txt(暗号化されたテキストファイル)を復号します。
$ openssl aes-256-cbc -d -in encrypted-neko.txt -out decrypted-neko.txt -pass file:decrypted-data-key 


復号化されたテキストファイルの確認

  1. decrypted-neko.txt(復号化されたテキストファイル)の内容を出力します。
$ head -n 5 decrypted-neko.txt

  1. neko.txt(元のテキストファイル)decrypted-neko.txt(復号化されたテキストファイル)に差分が無い事を確認します。
  • 復号に成功!
$ diff dectypted-neko.txt neko.txt


おわりに

  • KMSではCDKでデータを暗号化し、さらに暗号化したCDKを一緒に保管する。これをエンベロープ(封筒)暗号化という。

Discussion