vpsに適当にsshでつなげる事が確認できたら、userとかsshとかportの初期設定をします。

ついでに初期状態で必要なパッケージやライブラリ(gitなど)もここでインストールしちゃいます⏩

itamaeのジェネレーター機能を使ってテンプレートを生成。

$ itamae g initialize

あと環境毎に変わる値はnode.ymlに記述します。

$ touch node.yml

そしたらこんな具合のファイル構成になると思います。

├── cookbooks
│   └── initialize
│       ├── default.rb
│       ├── files
│       │   └── .keep
│       └── templates
│           └── .keep
└── node.yml

今後もこんな感じで最初に必要なファイルをジェネレートし、可変するデータに関してはnode.ymlに追加していきたいと思います。

#

というわけで、ひとまず完成したのをざっと書いてみる。

ファイルの最終的な構成はこんな感じ。.keepしかないディレクトリは除外してあります。

├── cookbooks
│   └── initialize
│       ├── default.rb
│       └── templates
│           └── iptables
└── node.yml

で、default.rbの中身がこんな具合。

package 'git'
package 'curl'
package 'wget'
package 'openssh-clients'

USER_NAME = node[:user][:name]
PASSWORD = node[:user][:password]
WHEEL_ID = "10"

user USER_NAME do
  password PASSWORD
end

user USER_NAME do
  gid WHEEL_ID
end

remote_file '/etc/sudoers.d/user' do
  source "./files/user"
end

directory "/home/#{USER_NAME}/.ssh" do
  owner USER_NAME
  group USER_NAME
  mode "700"
end

file "/home/#{USER_NAME}/.ssh/authorized_keys" do
  content node["ssh"]["key"]
  owner USER_NAME
  group USER_NAME
  mode "600"
end

file "sshd_config" do
  path "/etc/ssh/sshd_config"
  action :edit
  block do |content|
    content.gsub!(/^.?Port .+$/, "Port #{node["ssh"]["port"]}")
    content.gsub!(/^.?PermitRootLogin .+$/, "PermitRootLogin no")
    content.gsub!(/^PasswordAuthentication .+$/, "PasswordAuthentication no")
    content.gsub!(/^UsePAM .+$/, "UsePAM no")
  end
end

service "sshd" do
  subscribes :restart, "file[sshd_config]"
end

remote_file 'iptables' do
  path "/etc/sysconfig/iptables"
  source "./files/iptables"
  mode "600"
end

service "iptables" do
  subscribes :restart, "remote_file[iptables]"
end

service 'iptables' do
  action [:enable, :start, :restart]
end

で、node.ymlはこんな具合。

user:
  name: "rails"
  password: "$6$salt$IxDD3jeSOb5eB1CX5LBsqZFVkJdido3OUILO5Ifz5iwMuTS4XMS130MTSuDDl3aCI6WouIL9AjRbLCelDCy.g."

では、細かい部分を数週間前の自分のために書いておく。curlとかgitのパッケージはただインストールしただけなので、説明は省きます。

ユーザーの作成

ユーザーの作成は、

USER_NAME = node[:user][:name]
PASSWORD = node[:user][:password]

user USER_NAME do
  password PASSWORD
end

一見シンプルなんだけど、userを作るときのpasswordはcryptで暗号化されたものでないとダメ。なので、

$ gem i unix-crypt

と暗号化するためのgemをインストールし、

$ mkunixcrypt -s "salt"

とコマンドを打てば対話式にパスワードを設定し、暗号化されたパスワードを生成してくれるので、それをnode.ymlの方にコピペします。

新しく作ったユーザーでsudo

新しく作ったユーザーでsudoできるようにwheelグループのidを設定し、/etc/sudoers.d/の中にwheelグループに権限を与えます。なお、このwheelグループのid10というのはCentOSというかRedHat系?だけっぽいので注意。具体的にはUbuntuはグループ名とか揃えないといけないので、この方法ができませんでした。

また、一度userを作成してから、再度グループidを設定しないといけないので、それも注意です💅

WHEEL_ID = "10"
user USER_NAME do
  gid WHEEL_ID
end

sshの公開鍵の登録とsshd_config

sshのキーペアを予め作っておき、node.ymlに公開鍵の中身を記述します。あと、sshのポートもセキュリティのために変更するので、新しいポートも書いておきます。

ssh:
  key: "ssh-rsa 長い文字列"
  port: 1234

で、sshの公開鍵の登録とsshd_configを設定します。

directory "/home/#{USER_NAME}/.ssh" do
  owner USER_NAME
  group USER_NAME
  mode "700"
end

file "/home/#{USER_NAME}/.ssh/authorized_keys" do
  content node["ssh"]["key"]
  owner USER_NAME
  group USER_NAME
  mode "600"
end

file "sshd_config" do
  path "/etc/ssh/sshd_config"
  action :edit
  block do |content|
    content.gsub!(/^.?Port .+$/, "Port #{node["ssh"]["port"]}")
    content.gsub!(/^.?PermitRootLogin .+$/, "PermitRootLogin no")
    content.gsub!(/^PasswordAuthentication .+$/, "PasswordAuthentication no")
    content.gsub!(/^UsePAM .+$/, "UsePAM no")
  end
end

service "sshd" do
  subscribes :restart, "file[sshd_config]"
end

iptablesの設定

接続できるポートを必要なものだけにするためにiptablesを設定します。

ローカルの/initialize/templatesの中にiptablesというファイルを作成し、こんな感じで書きます。ひとまず基本の80と443ポートだけ開けて、さきほど設定したsshのポートを開けただけなので、必要があれば設定を書きなおす感じでお願いします😄

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp --tcp-flags ALL NONE -j DROP
-A INPUT -p tcp ! --syn -m state --state NEW -j DROP
-A INPUT -p tcp --tcp-flags ALL ALL -j DROP
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport <%= node["ssh"]["port"] %> -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

で、このファイルを/etc/sysconfig/iptablesに置きます。

template 'iptables' do
  path "/etc/sysconfig/iptables"
  source "./templates/iptables"
  mode "600"
end

service "iptables" do
  subscribes :restart, "remote_file[iptables]"
end

次はRubyのセットアップをします。

Itamae自分メモ

  • 基本的な設定とか準備
  • 必要なライブラリとsshとかportとか
  • Ruby(rbenv+ruby-build)のセットアップ
  • Postgresqlのインストールと設定
  • nginxのインストール&セットアップ