何度やっても手順を忘れてしまい、毎回一から調べる時間が無駄なので、手順を一つずつメモとして残しておきます。
上から順番に実行していけば、基本は大丈夫と思います。
ちなみに今回使用しているのは、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
以上で、終了です。
お疲れ様でした。