knife-soloではなくchef-soloオンリーで暗号化Data Bagを使用する。
参考サイト
http://nmbr8.com/blog/2014/06/24/chef-solo-encrypted-data-bags/
http://kataring.hatenablog.com/entry/2013/05/15/193430
http://blog.kenjiskywalker.org/blog/2013/05/20/chef-databag/
chefの作業ディレクトリはできてるという前提で。
data_bag用の秘密鍵を作成
rand -base64 512 > .chef/encrypted_data_bag_secret
暗号化したいファイルを作成する
export EDITOR=vim
knife data bag create hoge fuga --secret-file .chef/encrypted_data_bag_secret --local
エディタが開くので暗号化したいデータをjsonで書く。
{
"id": "fuga",
"password": "secret_password"
}
以下のようにディレクトリとファイルができる
data_bags
|-hoge
|-fuga.json
Vagrantfileでencrypted_data_bagの設定をする
設定例です
config.vm.provision "chef_solo" do |chef|
chef.cookbooks_path = ["../../cookbooks", "../../site-cookbooks"]
chef.roles_path = "../../roles"
chef.data_bags_path = "../../data_bags"
chef.encrypted_data_bag_secret_key_path = "../../.chef/encrypted_data_bag_secret"
chef.run_list = ["role[hoge]"]
end
以下がdata bagの設定
chef.data_bags_path 暗号化済のdata bagのディレクトリのパス
chef.encrypted_data_bag_secret_key_path 作成した鍵ファイルのパス
これでvagrant provision時に鍵が転送され作成されたサーバーでchef-soloを実行できる
ちなみに単純にchef-soloで実行する際のsolo.rbのファイルは以下のような設定で大丈夫でした
file_cache_path "/tmp/chef-solo"
cookbook_path ["/root/chef/cookbooks", "/root/chef/site-cookbooks"]
role_path "/root/chef/roles"
data_bag_path '/root/chef/data_bags'
encrypted_data_bag_secret '/root/chef/.chef/encrypted_data_bag_secret'
レシピ内で暗号化されたデータをデコードして使用
data_bag = Chef::EncryptedDataBagItem.load('hoge','fuga')
p "#{data_bag['password']}"
chef-solo実行で「secret_password」とログにできたらデコードできている
暗号化されたjsonファイルを編集したり閲覧したり
編集
knife data bag edit hoge fuga --secret-file .chef/encrypted_data_bag_secret --local
保存時にjsonのsyntaxエラーとかがあった場合は編集作業は消え去るのでこまめに保存しながら作業するといいと思います。
閲覧
knife data bag show hoge fuga --secret-file .chef/encrypted_data_bag_secret --local
(使用例) 鍵ファイルを暗号化してdata bagにつっこむ
data bagにファイルも含めれたら便利なんだけど現状ではjsonでないとできない様子です。
鍵ファイルを含めたかったのですが、以下のように設定すれば正常動作できました。
jsonファイルには鍵ファイルの改行を\nと記述して入力する
こんな感じで
{
"id": "fuga",
"secret_key": "-----BEGIN DSA PRIVATE KEY-----\nMIIBvAIBAAKBgQD0ZfP4CvTUwN77RPXcMeINO7rtJYuxg7fyEUlcOSTnpECOfImF\nMANsY/HTVLWXa8at7zeZ8cBYMCKsWnzAZZLZfC1id+G ...(以下略)"
}
data bagにある文字列を任意の場所に鍵ファイルとして設置するレシピ例
data_bag = Chef::EncryptedDataBagItem.load('hoge','fuga')
execute "create_key" do
command "echo \"#{data_bag['secret_key']}\" > /root/.ssh/secret_key ; chmod 600 /root/.ssh/secret_key"
user "root"
group "root"
action :run
end
/root/.ssh/secret_key ができる
はまった所
Chef::EncryptedDataBagItem.loadで以下のエラーが出た
FATAL: Chef::EncryptedDataBagItem::DecryptionFailure: Error decrypting data bag value: 'wrong final block length'. Most likely the provided key is incorrect
鍵ファイルがおかしいかも、というエラー。
調べるとdata bagの秘密鍵(encrypted_data_bag_secret)の改行コードがテスト環境はwindowsだったので\r\nになっていたのが原因でした。
改行コードを\nにすると解決しました。