Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

挨拶

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

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

目的

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

システム構成

システム構成は、次のようになります。通常、WAFを別筐体で用意するケースと同一筐体内に作るケースが有ると思いますが(図1)、今回は同一筐体内に作ります(図2)。
Fig1.jpg
Fig2.jpg

通信が暗号化されているため、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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした