Knife-Zeroで秘密情報管理:Data Bagの使い方

弊社ではサーバーの構成管理技術の一つとしてKnife-Zeroを使用しています。 その中で秘密情報を管理できるData Bagと呼ばれるものがあります。こいつの使い方を毎回忘れるので備忘録として記します。

Data Bagとは

About Data Bags — Chef Docs

グローバル変数を定義して、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すればできます。