ども、cloudpack の かっぱ (@inokara) です。
はじめに
やむを得ない理由で AWS のアクセスキーやシークレットアクセスキーを Chef で扱わないといけない時には…迷わず Encrypted Data Bag を使いましょう。ということで、Encrypted Data Bag を使って Credential な情報を扱う際のメモです。
参考
- Chefで公開したくないJSONデータを暗号化するためにDataBagsを利用してみた記録
- Chef Solo + knife-soloでData Bag Itemを暗号化する
- Chef Solo + Knife Solo で暗号化データバッグを使う
使い方
動作環境は…
- MacOS X 10.9 Mavericks
- Chef 11.16.0
手順(1)環境変数 EDITOR の指定
事前に環境変数の EDITOR を指定しておきましょう。
export EDITOR=/usr/bin/vim
何気に重要です。
手順(2)暗号化キーを作成
暗号化する為の鍵を作っておきます。
cd ${CHEF_REPO} openssl rand -base64 512 > /path/to/data_bag_key
作成できたら knife.rb に以下のように指定しましょう。
(中略) data_bag_path './data_bags' encrypted_data_bag_secret '/path/to/data_bag_key')
実はワタクシ、最近になって初めて encrypted_data_bag_secret
の存在をしった新米板前でございます。
手順(3)Data Bag の作成
knife data bag create --secret-file data_bag_key foo bar
以下のようにエディタが起動するので access_key
と sec_access_key
にアクセスキーとシークレットアクセスキーを記述します。
{ "id": "bar", "access_key": "AKxxxxxxxxxxxxxxxxxxxx", "sec_access_key": "zzzzzzzzzzzzzzzzzzzzzzz" }
尚、上記 JSON のキー部分は id 以外は任意の名前で指定が可能です。この id
とキーが後々レシピから指定する重要な要素になります。
エディタを保存して閉じると以下のように出力されます。
Created data_bag[foo] Created data_bag_item[bar]
data_bag と data_bag_item が作成されました。
内容を確認してみます。
{ "id": "bar", "access_key": { "encrypted_data": "t7ziGTFo0Vm8V0LbkDDI3a9zFsWpgOXRpqMngDDSKp6CVu4/Pi/yqq7CnlSRn96r6n", "iv": "BFYJpgzX3p0wdk1YulZxVw==n", "version": 1, "cipher": "aes-256-cbc" }, "sec_access_key": { "encrypted_data": "p2WfkB7uQn4GdXFk1YMbtBWOlC1AHtPGJxaqAk5vDIG7EJcyEciXPE/Kdk6MnYWJYn", "iv": "ScYPBlBP0lHZM3Y6A940hA==n", "version": 1, "cipher": "aes-256-cbc" } }
上記のように肝心な部分は暗号化されています。
手順(4)レシピを書く
以下のような template リソースのレシピをご用意致しました。(お料理番組風)
credentials = Chef::EncryptedDataBagItem.load('foo', 'bar') template "/path/to/file" do source "secret_file.erb" mode '00644' owner 'root' group 'root' variables({ :key => credentials['access_key'], :secret_key => credentials['sec_access_key'] }) end
尚、file.erb は以下のような内容です。
aws_key_id <%= @key %> aws_sec_key <%= @secret_key %>
あとは --why-run
で毒味するなりしてノードに対して収束をかけましょう。
デモは…ナシです。
すんません。
ということで…
今更感が否めないですが、Encrypted Data Bag を使うことでおおっぴらに出来ない情報もコードで管理することが出来ますね。(今まで使っていなくてすいませんでした!)
Ansible の場合ってどうするんだろう…。
元記事はこちらです。
「やむを得ず AWS の Credential な情報を Chef で管理する場合のメモ 」