ひょんなことからお名前.comのVPS環境に触れる機会があったので、その上でシステムを作るまでに行ったサーバー設定作業のメモを残しておきます。
システム自体は、PHPアプリが動くことを想定しています。
お名前.com用の設定を基本としていますが、その他のサーバーでも応用できるかと思います。
なお、記事が長くなってしまったので2回に分割しています。
後半は、メール設定作業
をまとめています。
サーバー周りの設定作業
・ OSを変える
デフォルトはCentOS5.3だったのですが、CentOS5.5へ(最終的にはyum updateで5.7へ)変更しました。
OSが古いというよりは、デフォルトの5.3環境の場合、お名前.comのコントロールパネルが結構権限を握っていて自由度が低かった、というのが変更理由です。
Apacheの設定ファイルも別の場所に用意されていてDocumentRootも変更できないような感じになっていましたので。
まぁその分、iptablesの設定やメール設定とかはコントロールパネルからできなくなるので、運用の手間は増えてしまいますが。
コマンドラインからガリガリと設定ファイル変更するのは苦手という場合は、デフォルトのOSのまま利用していた方がよいかと思います。
OSの変更は、コントロールパネルから行います。
※ 必要があれば、事前にちゃんとバックアップを取っておきましょう。
・ パッケージのアップデート
取り合えず、
# yum -y update
で、全パッケージをアップデート。
これによりCentOS release 5.7 (Final)へアップグレードされます。
# more /etc/redhat-release
CentOS release 5.7 (Final)
・ 必要なパッケージを追加インストール
PHPやPostgreSQLやvsftpdなど。
この辺は、サービスで利用したいパッケージを適宜インストールします。
# yum install php53.x86_64
あと、PHPでPEARを使いたいので追加インストール。
ただし、x86_64のパッケージが用意されていないみたいなんで、下記のようにnoarchのPEARをインストールした後に強制的にアップグレードしました。
# yum install php-pear.noarch
# pear upgrade --force PEAR
途中でereg系の関数を利用してエラーが出まくりますが、アップグレード自体は完了します。
# pear list
Installed packages, channel pear.php.net:
=========================================
Package Version State
Archive_Tar 1.3.8 stable
Console_Getopt 1.3.1 stable
PEAR 1.9.4 stable
Structures_Graph 1.0.4 stable
XML_RPC 1.5.0 stable
XML_Util 1.2.1 stable
・ yumのアップデート除外設定
運用開始後は、何でもかんでもパッケージをアップデートしてたらバージョンアップによってトラブルが起きたりするので、アプリに蜜に連携するパッケージを取り合えずアップデート対象外にしおきます。
exclude=kernel* php* httpd* postgresql*
・ yumの自動アップデート設定変更
とはいえ、毎回新しく出たパッケージを1つずつ確認していくのも手間なんで、関係なさそうなパッケージは自動アップデート(実際には、パッケージのダウンロードだけで適用させませんが)を設定しておきます。
まず、yum-updatesdパッケージをインストール。
# yum-updatesd.noarch
次に、設定ファイルを編集します。
# yum updateの実行間隔(秒)
run_interval = 86400
updaterefresh = 6000
# アップデートがあった場合の通知方法(E-Mail)
emit_via = email
email_to=webmaster@example.jp
email_from=yum-updatesd@localhost
smtp_server=localhost:25
# 更新があった場合、関連するパッケージも含めてダウンロード(ただし勝手にアップデートしない)
do_update = no
do_download = yes
do_download_deps = yes
最後に、yum-updatesdのデーモンを起動。
# /etc/init.d/yum-updatesd start
・ logrotate.conf設定変更
デフォルトだと4週分しかログが保存されないので変更(24週分保存へ)
rotate 24
あと、/var/log以下でほっとくと大容量になってしまうログファイルを幾つかローテーションの対象へ追加。
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron /var/log/btmp /var/log/lastlog /var/log/wtmp {
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
・ SSH設定変更
お名前.comの場合、デフォルトの状態で作業用ユーザー(vpsXXXXXXXX)が作られてたりしますが、ユーザー名が覚えにくいので、別のユーザーを追加しそのユーザーSSH接続できるようにします。
# useradd -m -d /home/hogeuser -s /bin/bash hogeuser
# passwd hogeuser
続いて、セキュリティを考慮してSSHできるユーザーを限定し、利用するポートを変更しておきます。
(ポートを変えるだけで単調なアタックをかなり防げたりもします)
Port 10022
AllowUsers vpsusername hogeuser
※ iptablesの設定が済んでいないので、この時点でSSHDを再起動するとサーバーへ接続できなくなります。
より、サーバーをセキュアにするなら公開鍵認証方式
を取るのもよいかもしれません。
・ FTP設定変更
標準のCentOS5.3だとProFTPDを利用しているのですが、個人的な好みでvsfptdを利用します。
OSユーザーを使うのではなく、バーチャルユーザーを使ってFTP接続させるように設定を変更します。
設定方法は、以前に書いた「OS上にいないバーチャルユーザーを使ってFTP接続する
」を参照。
なお、FTP接続はパッシブモードで30000番から31999番ポートまでを利用しています。
設定方法は、「FTPのアクティブモードとパッシブモード + vsftpdでの設定方法
」を参照。
・ iptables設定
お名前.comの場合、CentOS5.5へ変更してもデフォルトで幾つかファイアーウォールの設定が既にされていたりもするんですが、SSHのポートを変えたり、FTP用のポート(30000 ~ 31999番ポート)を開放をしておきます。
あと、後述するメール設定のためにサブミッション・ポート(587)も許可しています。
# iptables -A INPUT -m state --state NEW -m multiport -p tcp --dports 20,21 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m multiport -p tcp --dports 30000:31999 -j ACCEPT
# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 10022 -j ACCEPTiptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPTiptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 587 -j ACCEPT
設定が終わったら確認し、不要なポートを削除しておきます。
# iptables -L --line-number
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere
2 REJECT all -- anywhere 127.0.0.0/8 reject-with icmp-port-unreachable
3 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
5 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:smtp
6 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:http
7 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:pop3
8 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:https
9 ACCEPT tcp -- anywhere anywhere state NEW multiport dports ftp-data,ftp
10 ACCEPT tcp -- anywhere anywhere state NEW multiport dports 30000:31999
11 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:10022
12 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:http
13 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:https
14 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:submission
Chain FORWARD (policy DROP)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere
今回、SSHのポートを変更していますので22番ポートを削除しておきます。
iptablesのフィルタ削除は、下記のように左端に表示される番号を指定して削除できます。
# iptables -D INPUT 4
設定が完了したら、iptablesの設定を保存しておきます。
# service iptables save
念のために、iptablesのデーモンを再起動してフィルタが正しいかと、別の端末からSSHやFTPでサーバーへ接続可能かを確認しておきます。
接続できない場合、SSHDやvsftpdの設定かiptablesの設定に誤りがある可能性があります。
全ての端末を閉じてしまうと、二度とサーバーへ接続できないという自体にもなりかねないので注意が必要です。(実際、やってしまいましたし・・・)
・ デーモンの自動起動
追加でインストールしたパッケージや必要なデーモンを自動起動するように設定しておきます。
# chkconfig --level 3 vsftpd on
# chkconfig --level 3 httpd on
# chkconfig --level 3 rsyslog on
・ 不要なデーモンの停止
さっきとは逆に、不要なデーモンが起動しないように停止しておきます。
# chkconfig mcstrans off
# chkconfig lvm2-monitor off
# chkconfig netfs off
# chkconfig rawdevices off
# chkconfig iscsi off
# chkconfig iscsid off
この辺は、環境によって異なると思いますので、chkconfig --listで結果を見て不要なものを適宜停止していきます。
余談にはなりますけど、iscsiとiscsidデーモンを起動していたら/var/log/brcm-iscsi.logに毎秒ごとに下記のようなエラーが吐き出されてかなり大きなファイルとなっていました。
ERR [Sun Nov 20 22:17:08 2011]NIC_NL waiting binding to NETLINK_ISCSI socket
ERR [Sun Nov 20 22:17:09 2011]NIC_NL waiting binding to NETLINK_ISCSI socket
実害は無いと思ってたんですが、上記のような理由から停止しました。
・ sysstatの設定
サーバーに異常があったときにその際の状況を確認したいという場合がありますので、sarコマンドでCPUの統計を取れるようにしておきます。
# yum install sysstat.x86_64
デフォルトだと10分ごとに統計が取られますが、もう少し間隔を短くしたいのでCronで定期実行されている設定を変更します。
# run system activity accounting tool every 5 minutes
*/5 * * * * root /usr/lib64/sa/sa1 1 1
# generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A
コマンドの使い方などについては「サーバー管理で知っておきたいコマンドあれこれ。 - sysstat編 -
」を参照。
・ logwatchの設定
サーバー上には大量のログが出力されますが、それを1つずつ確認するのはかなり手間になります。
なので、Logwatchを使って問題のありそうなログのレポートを送ってもらうようにします。
# yum install logwatch.noarch
次に、レポートの詳細やメールの送信先を設定します。
MailTo = webmaster@example.jp
Detail = Med
ログの見方などは、「Logwatchでサーバー上のログを集約する
」を参照。