ConoHaのVPSの初期設定をChef Soloでやってみた

普段はさくらのVPSに普通に手でソフトウェアをインストールしてWebアプリを動かしていたんだけど、 さすがにそろそろサーバーの状態管理を自動化したくなったのと、単純に面白そうなのでChefによるサーバー管理に挑戦することにした。
それで、気軽に壊して遊ぶ用に新たにConoHaのVPSを借りて、Chef Soloで設定してみた。

目標

以下の作業を全てChefで行う

  • 一般ユーザーの作成
  • 鍵認証の設定
  • sudo有効化
  • sshとiptablesの設定

下準備

knife solo init

まずサーバー上ではなくローカルで作業する。
knife solo initでchef soloのリポジトリを作る。

$ gem install knife-solo
$ knife solo init conoha-bootstrap-cookbooks
$ cd conoha-bootstrap-cookbooks

knife solo prepare

ConoHaは最初rootでsshできないようになっているが、それだとknife solo prepareできない。
ConoHaの共通サーバにsshした後rootでログインし、rootの~/.ssh/authorized_keysをいじって、共通サーバを経由せずssh root@conohaできるようにしておく。

その後、以下のコマンドでサーバーにChefをインストールする。

$ knife solo prepare root@conoha
Bootstrapping Chef...
...
Downloading Chef 11.16.0 for el...
Installing Chef 11.16.0
installing with rpm...
...
Thank you for installing Chef!
Generating node config 'nodes/conoha.json'...

一般ユーザーの作成、鍵認証の設定とsudo有効化

cookbookの作成

$ knife cookbook create site_user -o site-cookbooks

site_userというcookbookを作成した。
site-cookbooks/site_user/recipes/default.rb にレシピを書いて設定していく。

cookbookのrun_listへの追加

run_listに追加しないとcookbookは実行されない。

// nodes/conoha.json
{
  "run_list": [
    "recipe[site_user]"
  ]
}

templateの追加

site-cookbooks/site_user/templates/defaultにerbをいれて設定を変更する。

$ scp conoha:/etc/sudoers ./site-cookbooks/site_user/templates/default/sudoers.erb
  • sudoers.erb 修正
    • wheelをsudo可能に

recipeの修正

# site-cookbooks/site_user/recipes/default.rb

user_name = "k0kubun"
home_dir  = "/home/#{user_name}"
ssh_key   = "ssh-rsa AAAAB3Nza..."

# ユーザーと ~/ の作成
user user_name do
  home home_dir
  password "kogaidan"
  action :create
end

# ~/.ssh 作成
ssh_dir = "#{home_dir}/.ssh"
directory ssh_dir do
  owner user_name
  group user_name
  mode 0700
end

# ~/.ssh/authorized_keys 作成
# user_name でssh可能になる
file "#{ssh_dir}/authorized_keys" do
  owner user_name
  content ssh_key
  mode 0600
end

# wheelにuser_nameをいれる
group "wheel" do
  action :modify
  members [user_name]
  append true
end

# sudoersを手元のsudoers.erbで置き換える
template "sudoers" do
  path "/etc/sudoers"
  source "sudoers.erb"
  mode 0440
end

適用

$ knife solo cook root@conoha

これでssh k0kubun@conohaでのログインとsudoが可能になっているはず。
knife solo prepare k0kubun@conohaしておいて、次からはcookする際もk0kubun@conohaを使う。

sshとiptablesの設定

templateの追加

$ scp conoha:/etc/ssh/sshd_config ./site-cookbooks/site_user/templates/default/sshd_config.erb
$ scp conoha:/etc/sysconfig/iptables ./site-cookbooks/site_user/templates/default/iptables.erb

sshの設定

  • sshd_config.erb 修正
    • rootログイン無効化
    • パスワードログイン無効化
    • ssh用ポートを22番から変更

iptablesの設定

  • iptables.erb 修正
    • ssh用に開いている22番を別のポートに変更
    • HTTP 80番のポートを開ける
    • HTTPS 443番のポートを開ける

recipeの修正

以下を追加する。

# site-cookbooks/site_user/recipes/default.rb

# ...

# sshd_configを手元のsshd_config.erbで置き換える
template "sshd_config" do
  path "/etc/ssh/sshd_config"
  source "sshd_config.erb"
  mode 0600
end

# sshd_conig の反映のためにsshd再起動
service "sshd" do
  action :restart
end

# iptablesを手元のiptables.erbで置き換える
template "iptables" do
  path "/etc/sysconfig/iptables"
  source "iptables.erb"
  mode 0600
end

# iptables の反映のためにiptables再起動
service "iptables" do
  action :restart
end

適用

$ knife solo cook k0kubun@conoha

これで最低限のセキュリティ対策はできたと思う。

まとめ

Chef soloを用いてサードパーティのcookbookを使わないでサーバーの初期設定を行った。
慣れてきたり不便を感じたらBerkshelfのcookbookを使っていきたい。