Nginx リバースプロキシ WordPress 管理画面へのアクセス制限

対象

  • WordPress の管理画面に IPアドレスアクセス制限をかけ、外部公開したくない。
  • WordPress docker コンテナに Nginx docker コンテナからリバースプロキシ接続している。
  • server をローカル環境に置いている。

WordPress を外部公開した場合、/wp-login.php 等の管理画面も公開されます。

この画面に IPアドレスによるアクセス制限をかけることができます。ローカル環境からのみアクセスできるようにします。

wordpress.conf

server {
    listen       ${NGINX_WP_PORT}; #環境に合わせて書き換える
    server_name  ${NGINX_WP_HOST}; #環境に合わせて書き換える

    access_log  /var/log/nginx/host.access.log  main;

    location / {
        location ~* /wp-login\.php|/wp-admin/((?!admin-ajax\.php).)*$ {
            allow 10.0.0.0/8;
            allow 172.16.0.0/12;
            allow 192.168.0.0/16;
            allow 127.0.0.1;
            deny all;

            proxy_pass http://wordpress;  # コンテナ名を指定
            proxy_redirect   off;
            proxy_set_header Host               $host;
            proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Host   $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Real-IP          $remote_addr;
            proxy_set_header X-Forwarded-Proto  https;
        }

        proxy_pass http://wordpress;  # コンテナ名を指定
        proxy_redirect   off;
        proxy_set_header Host               $host;
        proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host   $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Real-IP          $remote_addr;
        proxy_set_header X-Forwarded-Proto  https;
    }

リバースプロキシ先を指定する “location / { }” の中に、管理画面関係のアクセス先を指定する “location ~* /wp-login\.php|/wp-admin/((?!admin-ajax\.php).)*$ { }” を記述します。入れ子にするのがポイントです。

“location ~* /wp-login\.php|/wp-admin/((?!admin-ajax\.php).)*$ { }”の内容は、次の通りです。

  • allow ~ は、ローカルアドレスを許可する記述です。
  • deny all は、allow で許可されたアドレス以外をすべて拒否する記述です。
  • IPアドレス制限の部分だけだと、制御をしたあとどこにアクセスすればいいか分からないので、リバースプロキシ接続先を記述します。

proxy ~ の内容は、ひとつ目の塊の内容とふたつ目で全く同じです。

まとめ

メインのリバースプロキシ location 中に条件指定の location を入れ、そこにアドレス制限とアクセス先を記述するという構造です。ふたつの location を入れ子にしていない場合や allow と deny だけ記述してそのあとのアクセス先を書いていない場合は、期待通りの挙動になりませんでした。

外部からのアクセス

上記設定をそのまま適用した場合は、インターネットからは管理画面にアクセスできず、 server と同じ LAN 内からなら管理画面にアクセスできます。もし、インターネット越しに管理画面にアクセスしたい場合は、LAN 内に VPN サーバーを用意して VPN 接続すれば良いです。LAN 内の VPN サーバを経由した場合、Nginx からは LAN 内からアクセスとしてきていると扱われるため、インターネット経由でも管理画面にアクセスできます。

参考

Nginx リバースプロキシを用いた WordPress 外部公開までの手順は、こちらの記事が大変参考になりました。ありがとうございます。
Dockerでリバースプロキシ(nginx)構築+SSL対応 – Qiita