VPSの初期設定とCentOSによるWebサーバー構築からセキュリティ設定までの一連の流れまとめ

何度やっても手順を忘れてしまい、毎回一から調べる時間が無駄なので、手順を一つずつメモとして残しておきます。
上から順番に実行していけば、基本は大丈夫と思います。
ちなみに今回使用しているのは、CentOS 6.2 です。

yum update

サーバーに入ってるアプリケーションを全パッケージをすべて最新版にアップデートする。
※結構時間がかかる。30分くらいかな。

# yum -y update

CentOSの日本語化

# vim /etc/sysconfig/i18n

を実行すると、言語設定ファイルが開かれる
※もし実行して「-bash: vim: command not found」というエラーがでたら、vimエディタがインストールされていないので、
「# yum -y install vim-enhanced」を実行してインストールする。

LANG="C"
もしくは
LANG="en_US.UTF-8"

となっているのを、iキーを押して編集モードにして、

LANG="ja_JP.UTF-8"

に変更する。[Esc]キーを押して編集モードを終了させてから

:wq

と入力し、[Enter]キーを押して保存する。

作業用ユーザーの作成と設定

今後作業をするにあたって、そのままrootでログインして作業をおこなうと、セキュリティ的によろしくないので、別途作業用ユーザーを作成する。仮にここでは、vpstester というユーザー名で作成してみる。
※もちろん実際に作るときは、ユーザー名やパスワードは特定されにくいもっといい感じのものにしてください。

# useradd vpstester
# passwd vpstester

「Changing password for user vpstester. New password:」と表示されるので、任意のパスワード入力する。
文字は表示されず、カーソルも移動しないが気にせずそのまま入力し、[Enter]キーを押す。
すると、「Retype new password」というメッセージが表示されるので、再度確認のパスワードを入力し、[Enter]キーを押す。
「passwd: all authentication tokens updated successfully.」というメッセージが表示されれば、ユーザーの追加が完了。

次に、追加した作業用ユーザーに、usermod -G wheelコマンドでルート権限グループに追加する。

# usermod -G wheel vpstester

そしてさらに、wheelグループに属するユーザにsudoコマンドの実行を許可するように設定する。

# visudo

で、viエディタが立ち上がるので、

## Allows people in group wheel to run all commands
# %wheel ALL=(ALL) ALL

上記の記述箇所をさがして、二行めの # %wheel の箇所の#を消して、先ほどと同じように:wqで保存する。

リモートからの root ログインを無効にする

su コマンドで、wheel グループのみ root になれるように設定する。

# vim /etc/login.defs

エディタが開かれるので、以下の文言を一番下に追記して:wq と入力し、[Enter]キーを押して保存する。

SU_WHEEL_ONLY yes

次に、suコマンドをグループ内のユーザーだけが使用できるように設定する。

# vim /etc/pam.d/su

エディタ画面が開かれるので、以下の場所を探す

#auth required pam_wheel.so use_uid 

#を[x]キーで削除し、先ほどと同じように:wq と入力し、[Enter]キーを押して保存する。

次に、root での ssh ログインを禁止するように設定する。

# vim /etc/ssh/sshd_config

エディタが開かれるので、以下の文言をそれぞれ探す。

#PermitRootLogin yes
↓
PermitRootLogin no

#PermitEmptyPasswords no
↓
PermitEmptyPasswords no

修正したら、:wq と入力し、[Enter]キーを押して保存する。
以上で、作業用ユーザーの追加が完了したので、一旦ログアウトして追加したユーザーでログインできるか確認してみる。

鍵認証の設定

生のパスワードでの認証だとセキュリティ的に甘いので、公開鍵暗号方式による SSH ログインにさせるように設定する。

キーペアの作成

root 権限を持っている先ほど作った作業用ユーザー(ここでは、vpstester)で SSHログインする。
su コマンドで一旦 root ユーザーに切り替える。

# su-

再び、以下のコマンドで作業用ユーザーに戻す。

# su vpstester

以下のコマンドでキーペアを作成する。
比較的強度の高いRSA方式でキーペアを作成する。

# ssh-keygen -t rsa

すると、以下のようにパスワードの設定を求められるので、任意の文字列を入力する。

Generating public/private rsa key pair.
Enter file in which to save the key (/home/vpstester/.ssh/id_rsa): ←[Enter]キー
Enter passphrase (empty for no passphrase): ←パスフレーズを入力
Enter same passphrase again: ←同じパスフレーズを入力
Your identification has been saved in /home/vpstester/.ssh/id_rsa.
Your public key has been saved in /home/vpstester/.ssh/id_rsa.pub.
The key fingerprint is:

これで、/home/vpstester/.ssh の下に、秘密鍵(id_rsa)、公開鍵(id_rsa.pub)が作成される。
下記コマンドを実行し、公開鍵を配置して、パーミッションも 600 に設定する。

# mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
# chmod 600 ~/.ssh/authorized_keys

秘密鍵でのログイン設定

キーペアを作成したので、秘密鍵をつかってログインできるように設定する。

# sudo vim /etc/ssh/sshd_config

以下の文章を探す。

#PubkeyAuthentication yes

#を[x]キーで削除して、:wqを入力して[Enter]キーを押して保存する。

以下のコマンドで SSH を再起動する。

# sudo /etc/init.d/sshd restart

/home/vpstester/.sshに作られている秘密鍵(id_rsa)は、FTPツールなどで、ローカルPCに落としておく。
この秘密鍵を使って、今後はSSHにログインしていくので、誰でも見れる場所でなく、安全な箇所に置いておこう。

秘密鍵を使用してログイン、確認後秘密鍵のみでのログインに制限する

Tera Term を起動して、秘密鍵をつかってログインできるか確認する。
※Tera Termについては割愛。設定が簡単なのでわかるはず。

秘密鍵を使用してログインできることが確認できたら、秘密鍵を使用してのログインに制限設定する。

# sudo vim /etc/ssh/sshd_config

エディタが開かれるので、以下の文章を探す。

#PasswordAuthentication yes

これを以下のように#を削除してyesをnoに修正する

PasswordAuthentication no

:wqを入力して[Enter]キーを押して保存する。
SSH を再起動する。

# sudo /etc/init.d/sshd restart

これで、パスワードのみのログインはできなくなっているはずなので、秘密鍵がないとログインできないか確認する。

SSHのポート変更とファイアーフォールの設定

ポート番号の変更

# sudo vi /etc/ssh/sshd_config

開かれた画面から#Port 22 を探して任意(1024~65535)の番号に変更する。
例えば、12345へ変更する場合は以下のようにする。

#Port 22
↓
Port 12345

保存したら、SSHを再起動する。

# sudo /etc/init.d/sshd restart

ファイアーウォールの設定

iptablesファイルを作成する。

$ sudo vim /etc/sysconfig/iptables

開かれた画面で下記のコードをコピペして、貼り付ける。
参考サイト:「さくらのVPS」導入解説 その10:iptablesの設定
※先ほど設定した任意のポート番号(ここでは12345)だけにオープンするように設定しているので、その部分は各自修正する。

*filter
:INPUT   ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT  ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
 
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# SSH, HTTP, HTTPS, MySQL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 12345 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443   -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306  -j ACCEPT
 
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
 
COMMIT

上記は最低限のサンプルなので、後ほど俺史上最強のiptablesをさらすなどを参考にするか。
Fail2banやmod_dosdetectorなどのツールを使ってセキュリティを高めていく。

保存したら、iptablesを再起動する。

$ sudo /etc/rc.d/init.d/iptables restart

※サーバーの使い方によって、日本国内からのアクセスに限定するなら、別記事の「VPSサーバーで海外からの不正アクセスを全て遮断する」を参考にして追加設定する。

ログ監視の設定

ログ監視ツール logwatch をインストールすると、毎日のログを整形して root にメールを送ってくれる。
今後安全に運用するには早期発見が重要なのでログ監視はやっておこう。

root アカウントにメールアドレス設定

ログを送ってくれる先のrootメールアドレスを設定する。

$ sudo vim /etc/aliases

開かれたエディタで、以下のような箇所を探す。たぶん一番下。

# Person who should get root's mail
#root:      marc

ここに以下のような感じで送信先のメールアドレスを追加する。

# Person who should get root's mail
#root:      marc
root: test@example.com

追記したら、保存して以下のコマンドで設定を更新する。

$ sudo newaliases

これで、rootのメールアドレス設定ができたはずなので、テストで送信してみる。

$ echo test|mail root

無事にメールが送られてきたら成功。
もし、「-bash: mail: コマンドが見つかりません」というエラーがでたら、mailパッケージがインストールされていないので、別記事「CentOSで「-bash: mail: コマンドが見つかりません」と表示されたときの解決方法」を参照してインストールする。

logwatch をインストールする

下記コマンドを実行する。

$ sudo yum -y install logwatch

下記コマンドを実行して正しく動作しているか確認する。

$ sudo /usr/sbin/logwatch --print

ウィルス対策ソフトを導入する

保険的な対策として検討してください。
定期チェックはサーバー負荷がかかるので、そこらへんも踏まえてから導入を検討したほうがいい。

インストール手順は別記事「オープンソースのウィルス対策ソフトである Clam AntiVirus をCentOSにインストールする」を参照する。

rootkit 検知ツールを導入する

Rootkit検知ツール「chkrootkit」を導入する。
Rootkit は、ファイルやプロセス、レジストリキー、ネットワーク接続を隠してしまうステルスプログラムで、Rootkitに感染してしまうと他のマルウェアの検出や駆除がより困難になってしまう厄介なもの。そのrootkitがLinuxサーバーにインストールされてしまっていないかを検出してくれるツール 「chkrootkit」 の導入はまさにサーバー構築初期段階でやっておくべきもの。

インストール手順は別記事「Rootkit検知ツール「chkrootkit」を導入してみた」を参照する。

改ざん監視ソフトを導入する

不正アクセスからのファイル改ざんは絶対に阻止しなければならないので、オープンソースの侵入検知システム「AIDE」を導入する。

インストール手順は別記事「オープンソースのファイル改竄検知ツールをCentOSにインストールする」を参照する。

WEBサーバーの設定

Apacheをインストールする

以下のyumコマンドでインストールする。

$ yum -y install httpd

VPSが常に自動で起動するように設定する。

$ chkconfig httpd on

次に、httpd.confファイルを修正してセキュリテイを強化する。
先に設定ファイルのバックアップを予めとっておく。

$ cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org

httpd.conf ファイルを開いて修正する。

$ vim /etc/httpd/conf/httpd.conf

下記の部分を探して、それぞれ例のように修正する

ServerTokens OS
 ↓
# レスポンスヘッダにVersion等を表示しない
ServerTokens Prod
ServerSignature On
 ↓
# エラーページにApacheの情報を付けない
ServerSignature Off
Options Indexes FollowSymLinks
 ↓
# ディレクトリリスティングを禁止する
Options -Indexes FollowSymLinks

Options Indexes MultiViews FollowSymLinks
 ↓
# ディレクトリリスティングを禁止する
Options -Indexes MultiViews FollowSymLinks

修正したら保存して、下記コマンドで構文チェックする。

$ service httpd configtest
Syntax OK

と出れば成功なので、以下のコマンドでApacheを起動する。

$ service httpd start

起動後、次のコマンドで以下のようになればOK。

$ chkconfig --list httpd
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

PHPをインストールする

$ yum -y install php php-mbstring php-mysql php-gd

インストールが完了したら、以下のコマンドでバージョンを確認してみる。

$ php -v

php.ini ファイルの設定を修正する前にバックアップをとっておく。

$ cp /etc/php.ini /etc/php.ini.org

php.ini ファイルを開く

$ vim /etc/php.ini

エディタで開いたら、以下のようにそれぞれを変更する。

;error_log = php_erros.log
 ↓
error_log = /var/log/php_errors.log
;mbstring.language = Japanese
 ↓
mbstring.language = Japanese
;mbstring.internal_encoding = EUC-JP
 ↓
mbstring.internal_encoding = UTF-8
;mbstring.http_input = auto
 ↓
mbstring.http_input = auto
;mbstring.detect_order = auto
 ↓
mbstring.detect_order = auto
expose_php = on
 ↓
expose_php = off
;date.timezone = 
 ↓
date.timezone = Asia/Tokyo

修正したら、保存して以下のコマンドでhttpdを再起動して設定を反映させる。

$ service httpd restart

Mysqlをインストールする

$ yum -y install mysql-server

Mysqlがインストールできているか以下のコマンドで確認。

$ rpm -qa mysql-server

my.cnf ファイルを修正する前にバックアップをとっておく。

$ cp /etc/my.cnf /etc/my.cnf.org

my.cof ファイルを開く

$ vim  /etc/my.cnf 

以下のように修正する。普通はハイライト部分を追記。

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
default-character-set=utf8
skip-character-set-client-handshake
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

修正したら、保存して以下のコマンドで設定を反映させる。

$ /etc/rc.d/init.d/mysqld restart

次に以下のコマンドを実行し、基本設定をおこなう。

$ mysql_secure_installation

基本的にはパスワードを設定してあとはYesを選択すればよい。
長いので割愛しているが、以下のように感じで設定する。

Enter current password for root (enter for none):  ←何も入力せずにエンターキー
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] y   ← rootパスワードの設定。「Y」を入力してエンターキー
New password: ←パスワードを入力する。画面にはなにも表示されないがそのまま入力する
Re-enter new password: ←再確認のパスワードをもう一度入力する
Password updated successfully!
Reloading privilege tables..
 ... Success!

Remove anonymous users? [Y/n] y ← 匿名ユーザを削除するかどうか。「Y」を入力してエンターキー
 ... Success!

Disallow root login remotely? [Y/n] y ←リモートからrootログインできないようにする。「Y」を入力してエンターキー
 ... Success!

Remove test database and access to it? [Y/n] y ←テスト用のデータベースの削除。「Y」を入力してエンターキー
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reload privilege tables now? [Y/n] y ←再読み込みして設定を有効にするかの確認。「Y」を入力してエンターキー
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!

実際にrootでmysqlにログインできるか試してみる。

$ mysql -u root -p
Enter password:      ← 先ほど設定したパスワードを入力してエンターキー。
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.1.73 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

こんな感じで表示されれば成功。Quitで閉じる。
最後にMySQLを自動起動するように設定する。

$ chkconfig mysqld on

CGI が動作するように設定する

httpd.conf ファイルを開いて修正する。

$ vim /etc/httpd/conf/httpd.conf

先ほど変更した下記の部分を、さらに以下のように修正する

Options -Indexes FollowSymLinks
 ↓
Options -Indexes ExecCGI FollowSymLinks

デフォルトで.htaccess が使えない場合があるので、有効化する。

AllowOverride None
 ↓
AllowOverride All

CGIスクリプトに関連付けるファイルも有効化する。

#AddHandler cgi-script .cgi
 ↓
AddHandler cgi-script .cgi .pl

修正したら保存して、下記コマンドで構文チェックする。

$ service httpd configtest
Syntax OK

と出れば成功なので、以下のコマンドでApacheを再起動する。

$ service httpd restart

Perl コアモジュールのインストール

VPSのデフォルトでは、コアモジュール一式が入っていない場合もあるので、インストールしておく。
とくにMovableTypeなどはPerlモジュールがないと動作しないので必要。

$ yum install perl-core

Web公開フォルダの所有権を作業用ユーザーに変更する

結構忘れがちで、この所有権をrootのままにしていてFTPでアップロードできないってパターンにハマることがよくあったので忘れずに変更します。

今回は、公開フォルダが /var/www/html で、作業用ユーザーが vpstester の場合は以下のコマンドで所有権をrootから変更しておきます。

$ chown -hR vpstester:root /var/www/html

以上で、終了です。
お疲れ様でした。