NGINX Plus(WAF(modsecurity)) + WordPress(Apache)を同一筐体内でやる場合の設定

# 挨拶

こんにちは。SIOS OSSエバンジェリスト/セキュリティ担当の面です。

今回は、SIOS Advent Calendarということで、こちらのQiitaでNGINX+WAFを利用した環境の作成を簡単にまとめます。

# 目的

目的は、「WordPressを用いて簡単なサイトをオープンしよう」です。ただ、WordPressは公知のように脆弱性を突かれるケースが多いため、WAFで既知の怪しいアクセスは防いでいきたいなと言う事になります。そのため、WordPress(Apache)をNGINX+WAFでガードする際の設定になります。特に昨今の流れから、SSL化は必須とします。

# システム構成

システム構成は、次のようになります。通常、WAFを別筐体で用意するケースと同一筐体内に作るケースが有ると思いますが（図1）、今回は同一筐体内に作ります（図２）。
![Fig1.jpg](https://qiita-image-store.s3.amazonaws.com/0/315681/83aa820f-6201-40f8-d283-6cf1e673e55c.jpeg)
![Fig2.jpg](https://qiita-image-store.s3.amazonaws.com/0/315681/d5908e2f-b7b1-671d-8dc3-cd21c6c68f0d.jpeg)

通信が暗号化されているため、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」にします。
![範囲を選択_894.png](https://qiita-image-store.s3.amazonaws.com/0/315681/9fd8f37c-6fba-10ee-a8f6-5afdc59f8cb6.png)

次に、　/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)に接続が飛ばされるような環境を作ることが可能になります。