[和訳] Chef Vault の仕様と利点 #getchef
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
本稿は Chef Vault - what is it and what can it do for you? (2016/01/21) の和訳です。
構成管理フレームワークの範囲内で API キー、データベースパスワードのような機密情報をどのように取り扱うべきか悩んだことはありませんか? Data Bag は Chef Recipe で用いるグローバル変数を保管しておくのに非常に便利ではありますが、機密情報に関する十分なセキュリティを常に提供しているわけではありません。
1つの解決策としては、暗号化 Data Bag Item を用いるという手があります。この場合、機密情報を含む Data Bag Item を共有キーで暗号化することになります。 共有キーを所持する人またはインフラの一部のみが暗号化 Data Bag を復号することができます。
この方法の問題点は共有キーを使用するということです。このキーを適切なユーザーやインフラに配布するのはあなたの責任です。これではセキュリティ問題につながりかねないため、最善の方法とは言えないでしょう。
この共有キーのセキュリティ問題を回避するために、Chef Vault を使うことができます。
Chef Vault とは?
Chef Vault は Chef の機密情報を管理するための代替ツールです。これは元々 Nordstrom 社 がオープンソースプロジェクトとして開発していましたが、2015年に Chef 社に移行しました (訳注: 和訳)。暗号化 Data Bag と異なり、全てのユーザーやインフラに同じキーを共有する必要がありません。
Chef Vault はどのようにして動くのか?
Chef Vault の Github レポジトリ上の THEORY.md ファイルに Chef Vault がなぜ、どのように機能するかについての詳細な情報が記載されています。ここでそのいくつかを見てみましょう。
仮に Chef Server で Node 群を管理しているとします。
Chef Server を通して管理している Node は、すべて Chef Server 上に関連するクライアントオブジェクトを持っています。このように Chef Server は Node を認識し管理します。
Node を Chef Server を通して管理する場合、RSA キーペアを用います。Node が RSA キーペアの秘密鍵を持っています(通常 /etc/chef/client.pem 内にあります)。Chef Server が公開鍵を所持します。
さらに、Chef Server 上の各ユーザーアカウントもまた RSA キーペアを所持しています。このようにして Workstation を認証・認可し、Chef Server に変更を加えることができます。
Workstation が秘密鍵を所持し(多くの場合これは .chef ディレクトリ内にあります)、Chef Server が公開鍵を所持します。
Chef Vault (以下 vault)を用いて暗号化 Data Bag を作成する場合、Data Bag Item (以下 vault アイテム)を、無作為に作成した「shared secret」という秘密の文字列を用いて暗号化します。
Vault を作成する際、Vault にアクセスする必要のあるユーザーと Node を特定します。Chef Vault はその後、そのユーザーまたは Node の公開鍵を用いて各ユーザーまたは Node の「shared secret」を暗号化します。したがって、Node を 2つ、admin ユーザーを 2つ持っている場合、Chef Vault は「shared secret」のコピーを 4つ作成します。それぞれの Node/ユーザーのそれぞれの公開鍵を用いて、各 Node/ユーザーごとに 1つ作成します。
Vault 内の暗号化アイテムにアクセスする際、二段階の暗号を用います。RSA キーが shared secret の暗号を解き、その後 shared secret が暗号化 vault アイテムを復号します。
これにより、共有キーを見つけたり配布したりする必要なく、admin ユーザーや Node を容易に追加できるようになりました。これは、ユーザーや Node のアクセスを削除する必要がある場合にそのユーザーや Node のキーを削除するだけです。新しいキーを作成し全員に配布する必要はありません。
Chef Vault の使い方
Chef Vault をインストールする
Chef DK を使っているなら…おめでとうございます! すでに Chef Vault がインストールされています。Chef DK を使っていないなら、
$ gem install chef-vault
でインストールできます。
Vault を作成する
vault を作成してみましょう。例えば、データベースパスワードを保管したいとします。json ファイルから Data Bag Item を作成したい場合、次のように json ファイルを作成することができます。
database.json:
{"db_password":"some_password"}
最後に、誰が/何がこの vault アイテムの復号をするかを決めましょう。例えば、Workstation でこのアイテムを復号する必要があるユーザーが 2人いるとしましょう。その Workstation を starley と jsnow とします。また、このアイテムを復号する必要のある Node が 2つ (whitewalker_node_1 と whitewalker_node_2) あるとします。
次にこのコマンドを実行します:
$ knife vault create credentials database -A starley, jsnow -M client -S 'name:whitewalker_node_*' -J ./database.json
細かく分けて見てみましょう。
- credentials は vault 名です。
- database は vault 内の暗号化するアイテムです。
- starley と jsnow は暗号化アイテムを Workstation から復号したいユーザー(以下 admin ユーザー)です。
- Chef Vault のモードも指定しています。Chef Server で使っている場合、-M client として指定する必要があります。Chef Solo でお使いの場合、-M solo として指定する必要があります。
- このアイテムを復号する必要のある Node を指定するには、Chef Server 上で Organization と関連付けられている Node を検索します。この場合、'name:whitewalker_node_*' となります。これで 'whitewalker_node_' から始ます名前の Node をすべて検索することができます。
- 最後に、json ファイルの中でこの vault アイテムの内容を決定しているため、そのファイル名とそのファイルへのパスを入れてください。
注意: この記事をポストした後、-S タグを用いた Node の検索は安全でない可能性があるというフィードバックを頂きました。セキュリティを無効化した Node はデータを偽装し、検索される可能性があるためです。これが発生した場合、次回誰かが knife vault update を実行した際に、セキュリティを無効化した Node は不正に復号のアクセスを与えられてしまいます。
完全な安全性のためには、-A "whitewalker_node1,whitewalker_node2" を使用するか、ユーザーの追加も行う場合には、-A "starley,jsnow,whitewalker_node1,whitewalker_node2" を使用しなければなりません。
このコマンドを実行すると、「credentials」という名前の vault を作成し、Data Bag 内に「database」と「database_keys」という 2つのアイテムを作成します。
「database」アイテムは実際に暗号化したコンテンツを含みます。その vault の admin ユーザーになっていないユーザーの Workstation からこのアイテムを見る場合、暗号化された出力しか見ることができません。
$ knife vault show credentials database
db_password:
cipher: aes-256-cbc
encrypted_data: dsiBtNHX8Sbis42yKuYBvbdNXPpu8bQfJrS20op7zoysfR8roFlzpVHyoaG24yb3
iv: +0siNLzFHHqStM07k5JhYw==
version: 1
id: database
admin ユーザーになっているユーザーの Workstation にいるとしたら(jsnow の Workstation 上にいるとしましょう)、復号したコンテンツを見ることができます。
$ knife vault show credentials database
db_password: some_password
id: database
ではここで、「database_keys」アイテムを見てみましょう。
$ knife data bag show credentials database_keys
admins:
starley
jsnow
clients:
whitewalker_node_1
whitewalker_node_2
id: database_test_keys
starley: SOME KEY
jsnow: SOME KEY
whitewalker_node_1: SOME KEY
whitewalker_node_2: SOME KEY
これは 4つのキーを含んでいます(各ユーザーまたは Node ごとに 1つ)。vault を作成したい際に、shared secret を生成し、その shared secret を各 Node とユーザーの (Chef Server から取得した)公開鍵を用いて暗号化したことを思い出してください。ここで、そのユーザーや Node のうち 1つが暗号化アイテムを復号しようとしているとき、ユーザー/Node の公開鍵が shared secret を復号し、その shared secret がアイテム自体を復号します。これで「credential」vault 内の「database」アイテムを見ることができます。
Chef Recipe 内で vault を使用する
それでは、vault を Chef Cookbook 内で使用してみましょう。Cookbook 内で Chef Vault を使用するには、Chef Vault Cookbook を使用します。この Cookbook なしでも Chef Vault を使うことはできますが、この Cookbook には vault とのやりとりをより簡単にする便利な機能を多数追加しています。
このためには metadata.rb に次の行を追加してください。
metadata.rb:
depends 'chef-vault'
それから、chef-vault を使う Recipeの 中に chef-vault Recipe を含めてください。
recipe.rb:
include_recipe 'chef-vault'
それでは vault 内の暗号化されたアイテムを呼び出してみましょう。
recipe.rb:
include_recipe 'chef-vault'
vault = chef_vault_item(:credentials, 'database')
これでその暗号化 Data Bag Item 内の Attribute を使用することができます。
recipe.rb:
include_recipe 'chef-vault'
vault = chef_vault_item(:credentials, 'database')
node.set['database']['password'] = vault['password']
Vault を編集する
データベースのパスワードを変更するなど、vault を編集する必要がある場合はどうしたらよいのでしょうか? (vault の admin ユーザーの Workstation を使用中であれば) このコマンドを用いて編集することができます:
$ knife vault edit credentials database
credentials は vault 自体の名前であり、database はその vault 内の暗号化アイテムであることを覚えておいてください。
Vaultを破壊する
暗号化アイテムを破壊する
vault 内の暗号化アイテムを破壊するには、knife delete コマンドを使用してください。
$ knife vault delete credentials database
Data Bag (Vault) を破壊する
knife vault コマンドを通して vault 自体を削除する方法は現在ありません。しかし、knife data bag コマンドを用いて vault を削除することができます。
$ knife data bag delete credentials
Chef Vault を管理する
ユーザー
新規 admin ユーザーを追加する
新規 admin ユーザーを追加する必要がある場合、vault 名、vault 内の暗号化アイテム、-A フラグ、そして Chef Server 上のユーザーのユーザー名を添えて knife vault update を実行してください:
$ knife vault update credentials database -A "new-username"
これが shared secret の新規コピーを、そのユーザーの Chef Server 上のキーを用いて暗号化します。これを実行した後、ユーザーは vault を復号することができます。
Admin ユーザーキーを更新する
Admin ユーザーが Chef Server と紐づくキーを変更した場合、暗号化コピーと shared secret (vaultアイテムを復号するのに使用する文字列)を更新する必要があります。
$ knife vault refresh credentials database
Admin ユーザーを削除する
Admin ユーザーを削除したい場合、ユーザーの Chef Server ユーザー名を用いて knife vault remove コマンドを実行してください。
$ knife vault remove credentials database -A "role:base"
Node
新規 Node を追加する
新しい Node が vault アイテムを復号できるようにするためには、knife value update を実行してください。-S フラグを使用して、新しい Node を含むクエリを含むようにしてください。例えば、Node (とすでに vault アイテムへのアクセスがある Node) がベースロールを持っている場合は 'role:base' です。
$ knife vault update credentials database -S "Node の検索クエリ"
新規 Node を追加するけれども(その Node がベースロールに追加されたとしましょう)、以前と同じ検索クエリ (つまり 'role:base') を使用する場合、knife vault refresh を実行することができます。これにより、検索クエリを再実行し、必要に応じて Node を追加または削除することができます。
Node を削除する
$ knife vault update credentials database -S "削除する Node を除外する Node の検索クエリ"
Chef Vault の限界
Chef Vault はオートスケーリングやセルフヒーリングシステムを利用する場合には制限があります。Noah Kantrowitz が彼のブログ投稿 Secrets Management and Chef にまとめています。
サーバーが secret へのアクセスを認められると、オンライン状態でもアクセスをし続けます。しかし、新しいサーバーの付与や廃止は人間とコンピュータのやりとりが必要です。したがって chef-vault はオートスケーリングやセルフヒーリングシステムには対応していません。監査ログや、Data Bag によって稼働するアプローチにも同様の問題が発生します。
Chef を利用して機密情報を管理する代替ツールの情報については彼のブログを参照してください。
Chef Vault についての詳細情報
Chef Vaultについてのより詳しい情報については次を見てください。
- Chef Vault Github レポジトリ (特に THEORY.md と KNIFE_EXAMPLES.md ファイル
- Chef Vault ドキュメント
- Why Chef-vault and Autoscaling Don't Mix by Peter Burkholder
- Secrets Management and Chef by Noah Kantrowitz