「Webサーバーを構築しよう(2)」~初心者でもよくわかる!VPSによるWebサーバー構築講座(4)

VPS(Virtual Private Server)を使ってWebサーバーを構築し、WordPressサイトを運用できるようになるまでの連載「初心者でもよくわかる!VPSによるWebサーバー構築講座」の4回目です。

前回(第3回目)は「Webサーバーを構築しよう(1)」というタイトルで、Apacheやphpのインストールと、実際にブラウザからWebサイトが表示できることの確認をしました。

今回は、WordPressを導入するための準備として、MySQLデータベースphpMyAdminをインストールします。さらに、ファイアウォールであるiptablesの設定をします。

  1. MySQLデータベースをインストールする
  2. phpMyAdminをインストールする
  3. iptablesでファイアウォールの設定をする

 

1. MySQLデータベースをインストールする

WordPressを使うためには、WebサーバーソフトウェアのApachephpに加えて、MySQLデータベースをインストールする必要があります。
MySQLもApacheのインストールと同様、yumコマンドを使ってインストールします。

# yum install mysql-server
Total download size: 10 M
Installed size: 29 M
Is this ok [y/N]: y

インストールして良いかどうか聞かれますので、'y'キーを入力してエンターキーを押して確定させてください。

インストールが完了して、表示されるメッセージの最後が 'Complete!'となっているのを確認した後、MySQLを起動します。起動するサービスはmysqldです。

# service mysqld start

次に、MySQLにログインするためのパスワードを設定します。
パスワードの設定や、初期設定を簡単に行ってくれるmysql_secure_installationというコマンドがあるのでこれを利用します。

# mysql_secure_installation

実行すると英語のメッセージがいっぱい表示されますがおじけず進んでください。

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!


In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):

現在のMySQL rootユーザーのパスワードを入力してください」という意味の質問待ちになりますので、ここで何も入力せずエンターを押してください。
MySQLにもrootユーザーが存在します。これはOSのrootユーザーとは別のものであり、最初はパスワードに 何も設定されていません。よってここでの質問には何も入力せずエンターキーを押します。

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:

New passwordを聞かれますので、新しいMySQL rootのパスワードを設定してください。
ここはOSのrootパスワードと同じパスワードを使うのではなく、別の文字列にすることをおすすめします。
パスワードをうまく決められない場合は、第2回目の連載で紹介したパスワードジェネレータ( http://www.graviness.com/temp/pw_creator/ )が便利です。

そしてパスワードを入力すると、

Re-enter new password:

と確認のためもう一度パスワードの入力を求められますので入力してください。

その後、いくつかの質問が続きます。この先はすべて'Y'で答えておけばいいです。

By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] 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!

これでMySQLの初期設定を行えました。

次に、サーバーが再起動した時に、MySQLもあわせて起動するよう設定します。Apacheをインストールしたときと同様に、chkconfigコマンドを使います。

# chkconfig mysqld on

ここまでできたら、MySQLにログインできるかどうかを確認してみます。

# mysql -u root -p

-u root -p というオプションがついていますが、これはそのままmysqlコマンドと一緒に覚えてください。「パスワードを使ってrootユーザーでMySQLにログインする」という意味になります。

Enter password: と聞かれるので、先ほど設定したMySQL rootユーザーのパスワードを入力してください。

Enter password:

そうすると、何やらメッセージが表示されて、最後に

mysql>

と出てmysqlコマンドの入力待ちになります。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
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>

ここまで来るとうまくMySQLに接続できています。
'show databases;'と入力してみてください。'mysql>'の部分は最初から表示されていた部分なのでこれは入力しないでください。
行末の';'(セミコロン)も必要です。

mysql> show databases;

このコマンドは「データベースを一覧表示する」コマンドです。
以下のように表示されると思います。

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
+--------------------+
2 rows in set (0.00 sec)

'information_schema'と'mysql'という2つのデータベースが最初から存在することが分かります。

これで、設定したパスワードでrootでMySQLにログインできることが確認できました。
'exit' でMySQLからログアウトしてください。

mysql> exit

もし、コマンドを打ち間違えたりしてうまく終了できなくなった場合はControlキーを押しながらcキー(Ctrl-C)を押すとMySQLからログアウトできます。

 

2. phpMyAdminをインストールする

次に、MySQLデータベースをブラウザから簡単に操作できるようにするために、phpMyAdminをインストールします。
レンタルサーバーでは、phpMyAdminは最初から使えるようになっていますが、VPSでは自分でインストールする必要があります。

# yum install phpmyadmin
・・・
Total download size: 9.8 M
Installed size: 39 M
Is this ok [y/N]: y

'y'を入力しインストールを続けます。
インストール後、'Complete!'と表示されているのを確認して下さい。

次に、phpMyAdminの設定を変更します。

# cd /etc/httpd/conf.d
# cp phpMyAdmin.conf  phpMyAdmin.conf.old
# vim phpMyAdmin.conf

cd コマンドで /etc/httpd/conf.d ディレクトリに移動し、
cpコマンドでphpMyAdmin.conf をphpMyAdmin.conf.old という名前でバックアップ用のコピーを作成して、
vim コマンドでphpMyAdmin.confを編集します。

<Directory /usr/share/phpMyAdmin/>
   AddDefaultCharset UTF-8

   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
       Require ip 127.0.0.1
       Require ip ::1
     </RequireAny>
   </IfModule>
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   </IfModule>
</Directory>

25行目付近の
Allow from から始まる行を編集してください。
似たような記述が他の行にもあるので注意してください。編集するのは25行目付近です。

これはもともとこのようになっていた記述を

     Allow from 127.0.0.1
     Allow from ::1

以下のように変更します。

     #Allow from 127.0.0.1
     #Allow from ::1
    Allow from All

127.0.0.1(サーバー自身を示すIPアドレス)からのみphpMyAdminを使用できる設定になっているのですが、これらの行の先頭に#記号でコメントアウトすることで無効にして、新たにAllow from All という設定を追加します。
これで、「あなたのパソコンを含む、どこからでもphpMyAdminにアクセスできるようにする
設定に変更することになります。

ファイルを保存してvimを終了後、httpdを再起動すると設定が有効になります。

# service httpd restart

では、phpMyAdminが使えるかどうか確認してみましょう。
http://xxx.xxx.xxx.xxx/phpmyadmin (xxx.xxx.xxx.xxxはあなたのVPSのIPアドレス)
にブラウザからアクセスして、うまくログイン画面が表示できましたでしょうか?

phpMyAdminログイン画面

さきほど設定したMySQL のrootユーザー名とパスワードを使ってログインできます。
もし、この画面が出ずに'Forbidden'になる場合は、設定ファイルの記述が間違っているか、httpdを再起動していない可能性があります。もう一度設定を確認して下さい。

ここで、もう少しphpMyAdminの設定を変更して、より安全に使えるようにしましょう。phpMyAdminは便利なツールですが、たびたび脆弱性が指摘されており、外部からの悪意ある攻撃も多いです。万が一クラックされ中に入られてしまうと、大切なデータベースの中のデータが盗み見られてしまいます。

行うセキュリティ対策は以下の2つです。

対策1: URLを変更する

http://xxx.xxx.xxx.xxx/phpmyadmin というURLは他人が推測しやすく「サーバーにphpMyAdmnがインストールされている」ということを外部に知られてしまうため、URLを分かりにくくします。
例えば、
http://xxx.xxx.xxx.xxx/phpmyadminpDFp5dvM
のように意味不明な文字列をURLの最後にくっつけて、このURLでアクセスしたときのみphpmyadmのログイン画面が表示されるようにします。
第三者にはphpMyAdminをインストールしていることがばれにくくなりますので、これだけでphpMyAdminに対する攻撃はかなり減らせます。

では実際に設定変更します。
再びphpMyAdmin.confを編集します。

# cd /etc/httpd/conf.d
# vim phpMyAdmin.conf

8〜9行目の記述を以下のように変更します。

#Alias /phpMyAdmin /usr/share/phpMyAdmin
#Alias /phpmyadmin /usr/share/phpMyAdmin
Alias /phpmyadminpDFp5dvM /usr/share/phpMyAdmin

これは、
http://xxx.xxx.xxx.xxx/phpmyadmin
のようなURLでアクセスすることを禁止して、代わりに
http://xxx.xxx.xxx.xxx/phpmyadminpDFp5dvM
というURLでphpMyAdminにアクセスできるようにする設定です。

設定が終わったらhttpdを再起動します。

# service httpd restart

これで、http://xxx.xxx.xxx.xxx/phpmyadmin ではアクセスできず、
http://xxx.xxx.xxx.xxx/phpmyadminpDFp5dvM というバレにくいURLで運用することができます。

対策2: SSLを使えるようにする

phpMyAdminにログインするときに、データベースのユーザー/パスワードを入力してログインすることになりますが、通常のHTTPアクセス(http:// で始まるURL)だと、通信経路が暗号化されていないため、情報が第三者に盗み見られる可能性があります。
そこで通信経路が暗号化されるSSLをインストールして、https://〜 でアクセスできるようにし、パスワードの漏洩を防ぎます。

ApacheでSSLを使うために、mod_sslをインストールします。

# yum install mod_ssl

変更を有効にするため、httpdを再起動します。

# service httpd restart

これでSSLが有効になりました。
http://xxx.xxx.xxx.xxx/phpmyadminpDFp5dvM
ではなく、
https://xxx.xxx.xxx.xxx/phpmyadminpDFp5dvM
でアクセスしてみてください。

例えばfirefoxでアクセスした場合、以下のような警告が表示されます。
本来ならば有料で提供されているSSL証明書を購入し、信頼できるサイトであることを保証してもらった上でSSLを導入した方が良いのですが、今回は信頼できるサイトであることを保証する目的でSSLを使うのではなく、通信経路の暗号化をするためにSSLを使っています

SSL証明書を取得しなくてもSSLは使えます。今回は正規のSSL証明書を使っていませんので、このような警告は表示されてしまいますが、通信経路の暗号化を目的にしてphpMyAdminをSSLで使う分においてはこのままで問題ないでしょう。

補足
もし、この警告が気になるようでしたらSSL証明書を購入してください。
例えば格安のSSL証明書King SSL(https://www.kingssl.com/index.html)を使用する場合ですと、
以下のような設定が必要になります。Apache 2.x + mod_ssl + OpenSSL — KingSSLインストールサポートもちろん他の業者のSSL証明書を取得して使うこともできます。
あなたがお使いのサーバー環境は、Apache 2.xmod_sslOpenSSLの組み合わせになります。SSL証明書を提供するサイトにインストール手順のマニュアルがある場合、上記の条件に合致していれば、そのマニュアルの手順を読んで設定できます。

firefoxでのSSL警告画面

ブラウザが表示する警告を理解した上で接続すると、SSLでアクセスが可能になります。SSLで通信する限りにおいては、通信経路上でユーザー名/パスワードが第三者に漏れることはありませんので、phpMyAdminを使うときはhttpではなくSSL(https://)で接続するようにしましょう。

3. iptablesでファイアウォールの設定をする

次に、ファイアウォールの設定をします。Linuxではiptablesというツールを使うのが一般的です。
iptablesはすでにインストールされていますので、早速設定します。

iptablesという設定ファイルを/etc/sysconfig/の下に新しく作り、そこに設定を書いていきます。

# cd /etc/sysconfig/
# vim iptables

iptablesというファイルは存在しませんが、vim iptables とすることで、iptablesという名前のファイルを新しく作成して編集できます。

ファイアウォールは、「必要な通信は許可し、不要な通信は拒否(ブロック)する」機能です。
今回のサーバー構築で必要な通信はSSH・SFTP(ポート22)、HTTP(ポート80)、 SSL(ポート443)です。今回の連載ではそれ以外に通信する要件はありませんので、上記ポート以外の通信は拒否します。

iptables_firewall

具体的な設定内容はこちらです。設定内容が多いので、この内容をそのままコピーしてiptablesファイルに貼り付け、保存してください。

*filter
:INPUT   DROP   [0:0]
:FORWARD DROP   [0:0]
:OUTPUT  ACCEPT [0:0]
-A INPUT -i lo -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 --icmp-type echo-request -m hashlimit --hashlimit-name t_icmp --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT

-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p udp --sport 53 -j ACCEPT
-A INPUT -p udp --sport 123 --dport 123 -j ACCEPT

# accept SSH, HTTP, HTTPS
-A INPUT -p tcp -m state --syn --state NEW --dport 22 -m hashlimit --hashlimit-name t_sshd --hashlimit 1/m --hashlimit-burst 5 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -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

COMMIT

(1行が長くなって折り返されている箇所がありますが、実際には1行です)

この設定情報をよく見ると、後半部分に"--dport 22" とか "--dport 80"、"--dport 443"と書かれている箇所があります。
この部分が「ポート番号22,80,443の通信を許可する」設定になります。
もし、他にも通信を許可したいポート番号があれば、80番ポート(HTTP)の許可設定

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT

を参考にして、行を追加してください。
また、第2回目の連載で、SSHのポート番号22を別の番号に変更した方は、 22番ポートの代わりに変更後のポート番号の通信を許可する設定を行ってください。

設定できたら、iptablesを再起動してファイアウォール設定を有効にします。
もし、iptables設定を間違えてSSHの通信を許可する設定にしていないと、iptables再起動後は新規のSSH接続ができなくなり、サーバーに接続する手段が無くなってしまいますので、特にSSHの許可設定がちゃんと出来ているかよく確認の上再起動してください。

# service iptables restart

もし'FAILED'と表示された場合は、設定がどこか間違っているので、再度設定を確認してください。

再起動できたら、ファイアウォールの設定状況は以下のコマンドで確認することができます。

# iptables -nL

iptablesの設定は複雑です。他にもたくさんの機能がありますが、細かい内容について知りたい場合は以下のページを参考にしてください。

iptablesの設定方法|さくらインターネット公式サポートサイト

iptablesテンプレート集 改訂版(7):iptablesでできるDoS/DDoS対策 @IT

第4回目は以上です。第5回目(最終回)へ続きます。

第5回 WordPressをインストールしよう
  • DBを作成する
  • WordPressをインストールする
  • これからの運用で気をつけること

おしらせ

banner_vps