さよならインターネット

Chefで公開したくないJSONデータを暗号化するためにDataBagsを利用してみた記録

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のインストール

1
2
# gem install knife-solo_data_bag 
# cd /root/chef/ ; pwd

暗号化用の鍵を用意

1
# openssl rand -base64 512 > encrypted_data_bag_secret

環境整備

1
2
3
4
5
6
# 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をつくる

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#
# 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の実ファイルを開いても中身は暗号化されている

秘密鍵が利用されているか確認

1
2
3
4
5
6
# 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' 

#

コメントアウトしてみる

1
2
3
4
5
6
7
8
9
10
11
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

1
2
3
4
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_pathencrypted_data_bag_secretでファイルの位置をsoloに教える。

/root/chef/cookbooks/data_bag_test/recipes/default.rb

1
2
3
4
data_bag = Chef::EncryptedDataBagItem.load('data_hoge','bag_hoge')
hoge = data_bag['data']

p "data_bag is [#{hoge}]"

こんな感じのrecipeをつくる

data_bag_test.json

1
2
3
4
5
{
   "run_list": [
    "data_bag_test"
  ]
}

のようなテストJSONを作成し、chef-soloを走らせる

1
2
3
4
5
6
7
# 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鍵を指定しなければ暗号化はされない。

1
2
3
4
5
6
7
8
9
# 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

1
2
3
aws_keys = data_bag_item("data_hoge","bag_hoge")

p "data_bag is [#{hoge}]"

でいける

あわせて読みたい

アルパカchef日記3日目 data bagについて / またはユーザ管理クックブックなど – アルパカDiary
大変勉強になるエントリーだ