以前、yaml_vault というyamlで書いた設定ファイルを暗号化するgemを作りました。
そのyaml_vaultでAWS KMSを利用した暗号化をサポートしました。
AWS KMSで作った暗号化キーで、4kバイトまでの文字列を直接暗号化できます。
普通のconfigパラメーターは4kバイトも無いので、ほとんど直接暗号化だけでカバーできるでしょう。
使い方はこんな感じ
% yaml_vault encrypt secrets.yml -o encrypted_secrets.yml --cryptor=aws-kms \
--aws-region=ap-northeast-1 \
--aws-kms-key-id=<kms-cms-key-id> \
--aws-access-key-id=<AWS_ACCESS_KEY_ID> \
--aws-secret-access-key=<AWS_SECRET_ACCESS_KEY>
ちなみにDockerイメージもあるので、rubyを入れなくてもdockerが入ってれば以下の様な形で利用可能。
docker run -it \
-v `pwd`/:/vol \
joker1007/yaml_vault \
encrypt /vol/secrets.yml -o /vol/encrypted_secrets.yml -k production.password \
--cryptor=aws-kms \
--aws-region=ap-northeast-1 \
--aws-kms-key-id=<kms-cms-key-id> \
--aws-access-key-id=<AWS_ACCESS_KEY_ID> \
--aws-secret-access-key=<AWS_SECRET_ACCESS_KEY>
アカウント情報については、一般的なRubyのaws-sdkの読み込みルールに従うので、指定しなければ、自動的に環境変数やIAM Roleを利用する。
この方式の暗号化の良い点はどの鍵で暗号化したかの情報を暗号化後のデータ自体が持っている点。
つまり暗号化した文字列を復号化したい、というリクエストを送るだけで良い。
後はAWS側のキーポリシーとIAMポリシーで鍵の利用権限を持っているアカウントだけが復号化したデータにアクセスでき、そうでない場合は復号化に失敗する。
例えばEC2のIAM Roleを使って復号化する場合にはかなりシンプルに復号化できる。
% yaml_vault decrypt encrypted_secrets.yml -o secrets.yml --cryptor=aws-kms \
--aws-region=ap-northeast-1
これを利用すれば、productionのEC2ノードでだけ設定ファイルを復号化したり、ちょっと面倒だけどパラメーター毎に暗号化する鍵を変えれば、特定のconfigパラメーターだけ扱える権限を絞り込んだりできる。
もし設定ファイルを丸ごと暗号化したい場合は、s3のサーバーサイド暗号化にkmsを利用して、aws-cli等を使ってデータを送受信するのが楽で良さそう。