knife bootstrapにおけるvalidatorなしでのブートストラップ #getchef
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
Chef Client 12.1.0にて、knife bootstrapコマンドがvalidatorなしのブートストラップをサポートしました。本稿ではこれが一体どういうことなのか、実際に試してみます。
おさらい: validatorとは
そもそもvalidatorとは何でしょうか。簡単に言えば、NodeをChef Serverに登録する際に使う秘密鍵です。NodeがChef Serverに登録できたら、後はNodeごとに生成されたClientキーによって認証を行うため、そのNodeではvalidatorは必要なくなります。validatorをそのままにしておくと万が一Nodeから流出した際にChef Serverへの不正なアクセスが可能になってしまうので、validatorを削除するためのchef-client::delete_validation Recipeもあります。
validatorありでのブートストラップ
まず、これまで通り、validatorありでのブートストラップを行ってみます。
d-higuchi@ws:~/chef-repo$ knife bootstrap node1.example.jp -x ubuntu -P ubuntu --sudo
Doing old-style registration with the validation key at /home/d-higuchi/chef-repo/.chef/creationline-validator.pem...
Delete your validation key in order to use your user credentials instead
Connecting to node1.example.jp
:
(省略)
:
「Doing old-style registration with the validation key」というメッセージが出ています。また、どうするべきかの手順も示されていますが、通常通りにブートストラップが進んでいきます。
validatorなしでのブートストラップ
では、実際にvalidatorなしでのブートストラップを行ってみます。.chef/knife.rb設定ファイルは次のようになっているとします。Chef Starter Kitそのままです。
d-higuchi@ws:~/chef-repo$ cat .chef/knife.rb
# See https://docs.getchef.com/config_rb_knife.html for more information on knife configuration options
current_dir = File.dirname(__FILE__)
log_level :info
log_location STDOUT
node_name "d-higuchi"
client_key "#{current_dir}/d-higuchi.pem"
validation_client_name "creationline-validator"
validation_key "#{current_dir}/creationline-validator.pem"
chef_server_url "https://chef-server.example.jp/organizations/creationline"
cookbook_path ["#{current_dir}/../cookbooks"]
d-higuchi@ws:~/chef-repo$
Chef Client 12.1.0リリース記事によると、
validationキーを削除することで有効になります。validationキーが存在しないと、knife bootstrapはブートストラップするNodeのClientを作成するためにUserのキーを利用します。
とのことなので、.chef/ディレクトリからvalidator秘密鍵ファイルを削除します。ここではvalidator秘密鍵ファイルcreationline-validator.pemをホームディレクトリに移動しています。
d-higuchi@ws:~/chef-repo$ mv .chef/creationline-validator.pem ~
d-higuchi@ws:~/chef-repo$
そして、通常通りにknife bootstrapコマンドでブートストラップしてみます。
d-higuchi@ws:~/chef-repo$ knife bootstrap node1.example.jp -x ubuntu -P ubuntu --sudo
Creating new client for node1.example.jp
Creating new node for node1.example.jp
Connecting to node1.example.jp
node1.example.jp
node1.example.jp Installing Chef Client...
:
(省略)
:
node1.example.jp Thank you for installing Chef!
node1.example.jp Starting first Chef Client run...
node1.example.jp Starting Chef Client, version 12.2.1
node1.example.jp resolving cookbooks for run list: []
node1.example.jp Synchronizing Cookbooks:
node1.example.jp Compiling Cookbooks...
node1.example.jp [2015-04-13T11:57:12+09:00] WARN: Node node1.example.jp has an empty run list.
node1.example.jp Converging 0 resources
node1.example.jp
node1.example.jp Running handlers:
node1.example.jp Running handlers complete
node1.example.jp Chef Client finished, 0/0 resources updated in 1.677529776 seconds
d-higuchi@ws:~/chef-repo$
ブートストラップできました。NodeとClientがChef Serverに登録されています。
d-higuchi@ws:~/chef-repo$ knife node list
d-higuchi
node1.example.jp
d-higuchi@ws:~/chef-repo$ knife client list
creationline-validator
node1.example.jp
d-higuchi@ws:~/chef-repo$
Nodeにはvalidator秘密鍵ファイルは存在していません。
d-higuchi@node1:~$ ls -la /etc/chef/
合計 24
drwxr-xr-x 3 root root 4096 4月 13 11:57 .
drwxr-xr-x 90 root root 4096 4月 13 11:57 ..
-rw------- 1 root root 1676 4月 13 11:57 client.pem
-rw-r--r-- 1 root root 223 4月 13 11:57 client.rb
-rw-r--r-- 1 root root 16 4月 13 11:57 first-boot.json
drwxr-xr-x 2 root root 4096 4月 13 11:57 trusted_certs
d-higuchi@node1:~$
Chef Client 12.1より以前なら、validator秘密鍵が存在してなければ、
d-higuchi@ws:~/chef-repo$ knife bootstrap node1.example.jp -x ubuntu -P ubuntu --sudo
Connecting to node1.example.jp
ERROR: Errno::ENOENT: No such file or directory @ rb_sysopen - /home/d-higuchi/chef-repo/.chef/creationline-validator.pem
d-higuchi@ws:~/chef-repo$
というエラーとなります。
一応、Organizationに所属していないbob Userでブートストラップできないことを確認してみましょう。
d-higuchi@ws:~/chef-repo$ knife user list
alice
d-higuchi
d-higuchi@ws:~/chef-repo$
bob@ws:~/chef-repo$ ls -la .chef/
合計 20
drwxr-xr-x 3 bob bob 4096 4月 13 12:23 .
drwxrwxr-x 5 bob bob 4096 4月 10 11:15 ..
-rw-r--r-- 1 bob bob 1679 4月 10 11:16 bob.pem
-rw-r--r-- 1 bob bob 578 4月 10 11:30 knife.rb
drwxrwxr-x 2 bob bob 4096 4月 9 15:31 trusted_certs
bob@ws:~/chef-repo$
次のように、そもそもOrganizationに所属していないため失敗しました。
bob@ws:~/chef-repo$ knife bootstrap node1.example.jp -x ubuntu -P ubuntu --sudo
ERROR: You authenticated successfully to https://chef-server.example.jp/organizations/creationline as bob but you are not authorized for this action
Response: 'bob' not associated with organization 'creationline'
bob@ws:~/chef-repo$
さらに、Organizationに所属しているalice Userの秘密鍵を壊してみて、ブートストラップできないことを確認してみましょう。
alice@ws:~/chef-repo$ cp ~bob/chef-repo/.chef/bob.pem .chef/alice.pem
alice@ws:~/chef-repo$
次のように、そもそも鍵が合わないため失敗しました。
alice@ws:~/chef-repo$ knife bootstrap node1.example.jp -x ubuntu -P ubuntu --sudo
ERROR: Failed to authenticate to https://chef-server.example.jp/organizations/creationline as alice with key /home/alice/chef-repo/.chef/alice.pem
Response: Invalid signature for user or client 'alice'
alice@ws:~/chef-repo$
このように、validator秘密鍵なしであっても、適当にブートストラップできているわけではないことがわかりました。
まとめ
validatorなしでのブートストラップがどのようなものか、実際に試してみました。わざわざvalidator秘密鍵を準備したり配布したりする必要がなく、後で削除する必要もなくなり、手間の軽減と安全性の向上が図られています。Chef Client 12.1.0以降を利用しているのなら、validatorなしでのブートストラップに移行してしまうといいでしょう。もしくはChef Client 12.1.0以降への移行を検討してください。