読者です 読者をやめる 読者になる 読者になる

set setting reset

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

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

chef

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 がうまくリモートに転送できなかった。