検証環境
- ConoHa VPSプラン
- CentOS 7.3
minimalインストールする場合はネットワークアダプター設定なども必要になると思います(ConoHa VPS環境では不要)。
日本時間設定
$ timedatectl set-timezone Asia/Tokyo
$ timedatectl status # Time zone: Asia/Tokyo (JST, +0900)
ロケール設定
$ localectl set-locale LANG=ja_JP.utf8
$ localectl status # System Locale: LANG=ja_JP.utf8
nmapのインストール
開放中のポートを確認したい場合のみ必要です。
$ yum -y install nmap
$ nmap localhost
# 開放中のポートを確認できる
# PORT STATE SERVICE
# 22/tcp open ssh
# 25/tcp open smtp
# 111/tcp open rpcbind
PHP7のインストール
# EPEL, REMI リポジトリを追加
$ rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ yum -y install --enablerepo=remi,remi-php71 php php-devel php-common php-cli php-pear php-pdo php-mysqlnd php-opcache php-gd php-mbstring php-mcrypt php-xml
必要なパッケージのみインストールします。パッケージの概要説明は以下のコマンドで表示できます。
$yum search php71-php-pdo
# php71-php-pdo.x86_64 : A database access abstraction module for PHP applications
# php71-php-pdo-dblib.x86_64 : PDO driver Microsoft SQL Server and Sybase databases
php.ini の timezone も設定しておきます。
/etc/php.ini
date.timezone = "Asia/Tokyo"
MariaDBのインストール
/etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
$ yum -y install MariaDB-server MariaDB-client
$ systemctl start mariadb
$ systemctl enable mariadb
$ mysql_secure_installation
Apache2.4, php-fpmのインストール
CentOS7 から Apacheの標準バージョンは2.4となりました。2.4以降でPHPを動かす場合はphp-fpmが必須となります。
$ yum -y install httpd mod_ssl
$ yum -y install --enablerepo=remi,remi-php71 php-fpm
$ vi /etc/httpd/conf.d/php.conf
/etc/httpd/conf.d/php.conf
# DirectoryIndex index.php
DirectoryIndex index.php index.html
<FilesMatch \.php$>
# SetHandler application/x-httpd-php
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
$ systemctl start httpd
$ systemctl enable httpd
$ systemctl start php-fpm
$ systemctl enable php-fpm
Apache MPM を worker で動かす場合
php-fpm使うならpreforkよりもworkerで動かした方が良いようです。
参考: apache で fcgid,fastcgi(PHP-FPM) を使うなら PreforkからWorkerへ切り替えるべし。
/etc/httpd/conf.d/php.conf
# worker では php_value の上書きはできないため、以下をコメントアウトする。
# php_value session.save_handler "files"
# php_value session.save_path "/var/lib/php/session”
# php_value soap.wsdl_cache_dir "/var/lib/php/wsdlcache"
/etc/httpd/conf.modules.d/00-mpm.conf
# LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_worker_module modules/mod_mpm_worker.so
$ systemctl restart httpd
$ apachectl -V | grep 'Server MPM’
# worker と返ればOK
証明書の設定(Let’s Encrypt)
SSL/TLS設定が必要な場合は、httpd を起動した状態で以下のように証明書発行・設定を行います。パスやドメインの情報は適宜置き換えてください。
$ yum -y install certbot python-certbot-apache
# 対話形式で証明書発行(メールアドレスの登録が必要)
# /etc/letsencrypt/live/your-domain/ 配下に証明書関連ファイルがインストールされます
$ certbot certonly --webroot -w /path/to/DocumentRoot/ -d your-domain.jp
SSL/TLS設定
SSL/TLS設定が必要な場合は、証明書発行後に以下の設定を行います。
/etc/httpd/conf.d/ssl.conf
<VirtualHost _default_:443>
ServerName your-domain.jp:443
ServerAlias your-domain.jp
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCompression off
SSLHonorCipherOrder on
SSLCipherSuite EECDH+HIGH:EDH+HIGH:HIGH:MEDIUM:+3DES:!ADH:!RC4:!MD5:!aNULL:!eNULL:!SSLv3:!SSLv2:!LOW:!EXP:!PSK:!SRP:!DSS:!KRB5
Header set Strict-Transport-Security "max-age=315360000; includeSubDomains"
SSLCertificateFile /etc/letsencrypt/live/your_domain/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/your_domain/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/your_domain/chain.pem
</VirtualHost>
設定完了後、SSL Server Test (Powered by Qualys SSL Labs) にてSSLテストを行い、A+判定となればOKです。
Apacheのセキュリティを強化する
/etc/httpd/conf.d/security.conf
などの分かりやすいファイル名で設定しておくとよいでしょう。
常時SSLにしたい場合
任意のファイル名で以下のようなコンフィグファイルを用意します。
/etc/httpd/conf.d/forcessl.conf
<VirtualHost _default_:80>
ServerName your-domain.jp:443
ServerAlias your-domain.jp
RewriteEngine On
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
ErrorLog /var/log/httpd/forcessl-error.log
LogLevel warn
</VirtualHost>
ssh接続ポートを変更する
アタックを避けるためにssh接続ポートを変更します。
/etc/sshd/sshd_config
Port 9822 ( 22以外の任意のポート番号 )
PermitRootLogin no
PasswordAuthentication no
GSSAPIAuthentication no
ChallengeResponseAuthentication no
$ systemctl restart sshd
後述するファイアウォール設定の変更も必ず行なってください(この段階でssh接続を終了すると再接続できなくなるため注意)。
ファイアウォール設定を変更する
CentOS7 ではiptablesを直接編集せず、firewall-cmd
を使用してsshポート番号の変更、およびhttp,https用ポートの開放を行います。
参考: CentOS 7 firewalld よく使うコマンド – Qiita
$ cp -rp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
$ vi /etc/firewalld/services/ssh.xml
/etc/firewalld/services/ssh.xml
<port protocol="tcp" port=“22”/> # 削除
<port protocol="tcp" port=“9822”/> # 追加
$ firewall-cmd --add-service=ssh --zone=public --permanent
$ firewall-cmd --add-service=http --zone=public --permanent
$ firewall-cmd --add-service=https --zone=public --permanent
$ firewalld-cmd --reload
ConoHa VPSを使用している場合、APIを利用して別途ConoHaインフラ側のポート開放も行う必要があります。
参考: ConoHa API を叩いてインフラ側で Firewall を設定
おわりに
必要に応じてログローテートやApacheのログフォーマット設定を行っておきましょう。また、セキュリティレベルをさらに向上させたい場合はWAFやIPS/IDSの導入を検討しましょう。
オープンソースのApache向けWAFは mod_security が有名なようです。ただ、WordPressとの相性はあまり良くないようで、用途に応じて細かいチューニングが必要になりそうです(正規のリクエストも通らなくなる部分が多い)。