まとめ
AWS KMS では鍵をローカルで管理することなくテキストの暗号化・複合化を行う機能を提供している。
システムで利用するパスワードなどを暗号化・複合化したいといった「ちょっとした暗号化」が欲しい場合にはこれを利用できる。
なお、効率の面から小規模データ向けの方法。
この記事では取り扱わないが、大量のデータを暗号化・複合化する場合にはKMSに暗号化・複合化で使える鍵を発行してもらってそれを使う。
bashコード
awscli を使って TARGET_TEXT
を暗号化・複合化する例。
enc.sh
# !/bin/bash
CMK_ID=<自分のAWSアカウントで利用するKMSのカスタマー管理型のキーのID>
PROFILE=<profileを使いたい場合は入力>
TMPFILE=.tmp-bin
TARGET_TEXT=P@ssW0rd
if [ "$PROFILE" != "" ]; then
PROFILE_CONTEXT="--profile $PROFILE"
else
PROFILE_CONTEXT=""
fi
echo start to encrypt "$TARGET_TEXT"
ENCB64=$(aws kms encrypt --key-id ${CMK_ID} --plaintext ${TARGET_TEXT} --output text --query CiphertextBlob ${PROFILE_CONTEXT})
echo encrypted and base64 encoded text: $ENCB64
echo $ENCB64 | base64 -d > ${TMPFILE}
PLAIN_TEXT=$(aws kms decrypt --ciphertext-blob fileb://$(pwd)/${TMPFILE} --output text --query Plaintext ${PROFILE_CONTEXT} | base64 -d)
echo decrypted plain text: $PLAIN_TEXT
出力結果の一例
start to encrypt P@ssW0rd
encrypted and base64 encoded text: AQICAHiclkP1z430sHo4kvwnliLRBAmXEHF1EiUqPErprxdOUwHgofADoFBFs0IwSuYxhQH/AAAAZjBkBgkqhkiG9w0BBwagVzBVAgEAMFAGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM6oisVNzAn1r59h8AAgEQgCOogkCKzVFWtQfXPlAvhhEH0lGjtpL44biYU7ZkGbk1zAcRag==
decrypted plain text: P@ssW0rd
-
aws kms encrypt
で--plaintext
で指定した文字列をAWS KMSに保持している鍵を使って暗号化する- 暗号化したデータを base64 エンコードしたものが得られる
- awscli の出力は ドキュメント から分かる通り複数あるので、暗号化したデータを指す CiphertextBlob のみを
--query CiphertextBlob
で指定することで取得する
-
aws kms decrypt
で暗号化したデータを複合化する- fileb:// で指定する場合、基本フルパスなので上記shellではそのためのコードが書かれている
- 指定するファイルのデータは base64 をでコードしたものである必要がある
- encryptの場合と同様、
--query
で必要な部分のみを取得
以上の手順で鍵を自分で管理することなく、暗号化・複合化を行うことができる。
余談
モチベーションは Chalice の .chalice/config.json
にパスワードを書こうと思ったのだが、このファイルはコミットしたい、でもパスワードは書きたいのでどうしよう…というところが発端。
他の人がどうしているかを見ると Githubでもディスカッションされている のを見て、その中で紹介されていた内容が実際にできるかどうかを確かめたのがこの記事だったり。