今回も長くなりそうですが、頑張っていきましょう。
前回、初期化した仮想環境を立ち上げましょう。

$ vagrant up

目標を確認

最初に設定した目標を確認します。

  • rootパスワードの変更
  • SSH接続の設定変更
  • sudoの設定
  • 一般ユーザーの追加
  • システムのアップデート
  • iptablesの設定
  • WEBサーバーの設定
  • WEBページの設定
  • マルチドメインの設定
  • PHPの設定
  • MySQLの設定
  • Postfix/Dovecot/Postfix Adminの設定

userを作成する

ユーザー関係のrecipeを作りたいと思います。
この辺りは、まとめてできそうですね。

  • rootパスワードの変更
  • 一般ユーザーの追加

rootパスワードの変更

usersというCookbookを作成します。

$ cd ~/vagrantdir/sakuravps/chef-repo
$ knife cookbook create users -o site-cookbooks

rootユーザーのパスワードを変更してみましょう。

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/users/recipes/default.rb

user "root" do
    password "XXXXXXXX"
    action :modify
end

XXXXXXXXの部分にパスワードを入れていけば良いはずですが、このままでは、上手くいきません
パスワードをハッシュ化しないとエラーになります。
コマンドラインで、パスワードを作成します。

$ openssl passwd -1 "rootmodify"
$1$11R8tu9P$Mf5AcbOH7Yt.d6eCLWWvc1

ハッシュ化したパスワードをrecipeに書きます。

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/users/recipes/default.rb

user "root" do
    password "$1$11R8tu9P$Mf5AcbOH7Yt.d6eCLWWvc1"
    action :modify
end

一般ユーザーの追加

ユーザーの追加は、複数のrecipeに使われることが多いので、recipeをまたがることができるdata_bagを使用すると便利です。

~/vagrantdir/sakuravps/chef-repo/data_bags

accountディレクトリを追加し、jsonファイルを追加します。
idは要素は、データを見つけるために必須です。

パスワードは、先ほどのように、コマンドラインでを作成します。

~/vagrantdir/sakuravps/chef-repo/data_bags/account/webmaster.json

{
    "id":"webmaster",
    "name":"morisan",
    "password":"$1$FslkrtFw$mfktxyPf7YGFR9jD0CIH70",
    "group":"apache"
}

今回は一つだけですが、ファイルを増やすだけで、ユーザー追加できるように、配列で処理します。
data_bagを使うと、その中のディレクトリのファイルを読み込むことができます。

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/users/recipes/default.rb

users = data_bag("account")
users.each do |id|
u = data_bag_item("account",id)
    user u["name"] do
        password u["password"]
        home "/home/#{u["name"]}"
        supports :manage_home => true
        action :create
    end
    group u["group"] do
        members u["name"]
        action :create
    end
end

wheelというグループをsudo(root権限でコマンドが実行できる)にしようと考えているので、webmasterをwheelに追加します。

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/users/recipes/default.rb

webmaster = data_bag_item("account","webmaster")
group "wheel" do
    members webmaster["name"]
    action :create
end

recipeをノードに追加します。
前回、追加したtestbookは、もう使わないので消します。

~/vagrantdir/sakuravps/chef-repo/nodes/sakuravps.json

"run_list": [
  "recipe[users]"
],
(略)

それでは確認してみましょう。

$ knife solo prepare sakuravps
$ knife solo cook sakuravps

と書いても良いですが、まとめて行うコマンドでも良いでしょう。

$ knife solo bootstrap sakuravps

ログインして、確認できれば、完了です。

$ ssh sakuravps
[vagrant@localhost ~]$ su morisan
Password:
[morisan@localhost vagrant]$ id
uid=901(morisan) gid=901(morisan) 所属グループ=901(morisan),10(wheel),1000(apache)
[vagrant@localhost ~]$ su -
Password:
[root@localhost ~]# id
uid=0(root) gid=0(root) groups=0(root)

SSH接続の設定

SSHのポートは、デフォルトのままにしておくと、狙われる可能性が非常に高いので、変更します。
また、の設定を行い、少しでもセキュリティを上げます。

  • SSH接続の設定変更

sshというCookbookを作成します。

$ knife cookbook create ssh -o site-cookbooks

設定ファイルのダウンロード

仮想環境にログインし、以下のファイルをダウンロードします。
ついでに、日本語の設定をしようと思うので、こちらもダウンロードします。

/etc/ssh/sshd_config
/etc/sysconfig/i18n

Vagrantを使用しているので、/vagrantにファイルをコピーすると、

~/vagrantdir/sakuravps

にファイルが同期されます。

[vagrant@localhost ~]$ sudo cp /etc/ssh/sshd_config /vagrant
[vagrant@localhost ~]$ sudo cp /etc/sysconfig/i18n /vagrant

そのファイルを以下の場所に移動させ、erbという拡張子にします。

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/ssh/templates/default

設定ファイルを変更

設定ファイルを変更します。

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/ssh/templates/default/i18n.erb

LANG="ja_JP.UTF-8"

#Port 22の部分を探し、適当な数字に変更すれば良いのですが、テンプレートでは変数が使えるので、それを使用します。
また、SSHからrootログインを無効、公開鍵認証にする設定を入れます。

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/ssh/templates/default/sshd_config.erb

Port <%= node["ssh"]["port"] %>
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no

鍵の作成

ユーザー名パスワードでログインできてしまうと、不正ログインされやすくなるので、の設定をします。

鍵の作成には、WinSCPについているPuTTY Key Generatorを使用しました。
私の環境ではインストール済みだったことと、準備ができたあとWinSCPで操作するのが楽なので、こちらにしました。

WinSCP プロジェクト日本語トップページ – SourceForge.JP

PuTTYの実行

インストールが完了したら、

C:\Program Files\WinSCP\PuTTY\puttygen.exe

を実行します。

以下の画像のように設定し、Generateボタンを押します。
マウスを動かすと、ゲージが上がっていきます。

cygwin-chef-sakura3_01

以下の赤枠部分をコピーし、authorized_keys.erbというファイル名で、sshd_config.erbなど同じ場所に置きます。

cygwin-chef-sakura3_02

その後、Kye passphraseComfirm passphraseに適当なパスワードを入力し、Save private keyボタンを押して、WinSCPで使う鍵を保存します。

~/id_rsa.ppk

メニューのConversionsからExport OpenSSH Kyeを選んで、CygwinからSSHする時に使う鍵を保存しましょう。

~/id_rsa_open.ppk

という感じに保存します。

Cygwinで使う鍵のパーミッションは、以下のように変更しておきましょう。

$ chmod 600 ~/id_rsa_open.ppk

recipe

以下のようにrecipeを書きました。

ここでは、templateでファイルをアップします。
変数を使用しないファイルは、cookbook_fileでも構いません。

service "sshd" do
    supports :status => true, :restart => true, :reload => true
    action [ :enable, :start ]
end

template "sshd_config" do
    path "/etc/ssh/sshd_config"
    source "sshd_config.erb"
    mode 0600
    notifies :reload, "service[sshd]"
end

template "i18n" do
    path "/etc/sysconfig/i18n"
    source "i18n.erb"
    mode 0644
end

users = data_bag("account")
users.each do |id|
u = data_bag_item("account",id)

    directory "/home/#{u["name"]}/.ssh" do
        owner u["name"]
        group u["name"]
        recursive true
        mode 0700
        action :create
    end

    template "authorized_keys" do
        path "/home/#{u["name"]}/.ssh/authorized_keys"
        source "authorized_keys.erb"
        owner u["name"]
        group u["name"]
        mode 0600
        action :create_if_missing
    end
end

sakuravps.jsonに追加するのを、忘れないようにしましょう。
また、上記で設定した変数は、こちらで定義することができます。

~/vagrantdir/sakuravps/chef-repo/nodes/sakuravps.json

"run_list": [
  "recipe[users]",
  "recipe[ssh]"
],
"ssh":{
    "port":61234
},
(略)

これらのrecipeを反映し、ログインしてみましょう。

$ knife solo bootstrap sakuravps
(略)
$ ssh -l morisan 192.168.33.10 -p 61234 -i ~/id_rsa_open.ppk
Enter passphrase for key '/home/morisan/id_rsa_open.ppk':
[morisan@localhost ~]$

長くなったので、続きは次回!