業務でChef Vaultを扱うことがあるのですが、引っかかることが多いため簡潔なリファレンスをまとめます。
公式のリファレンスは https://docs.chef.io/workstation/chef_vault/ です。
Chef Vaultとは
Chefサーバ上にデータを暗号化して保存するための仕組み。
例えば各ノード(Chefサーバで管理しているサーバ)に共通のパスワードを配布するのに用いる。
ちなみにChefサーバ上にデータを保存するData Bagsという仕組みがあり、さらに暗号化するのがChef Vaultである。
データの内容
全体としては二重の連想配列で、vault名とitem名により引き当てる。
各itemはJSONオブジェクトで、自由に構造化することができる。
誰が取得できるのか
Itemごとに権限付与できる。取得できるのは、権限のある:
- アカウント(Chefサーバのユーザ)、または
- ノード
暗号化の仕組み
公開鍵暗号。
- Chefサーバは各アカウントやノードの公開鍵を持っている。Chefサーバがデータを受け入れる際、権限のある各アカウントやノードの公開鍵で、それぞれ暗号化して別々に保存する。
- 権限のあるアカウントやノードは、自分の公開鍵で暗号化されたデータをダウンロードし、手元の秘密鍵で復号化する。
鍵ペアが生成されるタイミングは:
- アカウントであれば作成時、または、事前に手元で生成して作成時に公開鍵を明示する。
- ノードであればブートストラップ時(Chefサーバの管理下に入れるとき)
この仕組みのため、例えばノード内のデータをロストしてブートストラップをやり直した場合、権限付与もやり直す必要がある。
Itemの作成
Vault名:passwords
, item名:root
の例。
knife vault create passwords root -J passwords/root.json -M client
-M client
はクライアントとして動作する(つまり、別にChefサーバが存在する)ことを示す。
アカウントによる取得
主に内容の確認のほか、ChefサーバやChef organizationの移行などに用いる。
knife vault show passwords root -M client -F json > passwords/root.json
アカウントへの権限付与
通常、取得だけできても意味がないので、管理者権限を付与する。
knife vault update passwords root -M client -A tomanabe
ノードへの権限付与
通常、台数があるので、クエリを指定してマッチするノードにまとめて付与する。
knife vault update passwords root -M client -S role:webserver
ノードによる取得(Recipeにおける取得)
require 'chef-vault'
item = ChefVault::Item.load('passwords', 'root')
ここで item
はJSONオブジェクトである(例えば、パスワードのStringそのものではない)ことに注意すること。
Chef Vaultのモック(Itemの取得を含むRecipeのテスト)
require 'chef-vault'
allow(ChefVault::Item).to receive(:load).with('passwords', 'root').and_return({'mock_key' => 'mock_value'})
権限剥奪
サブサブコマンド update
の代わりに remove
を用いる。
Itemの削除
knife vault delete passwords root -M client