ConoHa VPS で CentOS7基本設定 + LAMP環境構築

検証環境

  • 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などの分かりやすいファイル名で設定しておくとよいでしょう。

参考:  Apacheセキュリティ設定 – Qiita

常時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との相性はあまり良くないようで、用途に応じて細かいチューニングが必要になりそうです(正規のリクエストも通らなくなる部分が多い)。