LoginSignup
0
0

More than 1 year has passed since last update.

Chef Vault 早わかり

Posted at

業務でChef Vaultを扱うことがあるのですが、引っかかることが多いため簡潔なリファレンスをまとめます。
公式のリファレンスは https://docs.chef.io/workstation/chef_vault/ です。

Chef Vaultとは

Chefサーバ上にデータを暗号化して保存するための仕組み。
例えば各ノード(Chefサーバで管理しているサーバ)に共通のパスワードを配布するのに用いる。

ちなみにChefサーバ上にデータを保存するData Bagsという仕組みがあり、さらに暗号化するのがChef Vaultである。

データの内容

全体としては二重の連想配列で、vault名とitem名により引き当てる。
各itemはJSONオブジェクトで、自由に構造化することができる。

誰が取得できるのか

Itemごとに権限付与できる。取得できるのは、権限のある:

  • アカウント(Chefサーバのユーザ)、または
  • ノード

暗号化の仕組み

公開鍵暗号。

  1. Chefサーバは各アカウントやノードの公開鍵を持っている。Chefサーバがデータを受け入れる際、権限のある各アカウントやノードの公開鍵で、それぞれ暗号化して別々に保存する。
  2. 権限のあるアカウントやノードは、自分の公開鍵で暗号化されたデータをダウンロードし、手元の秘密鍵で復号化する。

鍵ペアが生成されるタイミングは:

  • アカウントであれば作成時、または、事前に手元で生成して作成時に公開鍵を明示する。
  • ノードであればブートストラップ時(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
0
0
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
0
0