set setting reset

インフラ関連の小ネタと備忘録

encrypted data bag を使ってユーザ作成

encrypted data bag を使ってユーザ作成

chef がんばりたい。
encrypted data bag にユーザ情報を暗号化して格納、そして knife solo するまで。

knife data bags インストール

gem install knife-solo_data_bag

暗号化用の鍵作成

openssl rand -base64 512 | tr -d '\r\n' > data_bag_key

knife の設定

data_bag_path               './data_bags'
encrypted_data_bag_secret   './data_bag_key'
cookbook_path               ["./cookbooks", "./site-cookbooks"]

EDITOR環境変数の設定

export EDITOR=vim

data bag 作成

knife solo data bag create BAG [ITEM] --secret-file ./data_bag_key

すると EDITOR に設定されたエディタが開く。また、この時に --secret-file を指定しないと暗号化されなかった。

暗号化パスワードの作成

data bag 内にパスワードを格納する際には、パスワードそのものも暗号化されている必要がある。

openssl passwd  -1 password

データの作成

初期状態では id のみが格納されている。 password には上記のパスワードをコピペ。

{
   "id": "[ITEM]",
   "user": "hoge",
   "password": "password"
}

暗号化されているか確認

cat data_bags/BAG/[ITEM].json
{
  "id": "[ITEM]",
  "name": {
    "encrypted_data": "暗号化データ",
    "iv": "暗号化データ",
    "version": 1,
    "cipher": "aes-256-cbc"
  },
  "password": {
    "encrypted_data": "暗号化データ",
    "iv": "暗号化データ",
    "version": 1,
    "cipher": "aes-256-cbc"
  }

復号化して確認

knife solo data bag show BAG [ITEM] --secret-file ./data_bag_key

編集

knife solo data bag edit BAG [ITEM] --secret-file ./data_bag_key

recipe に適用

site-cookbooks/useradd/recipes/[ITEM].rb

user = Chef::EncryptedDataBagItem.load("BAG", '[ITEM]')
user_name = user['name']
passwd = user['password']
home = "/home/#{user_name}"

user user_name do
    home home
    shell "/bin/bash"
    supports :manage_home => true
    password passwd # password を関数内の頭に記載するとパスワードが設定されない場合があった
    action :create
end

group user_name do
    members user_name
    append true
    action :create
end

bash 'sudoers' do
    user 'root'
    code <<-EOS
  echo "#{user_name} ALL=(ALL) ALL" > /etc/sudoers.d/#{user_name}
  EOS
end

role から呼び出す

roles/[ITEM].rb

run_list(
 "recipe[useradd::[ITEM]]",
)

node を書く

nodes/[ITEM].rb

{
  "run_list": [
    "role[ITEM]"
  ],
  "override_attributes": {
      "node": {
        "hostname": "[ITEM]"
    }
  }
}

cook

knife solo cook [ITEM] <i>host</i>

ちょっとハマった

  • knife configure がちゃんとできていない時、knife.rb を直接指定しないと data_bag_key がうまくリモートに転送できなかった。