yaml_vaultについて
AWS Key Management Serviceを使ってconfigファイルを暗号化すると便利 - Qiita を参照
やりたかったこと
下記のようなyamlがあった時に、access_key_id
と secret
のみを暗号化・復号化し、それ以外のkeyはそのまま保存したかった。
accounts:
ACCOUNT_1:
access_key_id: XXXXXXX
secret: XXXXXXXX
regions:
- ap-northeast-1
ACCOUNT_2:
access_key_id: XXXXXXX
secret: XXXXXXXX
regions:
- ap-northeast-1
--key=accounts
で渡すと access_key_id
と secret
だけでなく regions
も暗号化されてしまうので困りもの。
このissueに近かったのでPR投げようかと思ったのですが、コードを読むと思った以上に面倒くさそうだったので別のやり方で解決しました。
Wildcards in --key
· Issue #4 · joker1007/yaml_vault
解決策
yaml_vaultは暗号化対象のkeyをカンマ区切りで複数渡せるので下記のようにrake taskで必要なkeyを生成してからyaml_vaultに渡すようにしました。
namespace :vault do
require "yaml"
region = "ap-northeast-1"
def vault_keys(yaml_file)
config = YAML.load_file(yaml_file)
account_keys = config["accounts"].keys
account_keys.each_with_object([]) do |key, array|
array << "accounts.#{key}.access_key_id"
array << "accounts.#{key}.secret"
end.join(",")
end
desc "encrypt accounts.yml and generate encrypted_accounts.yml (params: SRC_FILE, DST_FILE)"
task :encrypt do
kms_key_id = "XXXXXXXXXXXXXX"
src_file = ENV["SRC_FILE"] || "config/accounts.yml"
dst_file = ENV["DST_FILE"] || "config/encrypted_accounts.yml"
keys = vault_keys(src_file)
sh "AWS_REGION=#{region} yaml_vault encrypt #{src_file} -o #{dst_file} --cryptor=aws-kms -k #{keys} --aws-kms-key-id=#{kms_key_id}"
end
desc "decrypt encrypted_accounts.yml and generate accounts.yml (params: SRC_FILE, DST_FILE)"
task :decrypt do
src_file = ENV["SRC_FILE"] || "config/encrypted_accounts.yml"
dst_file = ENV["DST_FILE"] || "config/accounts.yml"
keys = vault_keys(src_file)
sh "AWS_REGION=#{region} yaml_vault decrypt #{src_file} -o #{dst_file} --cryptor=aws-kms -k #{keys}"
end
end
AWS_REGION
を環境変数で渡しているのはIAMロールを使いたかったためです 1
実行結果
$ bundle exec rake vault:encrypt
AWS_REGION=ap-northeast-1 yaml_vault encrypt config/accounts.yml -o config/encrypted_accounts.yml --cryptor=aws-kms -k accounts.ACCOUNT_1.akid,accounts.ACCOUNT_1.secret,accounts.ACCOUNT_2.akid,accounts.ACCOUNT_2.secret --aws-kms-key-id=XXXXXXXXXXXXXX
encrypted config/accounts.yml -> config/encrypted_accounts.yml
よさげ
-
詳しく実装を追ってないですが
--aws-region
を渡すと--aws-access-key-id
と--aws-secret-access-key
も必要になってIAMロールを使ってくれない模様 ↩