ども、cloudpackかっぱ (@inokara) です。

はじめに

やむを得ない理由で AWS のアクセスキーやシークレットアクセスキーを Chef で扱わないといけない時には…迷わず Encrypted Data Bag を使いましょう。ということで、Encrypted Data Bag を使って Credential な情報を扱う際のメモです。

参考

使い方

動作環境は…

  • 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_keysec_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 で管理する場合のメモ