KMS
そのまま置いておきたくないデータを暗号化するとして、その暗号化に使う鍵をどうするかという問題がありますが、AWSがそれを持ってくれるというサービスです。
AWSが管理するキー(カスタマーマスターキー)はエクスポートすることが出来ないようになっていて、安全性が確保されています。
よって、暗号化、復号にはAWS KMS経由でやりとりすることが必須となります。この手順をawscliで試してみます。
暗号化する対象はデータサイズ制限があり、またさほど速度も出ないので処理ごとに暗号化/復号したりや大きなデータを対象とする場合には
- カスタマーマスターキーから、暗号化されたデータキーと平文のデータキーをもらう
- 平文のデータキーを使って任意の方法で暗号化したら平文のデータキーは即座に廃棄する
- 復号が必要になったら、暗号化されたデータキーから平文のデータキーを得て復号する。平文のデータキーはなるべく早く破棄する
といった手順になっています。
しかし、今回の目的はアプリケーションで使うパスワードやAPIキーの類を暗号化することなので、aws kms encrypt
を使って平文をカスタマーマスターキーから直接暗号化していくことにします。
Requirements
- awscli
pip install awscli
- awsのcredential。awsのインスタンスであればroleを割り当てるかIAMユーザのACCESS_KEYとSECRET_ACCESS_KEYを
aws configure
で設定済みであること
カスタマーマスターキー
cliからだとポリシーが面倒なのでWebのコンソールから作成しちゃいます。
IAMの「暗号化キー」から「キーの作成」です。
管理アクセスユーザと使用アクセスユーザは適切に割り当てましょう。
割り当てたユーザ側にも、使用するための権限が必要です。
aws kms encrypt
key-alias
に鍵を作った時のエイリアスを入れます。
暗号化の対象を--plaintext
で渡せますが、ファイルなどで渡すこともできるので詳しくはaws kms encrypt help
を参照してください。
aws kms encrypt --key-id alias/key-alias --plaintext "apikey" --query CiphertextBlob --output text
これで暗号化された文字列を受け取ることが出来ました。
他に--encryption-context
を指定して暗号化することで対象の整合性を確認することができます。
aws kms decrypt
decryptの際にはkey-idは不要です。暗号化されたものに含まれているからです。
aws kms decrypt --ciphertext-blob fileb://<(echo 'さっき受け取った文字列'|base64 -d) | jq .Plaintext --raw-output |base64 -d
これでapikeyという文字列が出てくるはずです。