Chef-Vaultを使ってみる #getchef
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
Chef-Vaultとは
Chef-Vaultとは、米Nordstrom社が開発・保守しているオープンソースプロジェクトです。Vaultとは「金庫室」や「貯蔵庫」を意味する英単語で、ChefのData Bag ItemをNode群の公開鍵によって暗号化し、そのNode群のみがData Bag Itemの値を暗号化・復号できるようにするための仕組みです。
Data Bag Itemの暗号化はChef本体にEncrypted Data Bag Itemとして実装されているのに、なぜわざわざChef-Vaultを再実装したのでしょうか。How chef-vault worksでは、Encrypted Data Bag Itemは鍵が対称的であるので、鍵の配布に問題があると指摘しています。鍵が対称的というのは、暗号化する鍵と復号する鍵が同じ鍵だということです。共通鍵暗号方式や秘密鍵暗号方式と言えばなじみがあるでしょう。
前提として、Chefによって管理されているNodeは、関連付けられたClientオブジェクトをChef Serverに持っています。ClientオブジェクトはRSA鍵ペアの公開鍵を持っています。秘密鍵のほうはNodeの/etc/chef/client.pemとして存在しています。
Chef ServerのAPI UserはそれぞれがRSA鍵ペアを持っていて、.chefディレクトリにPEM形式で格納しています。Nodeと同様に、公開鍵をChef Serverに保存しています。
Chef-Vaultではまず最初に、Encrypted Data BagにSecureRandom.random_bytesを用いて生成した32バイト文字列の「共有秘密鍵」を格納します。
次に、Vaultが持っている管理UserとClientのそれぞれの公開鍵によって、共有秘密鍵を非対称に暗号化します。
Vaultの管理Userとは、Vaultを作成したときに明示的に指定されたAPI Userです。Clientも明示的に指定されますが、通常はChef Serverに対してSOLR問い合わせをした結果によって決定します。この問い合わせはVaultの_keys Data Bagに保存され、再度検索をした時点でClientを更新します。
非対称に暗号化された鍵は_key Data BagのItemとして保存されます。
Chef-Vaultの実際
どのように格納されているのでしょうか。実際に試してみましょう。
まず、「testvault」というVault (Data Bag)を作成し、その中に「testitem」というItemを作成、「{"testkey": "testval"}」というJSON情報を格納します。コマンドは「knife vault create」です。なお、Chef-VaultはデフォルトでSoloモードで動作しているので「-M client」オプションでServer/Clientモードにしています。
d-higuchi@ws:~/chef-repo$ knife vault create testvault testitem '{"testkey": "testval"}' -M client
d-higuchi@ws:~/chef-repo$
Data Bagの一覧を見てみましょう。「testvault」というData Bagができています。
d-higuchi@ws:~/chef-repo$ knife data bag list
testvault
d-higuchi@ws:~/chef-repo$
「testvault」のData Bag Itemの一覧を見てみましょう。「testitem」という実データを格納しているData Bag Itemの他に、「testitem_keys」というキーを管理するData Bag Itemができています。
d-higuchi@ws:~/chef-repo$ knife data bag show testvault
testitem
testitem_keys
d-higuchi@ws:~/chef-repo$
最初に「testitem」を見てみます。こちらはEncrypted Data Bag Itemです。暗号アルゴリズムは「aes-256-cbc」、Encrypted Data Bagのバージョンは「1」です(参考: Encryption Versions)。
d-higuchi@ws:~/chef-repo$ knife data bag show testvault testitem
WARNING: Encrypted data bag detected, but no secret provided for decoding. Displaying encrypted data.
id: testitem
testkey:
cipher: aes-256-cbc
encrypted_data: 6Lssscy+/ld4QWNhS6AgfUjW02P6W5AkKYWESlWfk5o=
iv: 1KuoUDGLU87rRQvwyqcfAA==
version: 1
d-higuchi@ws:~/chef-repo$
次に「testitem_keys」を見てみます。管理ユーザ(admins)は「d-higuchi」で、d-higuchiユーザの公開鍵によって暗号化された「共有秘密鍵」が格納されています。Encrypted Data Bag Itemの「testitem」を復号するには、この共有秘密鍵を使います。
d-higuchi@ws:~/chef-repo$ knife data bag show testvault testitem_keys
Unencrypted data bag detected, ignoring any provided secret options.
admins: d-higuchi
clients:
d-higuchi: iWVSrj94cVU+RzyNOETMjeufPn0nXnkK5dpgl3bDDdqFe2+FlGMgellsrU8M
lkJ5aRcA8uSKKWEhf6yUeOlVKx2vBxA4Zu+CBQ5q/+IXqES1A7jQp1aeKxGG
zJNCQ2RRq2rpDXq/zJZ+J+le0ZvKzXztgJf2B8HV9EILrIXASttuniEbDSi0
Vj5JNH/7kHx+O1DjhukAwq52R6fyE7sov91gmgKBuw4wxPTAyVJqe0FOOBKA
b37tZlCyfv1g7ICOLZb7Wa+COK3Gg+IM2fI2f0NoDvUkfoDq+jB1mSUzyieb
+uumLl4ydxe6qk/lPjoQiFY0YiOQDgTBJ/rWUcNsXQ==
id: testitem_keys
search_query:
d-higuchi@ws:~/chef-repo$
これを復号するには「knife vault show」コマンドを使います。
d-higuchi@ws:~/chef-repo$ knife vault show testvault testitem -M client
id: testitem
testkey: testval
d-higuchi@ws:~/chef-repo$
このように、最初に与えた「{"testkey": "testval"}」が得られました。
Chef-Vaultの内部動作
Chef-Vaultの内部動作を知るために、順を追って復号してみましょう。まず、別々のファイルにここまでのデータを保存しておきます。
- d-higuchiユーザの秘密鍵: ~/chef-repo/.chef/d-higuchi.pem
- 「testitem_keys」に格納されている、d-higuchiユーザの公開鍵で暗号化した共有秘密鍵: ~/chef-repo/encrypted_shared_secret
d-higuchi@ws:~/chef-repo$ cat > encrypted_shared_secret
iWVSrj94cVU+RzyNOETMjeufPn0nXnkK5dpgl3bDDdqFe2+FlGMgellsrU8MlkJ5aRcA8uSKKWEhf6yUeOlVKx2vBxA4Zu+CBQ5q/+IXqES1A7jQp1aeKxGGzJNCQ2RRq2rpDXq/zJZ+J+le0ZvKzXztgJf2B8HV9EILrIXASttuniEbDSi0Vj5JNH/7kHx+O1DjhukAwq52R6fyE7sov91gmgKBuw4wxPTAyVJqe0FOOBKAb37tZlCyfv1g7ICOLZb7Wa+COK3Gg+IM2fI2f0NoDvUkfoDq+jB1mSUzyieb+uumLl4ydxe6qk/lPjoQiFY0YiOQDgTBJ/rWUcNsXQ==
d-higuchi@ws:~/chef-repo$
- 共有秘密鍵で暗号化した実データ: ~/chef-repo/encrypted_testitem
d-higuchi@ws:~/chef-repo$ cat > encrypted_testitem
6Lssscy+/ld4QWNhS6AgfUjW02P6W5AkKYWESlWfk5o=
d-higuchi@ws:~/chef-repo$
- IV (Initialization Vector, 初期化ベクトル): ~/chef-repo/iv_testitem
d-higuchi@ws:~/chef-repo$ cat > iv_testitem
1KuoUDGLU87rRQvwyqcfAA==
d-higuchi@ws:~/chef-repo$
まず、共有秘密鍵を復号してみます(参考: chef-vault/item.rb#L101-L116)。
private_key = OpenSSL::PKey::RSA.new(open('/home/d-higuchi/chef-repo/.chef/d-higuchi.pem').read())
shared_secret = private_key.private_decrypt(Base64.decode64(open('/home/d-higuchi/chef-repo/encrypted_shared_secret').read()))
d-higuchiユーザの秘密鍵を使って、暗号化された共有秘密鍵を復号しました。冒頭で示した通り、32バイトの文字列です。
shared_secret => "m\xCF\xBE\xEE\xC4\x8D\x9ExH\xBE\x84\x13\x90\x94\x00P1\x04\xD2\x83}~\xA4\xA6\x8AQ\xBDz\x7F\x90\xC4s"
shared_secret.size => 32
暗号アルゴリズム「aes-256-cbc」と共有秘密鍵、初期化ベクトルを使って、暗号化した実データを復号し、表示します。(参考: lib/chef/encrypted_data_bag_item/decryptor.rb#L149-L159, lib/chef/encrypted_data_bag_item/decryptor.rb#L140-L147)。
d = OpenSSL::Cipher.new('aes-256-cbc')
d.decrypt
d.key = OpenSSL::Digest::SHA256.digest(shared_secret)
d.iv = Base64.decode64(open('/home/d-higuchi/chef-repo/iv_testitem').read())
plaintext = d.update(Base64.decode64(open('/home/d-higuchi/chef-repo/encrypted_testitem').read()))
plaintext << d.final
puts plaintext #=> {"json_wrapper":"testval"}
期待通り「testval」が得られました。
理論は複雑ですが、内部動作を見てみたことで理解が進んだことと思います。
通常のEncrypted Data Bag Itemを使う場合は「共有秘密鍵」を手動で生成し(参考:Secret Keys)、Workstationや各Nodeに配置しておく(参考:Store Keys on Nodes)必要がありました。
Chef-Vaultではそれらの手順は自動で行われるため手間が省かれていますし、「共有秘密鍵」が個々の公開鍵で暗号化されているため、安全性も増しています。
次はこの手順で用いたRubyコードです。
require 'openssl'
require 'base64'
#
# https://github.com/Nordstrom/chef-vault/blob/v2.5.0/lib/chef-vault/item.rb#L101-L116
#
private_key = OpenSSL::PKey::RSA.new(open('/home/d-higuchi/chef-repo/.chef/d-higuchi.pem').read())
shared_secret = private_key.private_decrypt(Base64.decode64(open('/home/d-higuchi/chef-repo/encrypted_shared_secret').read()))
#
# https://github.com/chef/chef/blob/12.0.3/lib/chef/encrypted_data_bag_item/decryptor.rb#L149-L159
#
d = OpenSSL::Cipher.new('aes-256-cbc')
d.decrypt
d.key = OpenSSL::Digest::SHA256.digest(shared_secret)
d.iv = Base64.decode64(open('/home/d-higuchi/chef-repo/iv_testitem').read())
#
# https://github.com/chef/chef/blob/12.0.3/lib/chef/encrypted_data_bag_item/decryptor.rb#L140-L147
#
plaintext = d.update(Base64.decode64(open('/home/d-higuchi/chef-repo/encrypted_testitem').read()))
plaintext << d.final
puts plaintext #=> {"json_wrapper":"testval"}
Chef-VaultをRecipeから使う
では、Chef-Vaultに格納したデータをRecipeから使ってみましょう。ここでは簡単のため、Chef-Shellを使います。「-z」オプションでServer/Clientモードにし、「-c ./.chef/knife.rb」オプションで設定ファイルを指定しています。
d-higuchi@ws:~/chef-repo$ chef-shell -z -c ./.chef/knife.rb
loading configuration: ./.chef/knife.rb
Session type: client
Loading..resolving cookbooks for run list: []
Synchronizing Cookbooks:
done.
This is the chef-shell.
Chef Version: 12.0.3
http://www.opscode.com/chef
http://docs.opscode.com/
run `help' for help, `exit' or ^D to quit.
Ohai2u d-higuchi@ws.example.jp!
chef >
まずchef-vaultライブラリをrequireします。このWorkstationにはChef-DKをインストールしてあり、Chef-DKはChef-Vaultを最初から同梱しています。そうでない場合はRubyGemsからChef-Vaultをインストールします。実際のCookbook中のRecipeでは「chef_gem 'chef-vault'」とする必要があるでしょう(参考: USAGE IN RECIPES)。
chef > require 'chef-vault'
=> true
「ChefVault::Item.load」メソッドの引数に取得したいVaultとItemを指定します。
chef > item = ChefVault::Item.load('testvault', 'testitem')
=> data_bag_item["testvault", "testitem", {"id"=>"testitem", "testkey"=>"testval"}]
chef > item['testkey']
=> "testval"
chef >
期待通り「testval」が得られました。
また、「chef-vault」コマンドというスタンドアロンツールもあります(参考: USAGE STAND ALONE)。
d-higuchi@ws:~/chef-repo$ /opt/chefdk/bin/chef-vault -v testvault -i testitem -a testkey -k .chef/knife.rb
testvault/testitem
testkey: testval
d-higuchi@ws:~/chef-repo$
Userの指定
さて、ここまでd-higuchiのみがChef-Vaultの暗号化/復号を行える状態となっていました。しかし、Chef-Serverには他に「alice」と「bob」というUserがいます。
d-higuchi@ws:~/chef-repo$ knife user list
alice
bob
d-higuchi
d-higuchi@ws:~/chef-repo$
先の「knife data bag show testvault testitem_keys」で見た通り、d-higuchiのみが暗号化した共有秘密鍵を持っているため、aliceとbobではこのChef-Vaultの中身を知ることはできません。
alice@ws:~/chef-repo$ knife vault show testvault testitem -M client
ERROR: ChefVault::Exceptions::SecretDecryption: testvault/testitem is not encrypted with your public key. Contact an administrator of the vault item to encrypt for you!
alice@ws:~/chef-repo$
bob@ws:~/chef-repo$ knife vault show testvault testitem -M client
ERROR: ChefVault::Exceptions::SecretDecryption: testvault/testitem is not encrypted with your public key. Contact an administrator of the vault item to encrypt for you!
bob@ws:~/chef-repo$
「-M client」を毎回つけるのは煩雑なので、簡便のために.chef/knife.rbファイルに「knife[:vault_mode] = 'client'」を追加してKnifeコマンドによるChef-Vaultの操作をServer/Clientモードにしておきます。
aliceとbobを管理Userに追加してみましょう。Vaultの更新には「knife vault update」コマンドを使います。「-A 'alice,bob'」オプションで追加する管理Userをコンマ区切りの文字列で指定します。
d-higuchi@ws:~/chef-repo$ knife vault update testvault testitem -A 'alice,bob'
d-higuchi@ws:~/chef-repo$
このように、aliceとbobも各自の公開鍵で暗号化した共有秘密鍵を持つようになりました。
d-higuchi@ws:~/chef-repo$ knife data bag show testvault testitem_keys
Unencrypted data bag detected, ignoring any provided secret options.
admins:
d-higuchi
alice
bob
alice: XLD9z68j9uRQ4R05d7WeEUxZLb2xP1NMapxOWyGEkcZOkG2ZGR5Vuik44wEF
W/b+Y7XxlCRIBNyqVOMRVaXuArCKVi9O1OAz9WfOcV0TsOTI7apfnZNkM+yw
+rTEYA6yb/1271v5TtkF1m+4Q22X8hDMxDkYIRn0I36TVKOZVEL9L1k36kC0
il1CE/WMHYK0S57Ov6naa7NYN/e9T76p8CvmZsqnwIFtQ0XJCCh+xsJ09hSK
G8QYZevdtbgb9wRt8sWceKzvyMqLyRqfppUjbm3wp+YbFirBax+9uNYZe4bG
q00bzR5JPEyoGkYVq7QC/SBw/NobNg+OeaYgDiSi+g==
bob: Rx72UsGzn451XNoTTt80VKO1HvjnJ5ZTdVw6s7DO4Iug64Pb/y37n4Z4JWsG
n9gtbVmQKP8fRs1Qe6vM7upJ6OpjKCjqpfWN6QWaLrFZrORfFkSKwEycGQdV
l9hWnwK+bLK9/XV/9QjT8H16INqDkuwaSQ1LJ1ZkKcEMCfDMHHeDyIRCpeKI
slnpfmhS16eEAmKJT4kMMD/G21pG2rbs1fMVIkA32U4DqPEyS3sKb81TJpCC
a5iDh6RouK6pqDtJgk55QTKIXnNiuhdr6cHLJyHI9l5tqaYwfARe/DWViz3b
qNQK4qVqxV7lPUephgnXkQM1DFJumb5QON/wmgr1qg==
clients:
d-higuchi: JZGmol6cRiJTmeDDSYY6RRsNgQoOXsQIolrRKP0iB01UKDhjjecpGMJMOjPg
oIuPVsgcBF0uiGKcrP4B0Zfq3057+pJSJAx/hXaCfdFPYd4vAoxE2gKqCav9
f7GffZlToejaFq52LQJ1xKZcXOZ81M7JcZjk0Ir3JYvlkOTSAevWJ5JeDg+b
3ufM3ukIC7BjtcEV8Kk6NYvBRH9fXDoGNZ/hv8wwPckFx51ZoEUVKEi4PfRu
dWCANKkyqT9qVfBUyWu9RBbBvw8e/zz7mXF0gggNpEaz4rzp7ilBokmQns69
JpRGytz1GS3kaNHzNDiSTkaFWm8b8xlKZp9zn9UgbA==
id: testitem_keys
search_query:
d-higuchi@ws:~/chef-repo$
aliceとbobそれぞれで値が取得できるようになりました。
alice@ws:~/chef-repo$ knife vault show testvault testitem
id: testitem
testkey: testval
alice@ws:~/chef-repo$
bob@ws:~/chef-repo$ knife vault show testvault testitem
id: testitem
testkey: testval
bob@ws:~/chef-repo$
事情によりbobを削除することになった場合「knife vault remove」コマンドを使います。updateと書式は同じです。
d-higuchi@ws:~/chef-repo$ knife vault remove testvault testitem -A 'bob'
d-higuchi@ws:~/chef-repo$
bobの鍵が消えました。
d-higuchi@ws:~/chef-repo$ knife data bag show testvault testitem_keys
Unencrypted data bag detected, ignoring any provided secret options.
admins:
d-higuchi
alice
alice: fjN1MnuihnqKE5h+/03m8eyHNxMnVHpmyUqPMo+l3aHe0353x0fq9iupBuaP
(省略)
clients:
d-higuchi: beqd1dsy7MHm+T2Q4yARJR8OxJsmMz8CKHQJcJSWg4+jPRZ1SEj/G0mdCI99
(省略)
id: testitem_keys
search_query:
d-higuchi@ws:~/chef-repo$
bobはVaultの中身を読めなくなりました。
bob@ws:~/chef-repo$ knife vault show testvault testitem
ERROR: ChefVault::Exceptions::SecretDecryption: testvault/testitem is not encrypted with your public key. Contact an administrator of the vault item to encrypt for you!
bob@ws:~/chef-repo$
Chef-VaultをNodeから使う
ここまでWorkstationからChef-Vaultを扱ってきました。
ここからはNodeからChef-Vaultを扱ってみましょう。
まず、次のRecipeを持つ「test-vault」を作成します。ここまでで作成したVault/Itemから文字列を取り出し、ログに出力するという単純なRecipeです。chef_gemのcompile_timeについてはChef 12.1.0におけるchef_gem Resourceの警告を参照してください。
cookbooks/test-vault/recipes/default.rb:
chef_gem 'chef-vault' do
compile_time true if respond_to?(:compile_time)
end
require 'chef-vault'
item = ChefVault::Item.load('testvault', 'testitem')
item['testkey']
log "this is testkey's value: #{item['testkey']}" do
level :info
end
これを「node1.example.jp」という新規に登録したNodeに対して適用してみます。
d-higuchi@node1:~$ sudo chef-client
Starting Chef Client, version 12.2.1
resolving cookbooks for run list: ["test-vault"]
Synchronizing Cookbooks:
- test-vault
Compiling Cookbooks...
Recipe: test-vault::default
* chef_gem[chef-vault] action install
- install version 2.5.0 of package chef-vault
================================================================================
Recipe Compile Error in /var/chef/cache/cookbooks/test-vault/recipes/default.rb
================================================================================
ChefVault::Exceptions::SecretDecryption
---------------------------------------
testvault/testitem is not encrypted with your public key. Contact an administrator of the vault item to encrypt for you!
Cookbook Trace:
---------------
/var/chef/cache/cookbooks/test-vault/recipes/default.rb:12:in `from_file'
Relevant File Content:
----------------------
/var/chef/cache/cookbooks/test-vault/recipes/default.rb:
5: # Copyright (c) 2015 The Authors, All Rights Reserved.
6:
7: chef_gem 'chef-vault' do
8: compile_time true if respond_to?(:compile_time)
9: end
10:
11: require 'chef-vault'
12>> item = ChefVault::Item.load('testvault', 'testitem')
13: item['testkey']
14:
15: log "this is testkey's value: #{item['testkey']}" do
16: level :info
17: end
18:
19:
Running handlers:
[2015-04-10T17:30:21+09:00] ERROR: Running exception handlers
Running handlers complete
[2015-04-10T17:30:21+09:00] ERROR: Exception handlers complete
[2015-04-10T17:30:21+09:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
Chef Client failed. 1 resources updated in 7.011639648 seconds
[2015-04-10T17:30:21+09:00] ERROR: testvault/testitem is not encrypted with your public key. Contact an administrator of the vault item to encrypt for you!
[2015-04-10T17:30:21+09:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
d-higuchi@node1:~$
このようにエラーとなりました。node1.example.jpは共有秘密鍵を持っていないからです。
d-higuchi@ws:~/chef-repo$ knife data bag show testvault testitem_keys
Unencrypted data bag detected, ignoring any provided secret options.
admins:
d-higuchi
alice
alice: HBFA/lj5/lSt3eCGexS0ZzJDhf4rkrduktBqT5un1kQZuQFyXDM/OVv7N8TV
(省略)
clients:
d-higuchi: mAY/Hl8EQ15vPiaUnwfDFgC64MNvodzS8yjZ3tb0ZY2yRy0rrYAY99ND7rD1
(省略)
id: testitem_keys
search_query:
d-higuchi@ws:~/chef-repo$
では、node1.example.jp用の鍵を準備しましょう。Nodeの追加には、Chef Serverに対するSearchを用います。ここでは「recipe:test-vault」を検索クエリとしてみます。
d-higuchi@ws:~/chef-repo$ knife search node 'recipe:test-vault'
1 items found
Node Name: node1.example.jp
Environment: _default
FQDN: node1.example.jp
IP: 192.168.122.201
Run List: recipe[test-vault]
Roles:
Recipes:
Platform: ubuntu 14.04
Tags:
d-higuchi@ws:~/chef-repo$
Userの追加のときと同様、「knife vault update」コマンドを使います。「 -S 'recipe:test-vault'」オプションで検索クエリを指定します。
d-higuchi@ws:~/chef-repo$ knife vault update testvault testitem -S 'recipe:test-vault'
d-higuchi@ws:~/chef-repo$
node1.example.jpの鍵が追加できました。
d-higuchi@ws:~/chef-repo$ knife data bag show testvault testitem_keys
Unencrypted data bag detected, ignoring any provided secret options.
admins:
d-higuchi
alice
alice: HBFA/lj5/lSt3eCGexS0ZzJDhf4rkrduktBqT5un1kQZuQFyXDM/OVv7N8TV
(省略)
clients: node1.example.jp
d-higuchi: PJ3Y9TCLYOZCjDAxaJI5z3AeKBuTyva5vOKl76N1lT4g3EaLf2aLhfyJDfSc
(省略)
id: testitem_keys
node1.example.jp: MG9puPpk3jGWNX9NmffT9nG2HPXcnNpNRgk7SOFwucgIw9a27WhoQ/w5yOwg
HxO1YIh8jN/8Z/T2WFp3nuDMKJdYSyLkWf1uq/7TAfifqNoYGXmILO+ThLbs
TfDT9mHx3B0qlIFxiQmPOEHVoRVJmGM/2ruyWQrs4zXBZmXb0uoTmzI8+vLF
TITlZ9caJyRHFm7fjpIevJn23twAEGA9S62fcxgILAw3RUSNq0Op0ICBNrEV
y0uMu34acrttN+nlBNaqpnXLNLF95c9RWgSPPoLVloGJ5u31LKo0rWNWugQm
nBwGGiUng9IO2v9QxgqD497LsCFTgOApuApCZrhpSQ==
search_query: recipe:test-vault
d-higuchi@ws:~/chef-repo$
再度、node1.example.jpでRecipeを適用してみましょう。エラーにならず、Chef-Vaultに格納していた値が取得できました。
d-higuchi@node1:~$ sudo chef-client
Starting Chef Client, version 12.2.1
resolving cookbooks for run list: ["test-vault"]
Synchronizing Cookbooks:
- test-vault
Compiling Cookbooks...
Recipe: test-vault::default
* chef_gem[chef-vault] action install (up to date)
Converging 2 resources
* chef_gem[chef-vault] action install (up to date)
* log[this is testkey's value: testval] action write
Running handlers:
Running handlers complete
Chef Client finished, 1/3 resources updated in 10.564789243 seconds
d-higuchi@node1:~$
さて、もう一つのNodeであるnode2.example.jpのrun_listに対して「recipe[test-vault]」を追加したらどうなるでしょうか。
d-higuchi@ws:~/chef-repo$ knife node run_list add node2.example.jp 'recipe[test-vault]'
node2.example.jp:
run_list: recipe[test-vault]
d-higuchi@ws:~/chef-repo$
特に自動的に鍵が追加されるということはありませんでした。
d-higuchi@ws:~/chef-repo$ knife data bag show testvault testitem_keys
Unencrypted data bag detected, ignoring any provided secret options.
admins:
d-higuchi
alice
alice: HBFA/lj5/lSt3eCGexS0ZzJDhf4rkrduktBqT5un1kQZuQFyXDM/OVv7N8TV
(省略)
clients: node1.example.jp
d-higuchi: PJ3Y9TCLYOZCjDAxaJI5z3AeKBuTyva5vOKl76N1lT4g3EaLf2aLhfyJDfSc
(省略)
id: testitem_keys
node1.example.jp: MG9puPpk3jGWNX9NmffT9nG2HPXcnNpNRgk7SOFwucgIw9a27WhoQ/w5yOwg
(省略)
search_query: recipe:test-vault
d-higuchi@ws:~/chef-repo$
検索結果を反映させるには「knife vault refresh」コマンドを使います。
d-higuchi@ws:~/chef-repo$ knife vault refresh testvault testitem
d-higuchi@ws:~/chef-repo$
このように、node2.example.jpの鍵が追加されました。
d-higuchi@ws:~/chef-repo$ knife data bag show testvault testitem_keys
Unencrypted data bag detected, ignoring any provided secret options.
admins:
d-higuchi
alice
alice: rmpfzdziwBkzQvh90eNoxo8WGbq4U65VEAfU4sN3Rh2quH10CG5sJ86I/AeU
(省略)
clients:
node1.example.jp
node2.example.jp
d-higuchi: O7Vwmp//2Nz+M7RRVMN1xIlx1yY+hZLQlaab8YiUrNL581VlC0tEryj8gnEV
(省略)
id: testitem_keys
node1.example.jp: BWg3pSb9TIsEG4HYc0cv3SU24Xhp5w9m+UtS8Q4N6Eony5KiAY0V3nhMtJqq
(省略)
node2.example.jp: uwiHML5imm20NuELx/9fWK7aHzfzOjqEUvReDpqX/E6Lr0+LP/ee3xB4tuaK
q8r/EotymMvgPX4uKniPnP7AsNca0j/2s4O1OsAdO9qkIxscSnl4EzGnheB5
wpI4U/HDrGdjm+WghmwE1gqLmOw4QN7kZ5DfAkqC1qTyWbbVQg3L4j1HT42c
xG7Nu4AZXd4TsjCTnKJsuIC/w6phKibRN0wORVrkV/mvq+vOaPUVk2tRwbSR
GsX8OBYBRdAN8wnBtbpYd1mHnOudW1eZovsDUF0De9qIyUyVNmv8rJqXlohY
IW7lsAolfuyLJLe+IREHCIvTb20jT+57wq97F3lGdA==
search_query: recipe:test-vault
d-higuchi@ws:~/chef-repo$
node2.example.jpでもChef-Vaultに格納された値が取得できています。
d-higuchi@node2:~$ sudo chef-client
Starting Chef Client, version 12.2.1
resolving cookbooks for run list: ["test-vault"]
Synchronizing Cookbooks:
- test-vault
Compiling Cookbooks...
Recipe: test-vault::default
* chef_gem[chef-vault] action install
- install version 2.5.0 of package chef-vault
Converging 2 resources
* chef_gem[chef-vault] action install (up to date)
* log[this is testkey's value: testval] action write
Running handlers:
Running handlers complete
Chef Client finished, 2/3 resources updated in 10.364157204 seconds
d-higuchi@node2:~$
まとめ
Chef-Vaultについて、簡単に内部動作や使い方を見てきました。Encrypted Data Bagに比べるとやや複雑ですが、一通り触ってみればKnifeからの操作で完結することもあり、そこまで難しいものではないと思います。既に述べた通り、Chef-VaultはChef-DKに同梱されていることから、今後Chef本体での利用が進んでいくものと予想しています。是非、Chef-Vaultを使ってみてください。