Knife-Zeroで秘密情報管理:Data Bagの使い方
弊社ではサーバーの構成管理技術の一つとしてKnife-Zeroを使用しています。 その中で秘密情報を管理できるData Bagと呼ばれるものがあります。こいつの使い方を毎回忘れるので備忘録として記します。
Data Bagとは
グローバル変数を定義して、recipeで使うことができるものです。JSONデータとして保存されます。
さらに変数を暗号化することができ、バージョン管理システムと相性が良いです。
弊社ではパスワードなどもろもろの秘密情報は暗号化したData Bagを使っています。
暗号化の仕組み
ローカルでは事前に作成した秘密鍵を用い、Data Bagを作成する際にオプションを指定し暗号化します。
その後構成管理をするサーバーの特定フォルダ(デフォルトは/etc/chef/
)に秘密鍵を置きます。
これによりKnife Zeroを実行する際サーバー側で復号することができます。
Data Bagの使い方
1.opensslコマンドを用い上記暗号化のための秘密鍵を生成します。
openssl rand -base64 512 | tr -d '\r\n' > encrypted_data_bag_secret
2.以下のコマンドで暗号化Data Bagを生成します。
bundle exec knife data bag create [bagname] [itemname] --encrypt --secret-file [filepath]
3.以下のようなjson編集画面がでてくるので必要なjson情報を編集します。
{ "id": "[itemname]", "key": "value" }
4../data_bags/[bagname]/[itemname].json
が生成されていると思うので確認してください。
5.以下のようにrecipe内で使用します。
data = data_bag_item('[bagname]', '[itemname]', IO.read('/etc/chef/encrypted_data_bag_secret')) data[key]
6.サーバー側の/etc/chef
配下に1.で作成したencrypted_data_bag_secret
を配置してください。
あとはいつものようにconvergeすればできます。