VPSにApache, MySQL, firewallを設定する

VPS の最低限のセットアップを終えたら,WordPress を使うために Apache や MySQL などをインストールしていきます.

スイッチ

まず,一般ユーザでログインし,その後 root にスイッチします.

terminal
$ su

* $ は一般ユーザでの操作の意

Web サーバソフトウェア

Apache を入れていきます.

高速に動くということで Nginx なども有名ですが,Apache は動的なサイト,Nginx は静的なサイトに向いており,WordPress は Nginx 向けではありません.

terminal
# yum install httpd

* # は root での操作の意

自動起動設定

インストールしたら,サーバ起動時に自動で立ち上がるようにしておきます.

terminal
# systemctl enable httpd.service

ドキュメントルート

Apache を入れると,/var/www/html 下のファイルが Web ブラウザで閲覧できるようになっていて,この場所をドキュメントルートといいます.

サーバの IP アドレスにブラウザで接続すると,デフォルトではテストページ,ドキュメントルートに index.html があればそれを表示します.ここにファイルを追加していくことで,サイトを構成することができます.(現時点ではファイアウォールにより接続できません.)

アクセス権限

ファイルの追加は,通信内容を傍受されずにアップロードできる SFTP クライアントを使いますが,このままではドキュメントルートへのアクセス権限がありません.アクセス権限は次のように確認できます.

terminal
# cd /var/www
# ls -l
drwxr-xr-x root root html

こんな感じの内容が出ます.html ディレクトリの所有者,所有グループは root となっており,一般ユーザでは接続できないので,内容を更新します.

terminal
# chown apache:<USER> html
# chmod 775 html

* <USER> は一般ユーザ名

html に一般ユーザで接続し,かつ Apache ユーザでも接続したいのでこのように設定します.Apache ユーザは WordPress の投稿やアップロードなどを行うときのユーザです.

権限は 775 なので rwxrwxr-x です.(r:読込, w:書込, x:実行)

PHP インストール

WordPress は PHP で動いているので,こちらもインストールします.

terminal
# yum install php php-devel php-mbstring php-mysql php-gd

デフォルト設定だと WordPress でアップロードできるファイルサイズが限られるので,拡張しておきます.

terminal
# cd /etc
# vim php.ini

次の 2 行の値を変更します.

post_max_size = 128M

upload_max_size = 128M

インストールしたら Apache を再起動します.

terminal
# systemctl restart httpd.service

MySQL インストール

データベースとして MySQL を使うので,これもインストールします.

terminal
# wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
# rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
# yum install mysql-server

このようにして MySQL を公式サイトからダウンロード,展開します.インストールする MySQL の最新バージョンは公式サイトで確認してください.

ここで次のコマンドを入力すると MariaDB が入ってしまうので気を付けてください.

terminal
# yum install mysql **do not execute

展開したらダウンロードしてきたファイルはいらないので削除し,MySQL を起動します.

terminal
# rm mysql57-community-release-xxX-X.noarch.rpm
# systemctl start mysqld.service

参考

MySQL セットアップ

最初にパスワードを変更します.CentOS6 までは初期パスワードが設定されていませんでしたが,CentOS7 からは自動で生成されているらしく,しかも案内が出ないのでログを探ります.

terminal
# cat /var/log/mysqld.log | grep 'temporary password'

ここでパスワードがわかったら root というアカウント名でログインします.

terminal
# mysql -u root -p

ここで注意することは,パスワードの強度です.次のようなエラーメッセージが表示されたら強度不足です.

Your password does not satisfy the current policy requirements

CentOS7 から validate_password プラグインが有効になり,一定の強度を満たす必要があります.初期設定では MEDIUM になっていて,次の条件をすべて満たさなければなりません.

  • 8 文字以上
  • 英数字
  • 大文字,小文字
  • 記号

参考:MySQL :: MySQL 5.6 リファレンスマニュアル :: 6.1.2.6 パスワード検証プラグイン

phpMyAdmin インストール

MySQL が入ったら,ブラウザから編集できるように phpMyAdmin も入れます.

terminal
# yum install phpmyadmin

デフォルトではサーバ内からしか繋げられないので,どこからでも接続できるようにします.

しかし,phpMyAdmin は URL が推測されやすいので攻撃対象にもなりやすく,その対策も一緒に行います.

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

太字になっているディレクトリ以下を編集します.編集場所を間違うと動きません.また,CentOS7 向けなので,CentOS6 は設定内容が異なります.

#Alias /phpMyAdmin /usr/share/phpMyAdmin
#Alias /phpmyadmin /usr/share/phpMyAdmin
Alias /phpMyAdmin<ARRANGE> /usr/share/phpMyAdmin

<Directory **/usr/share/phpMyAdmin**>
    ...
    #Require ip 127.0.0.12
    #Require ip ::1
    Require all granted
    ...
    #Allow from 127.0.0.1
    #Allow from ::1
    Allow from All
</Directory>

* <ARRANGE> は適当な文字列

また,ブラウザ通信を他人に読まれないように SSL で守ります.

terminal
# yum install mod_ssl
# systemctl restart httpd.service

セキュリティ証明書がないので安全でないサイトとして表示されますが,所有しているのは自分なので問題ありません.

ファイアウォール設定

CentOS6 までの iptables に代わり,CentOS7 からは firewall が動くようになったようです.

現在適用されているファイアウォール設定は次のように確認できます.

terminal
# firewall-cmd --list-services --zone=public --permanent

おそらく SSH だけ適用されていて,それ以外はブロックしています.

適用できるフィルタは用意されていて,次のように確認できます.

terminal
# ls -lta /usr/lib/firewalld/services

ここにないものも作成できます.また,ここにある各ファイルの内容も見ることができます.

terminal
# cat /usr/lib/firewalld/services/ssh.xml

ここにポート番号やプロトコルなどが書かれています.

ここではブラウザ接続,SSL での接続,MySQL への接続のためにそれぞれのポートの通信をブロックしないようにします.

terminal
# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --add-service=https --zone=public --permanent
# firewall-cmd --add-service=mysql --zone=public --permanent
# firewall-cmd --reload

参考