こんなタイトルの記事はいくらでもあるので、今更感満載だけれども、あえて書きます。
なぜかというと「私のため」だから。
さて、chef を使っていて、パスワードを埋め込んだり変更したりと言うことはよくあるざます。
その時に、node ファイルや attributes へ直接書き込んだまま、Github に上げてしまうと、パスワードバレバレの事態になります。さすがに初心者でも気がつく当たり前の事象です。
とは言え、data bagってなんかめんどくさいし、password は環境変数 でもいっか、とか手の抜きどころを沢山考えたのですが、折角与えられた機能だから使ってみよう。使っておこう。
そういうことにして、本日はそのステップのみを記載して終わりにします。
夜遅いし、まだ仕事終わってないし。
1. 鍵を作る
君のマシンに openssl コマンドはあるか?
よし、次のコマンドを打て
openssl rand -base64 512 > data_bag_key
名前も場所も好きなところで良いけれども、~/chef_repo 配下だと何も考えずに git add して git commit して git push して泣くことになるかも知れないので、別のトコへ配置するのが推奨かも。 .gitignore にわざわざ書いてもいい。
オレは Emacs で magit-status でいちいち staging する内容確認してるから、どこでも問題なし。さすが、Emacs (関係ない)
2. .chef/knife.rb 書き換え
書き換えといっても大したことじゃないです。
最小限の作業としては、1行アンコメントするだけです。
cookbook_path ["cookbooks", "site-cookbooks"]
node_path "nodes"
role_path "roles"
environment_path "environments"
data_bag_path "data_bags"
encrypted_data_bag_secret "data_bag_key"
knife[:berkshelf_path] = "cookbooks"
encrypted_data_bag_secret "data_bag_key" をアンコメントして、指定したファイルとするだけです。/etc/chef/data_bag_key へ配置したなら
encrypted_data_bag_secret "/etc/chef/data_bag_key" となることでしょう。
簡単。
3. knife solo 用の data bag ツールを準備する
たいそうなこと言ってますが、gem install knife-solo_data_bag してくださいってだけです。sudo する派もしない派もどちらでもいいですし、bundle派も自分の環境どおりに好きにしてください。私は sudo派です。ゴメンなさい。
$ sudo gem install knife-solo_data_bag
Password:
Fetching: knife-solo_data_bag-1.1.0.gem (100%)
Successfully installed knife-solo_data_bag-1.1.0
Parsing documentation for knife-solo_data_bag-1.1.0
Installing ri documentation for knife-solo_data_bag-1.1.0
1 gem installed
4. 鍵を使って暗号化 json を作成する
事前に EDITOR 環境変数を指定しておきましょう。よく分からない人は次のようにして、vi でも使ってください。vi の使い方知らない人が、chef 使うことはあり得ないでしょう。
$ export EDITOR=vi
そして、次のコマンドです。
$ knife solo data bag create password mysql --secret-file ./data_bag_key
knife solo data bag create まで固定です。
次に指定している password mysql は、ディレクトリで示すと次のようになります
~/chef_repo/data_bags/password/mysql.json
分かりやすい。password というグループに、mysql 用の定義を準備したと理解するといいですね。はい、私はそんな風に理解しました。
--secret-file の後は、お分かりのように、1. で作成した鍵ファイルを指定します。
すると、きっと次のような画面が出てくるはずです。
{
"id": "mysql"
}
ここで必要な定義を追加して、そっと閉じましょう。
{
"id": "mysql",
"password": "p@ssw0rd"
}
実際はこんな単純なパスワードは使ってませんが、例えばです。 なお、"id": "mysql" は、おまじないの中でも必須な条項です。書き換えるのはやめておきましょう。
試しに中を覗いてみるとこんな感じです。
$ cat data_bags/password/mysql.json
{
"id": "mysql",
"password": {
"encrypted_data": "6u167KJgpqz0MxwHW+SZ3/kxXkehCeCYZfuSqoJqYRg=\n",
"iv": "raa292+i9HCAED4DC9eEFg==\n",
"version": 1,
"cipher": "aes-256-cbc"
}
}
見事、暗号化されていますね。良かった。
5. recipe で読み出す
後は、実際にchef のレシピで呼び出すだけです。
こう。
data_bag = Chef::EncryptedDataBagItem.load('password','mysql')
mysql_password = data_bag['password']
これで、mysql_password 変数に一時的に復元されたパスワードが保持されました。
template resource 内で使う場合は、variables で飛ばして上げる必要があります。
template "foo" do
variables ({
:password => mysql_password
})
end
で、foo という tepmlate ファイル内では、こう
PASSWORD = '<%= @password %>'
で定義されます。良かったネヽ(´ー`)ノ