挨拶
こんにちは。SIOS OSSエバンジェリスト/セキュリティ担当の面です。
今回は、SIOS Advent Calendarということで、こちらのQiitaでNGINX+WAFを利用した環境の作成を簡単にまとめます。
目的
目的は、「WordPressを用いて簡単なサイトをオープンしよう」です。ただ、WordPressは公知のように脆弱性を突かれるケースが多いため、WAFで既知の怪しいアクセスは防いでいきたいなと言う事になります。そのため、WordPress(Apache)をNGINX+WAFでガードする際の設定になります。特に昨今の流れから、SSL化は必須とします。
システム構成
システム構成は、次のようになります。通常、WAFを別筐体で用意するケースと同一筐体内に作るケースが有ると思いますが(図1)、今回は同一筐体内に作ります(図2)。
通信が暗号化されているため、NGINXの方でSSL証明書まで持っておき、443/80に来た接続を内部の8080(WordPress)に飛ばすという、一般的な方法を使います。
また、WordPress用のサブディレクトリを用意する形ではなく、トップ(https://www.hogehoge.jp)からWordPressのサイトにアクセスするようにします。
システムのインストール
今回のシステムはDebian(stretch)で行い、メンテナンス性を考えて出来る限りパッケージを使用するようにしています。そのため、Nginxに関しては、NGINX Plusを用い、WAFもそのNGINX Plusに同梱されているNGINX WAFを使用します(実際には、ModSecurity 3.0になります)。NGINX WAFはNGINX社が独自にパッケージングしているため、NGINX+ModSecurity 3.0の環境の運用(脆弱性等が見つかった場合の更新など)が、バイナリパッケージベースでaptコマンドで出来るのが嬉しい点です。
Apache+WordPress
基本的なApache+WordPressのインストールになりますので、割愛します。
(SSL証明書その他は/etc/letsencrypt/archive/www.hogehoge.jp/以下に格納されます。)
今回、WordPressをPort8080で動作させますが、最初はApacheをPort80/443で動作させる状態で一般的な方法でWordPressをインストールし、Let's EncryptからSSL証明書をゲットします。
/etc/apache2/ports.conf )
Listen 8080
としてPort8080で動作するように変更します。
NGINX WAFのインストール
NGINX WAF(NGINX Plus + ModSecurity 3.0)のインストールは、NGINX社のドキュメントに従って行います。aptを用いてインストールできます。こちらも基本的なところなので割愛します。
WordPressの設定
WordPressは、通常の方法でインストール
/etc/wordpress/htaccess)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
として、www.hogehoge.jp/へのアクセスがindex.phpになるようにします。
次にWordPressのコントロールパネルから、下記のようにサイトを「https://www.hogehoge.jp」にします。
次に、 /etc/nginx/conf.d/default.confで
server {
listen 443;
server_name www.hogehoge.jp;
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
ssl on;
ssl_certificate /etc/letsencrypt/archive/www.hogehoge.jp/cert1.pem;
ssl_certificate_key /etc/letsencrypt/archive/www.hogehoge.jp/privkey1.pem;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
proxy_redirect off;
proxy_set_header HTTPS on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
deny all;
}
とします。同様にPort80の時も設定することにより、これらの設定で、www.hogehoge.jpにPort80/443で接続した際に、WordPress on Apache(Port8080)に接続が飛ばされるような環境を作ることが可能になります。