Chefで公開したくないJSONデータを暗号化するためにDataBagsを利用してみた記録
May 20, 2013
ruby 1.8.7
chef 11.4.4
knife-solo_data_bag 0.3.2
2013/05/20 現在
knife-solo 0.2.0 では “knife solo data bag” は使えず
https://github.com/thbishop/knife-solo_data_bag こちらを利用
参考
knife-solo_data_bagのインストール
# gem install knife-solo_data_bag
# cd /root/chef/ ; pwd
暗号化用の鍵を用意
# openssl rand -base64 512 > encrypted_data_bag_secret
環境整備
# mkdir /root/chef/data_bags
# cat /root/.chef/knife.rb
cookbook_path '/root/chef/cookbooks'
data_bag_path '/root/chef/data_bags'
encrypted_data_bag_secret '/root/chef/encrypted_data_bag_secret'
#
のような感じでknifeの設定を整えます
data_bagをつくる
#
# knife solo data bag create data_hoge bag_hoge --secret-file ./encrypted_data_bags_secret
ERROR: RuntimeError: Please set EDITOR environment variable
#
# export EDITOR=vim
#
# knife solo data bag create data_hoge bag_hoge --secret-file ./encrypted_data_bags_secret
{
"id": "bag_hoge",
"data": "bagbag"
}
#
# cat /root/chef/data_bags/data_hoge/bag_hoge.json
{
"data_bag": "data_hoge",
"chef_type": "data_bag_item",
"name": "data_bag_item_data_hoge_bag_hoge",
"json_class": "Chef::DataBagItem",
"raw_data": {
"id": "bag_hoge",
"data": {
"iv": "++q0Yc6EHUu8bdAxb/Ekuw==\n",
"version": 1,
"encrypted_data": "ErOwQM7QzvSJavsHPQovjwmRk7egm6EOCvDz2cUMd0Y=\n",
"cipher": "aes-256-cbc"
}
}
}#
#
# knife solo data bag show data_hoge bag_hoge
data: bagbag
id: bag_hoge
#
bag_hoge.json
の実ファイルを開いても中身は暗号化されている
秘密鍵が利用されているか確認
# cat /root/.chef/knife.rb
cookbook_path '/root/chef/cookbooks'
data_bag_path '/root/chef/data_bags'
# encrypted_data_bag_secret '/root/chef/encrypted_data_bag_secret'
#
コメントアウトしてみる
aws_keys = Chef::EncryptedDataBagItem.load(, secret)
# knife solo data bag show data_hoge bag_hoge
data:
cipher: aes-256-cbc
encrypted_data: ErOwQM7QzvSJavsHPQovjwmRk7egm6EOCvDz2cUMd0Y=
iv: ++q0Yc6EHUu8bdAxb/Ekuw==
version: 1
id: bag_hoge
#
復号化されない。秘密鍵が使われていることがわかる
recipeから呼び出す
solo.rb
file_cache_path '/tmp/chef-solo'
cookbook_path '/root/chef/cookbooks'
data_bag_path '/root/chef/data_bags'
encrypted_data_bag_secret '/root/chef/encrypted_data_bag_secret'
data_bag_path
とencrypted_data_bag_secret
でファイルの位置をsoloに教える。
/root/chef/cookbooks/data_bag_test/recipes/default.rb
data_bag = Chef::EncryptedDataBagItem.load('data_hoge','bag_hoge')
hoge = data_bag['data']
p "data_bag is [#{hoge}]"
こんな感じのrecipeをつくる
data_bag_test.json
{
"run_list": [
"data_bag_test"
]
}
のようなテストJSONを作成し、chef-soloを走らせる
# chef-solo -j data_bag_test.json -c solo.rb
Starting Chef Client, version 11.4.4
Compiling Cookbooks...
"data_bag is [bagbag]"
Converging 0 resources
Chef Client finished, 0 resources updated
#
上記のようにdata_bagの値が取得できれば成功。
秘密鍵をcookbooksとは別で管理することにより
漏洩してほしくない情報を暗号化することが可能になる。
とても便利。
暗号化しないで保存するパターン (05/28 追記)
--secret-file
鍵を指定しなければ暗号化はされない。
# knife solo data bag create data_hoge bag_hoge
#
# knife solo data bag show data_hoge bag_hoge
data: bagbag
id: bag_hoge
#
# cat /root/chef/data_bags/data_hoge/bag_hoge.json
{"name":"data_bag_item_data_hoge_bag_hoge","data_bag":"data_hoge","chef_type":"data_bag_item","raw_data":{"id":"bag_hoge","data":"bagbag"},"json_class":"Chef::DataBagItem"}
#
recipe
aws_keys = data_bag_item("data_hoge","bag_hoge")
p "data_bag is [#{hoge}]"
でいける
あわせて読みたい
アルパカchef日記3日目 data bagについて / またはユーザ管理クックブックなど – アルパカDiary
大変勉強になるエントリーだ