LoginSignup
15
15

More than 5 years have passed since last update.

Vagrantのchef-soloで暗号化Data Bagを使用する

Posted at

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にすると解決しました。

15
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15