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を使ってみてください。
