nginx icon

Nginx で WordPress wp-adminのアクセスを制限

Wordpress サイトを乗っ取られないように、特定のアドレス以外の管理画面のアクセスを拒否するには

WordPress Siteの管理画面

サーバー管理者の最低限のマナー

サーバーを乗っ取られないようにするのは、サーバー管理者の最低限のマナーである。
サーバー管理者が悪くなくとも、悪意あるものからサーバーが改ざんされたり、他のサーバーを攻撃するために使われたりするのは、絶対に避けたい。

管理画面のアクセス制限

NginxでWEBサーバーやリバースプロキシを構築したワードプレスサイトの場合の管理画面のアクセスを特定のIPアドレスに制限する。

たとえば、外部、この場合WANから

https://exampe.com/wp-admin/

のアクセスがあっても、ログイン認証の画面さえ表示させない方法になる。

設定ファイル /etc/nginx/nginx.connf

nginx.confが設定ファイルになる。

最近のnginxの設定ファイルは、インクルードの機能を使って、他に書かれた設定ファイルを読み込んで使っています。

そのなかで、wordpress site の設定が書かれているファイルを見つけます。

最近では、

/etc/nginx/sites-enabled

内のファイルです。(ここにあるファイルは、シンボリックリンクになっているので、実の本体は /etc/nginx/sites-available にある)

				
					vi /etc/nginx/sites-enabled/default

....
server {
    listen 443 ssl;
    server_name example.com;

    location / {
        proxy_pass https://exampe.com;  # 1台目の Web サーバー
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Proto $scheme;
                }
       
    ssl_certificate /etc/ .....;
    ssl_certificate_key /etc/ .....;

    }
				
			

のように記されているとする。

アクセス制限を追記

アクセス可能なアドレスを明記

  1. IPアドレス(この場合 192.168.100.0/24)に allow で許可
  2. その他全てのアクセスを deny 拒否にする。

WordPressの管理画面にアクセスするURLは、

  1. /wp-admin/
  2. /wp-login.php

の2つなので、

location /wp-admin/ {
allow 192.168.100.0/24;
deny all;
}
location = /wp-login.php {
allow 192.168.100.0/24;
deny all;
}

を設定に加えると

				
					vi /etc/nginx/sites-enabled/default

....
server {
    listen 443 ssl;
    server_name example.com;
    
    location /wp-admin/ {
    allow   192.168.100.0/24;
    deny    all;
    }

    location = /wp-login.php {
    allow   192.168.100.0/24;
    deny    all;
    }

    location / {
        proxy_pass https://exampe.com;  # 1台目の Web サーバー
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Proto $scheme;
                }
       
    ssl_certificate /etc/ .....;
    ssl_certificate_key /etc/ .....;

    }
				
			

のようになる。

当然だが

  • 設定が間違っていないか確認
  • nginx を再起動

して設定の適用する。

				
					nginx -t

systemctl restart nginx.service 
				
			

IPアドレス制限の設定

Pアドレス制限の設定において、deny all; を使用するのと、return 403; を使用するのでは、基本的にはどちらでも同じ結果になります。ただし、NGINXの設定ファイル内での動作と記述の明確さにわずかな違いがあります。

deny all; の場合

deny all; は、NGINXのアクセス制御モジュール(ngx_http_access_module)のディレクティブです。

  • 利点: 意図が明確で、allowディレクティブと組み合わせて「これらを許可し、それ以外を拒否する」という標準的なアクセス制御のパターンを表現します。
  • 動作: 指定されたIPアドレスからのアクセスを拒否し、HTTPステータスコード 403 Forbidden を自動的に返します。

return 403; の場合

return 403; は、NGINXの書き換えモジュール(ngx_http_rewrite_module)のディレクティブです。リクエストを処理せずに指定されたステータスコードをすぐに返します。

  • 利点: IPアドレス制限だけでなく、特定のリクエストURIや条件に基づいてカスタムのHTTPレスポンスを返したい場合に柔軟に対応できます。例えば、ifブロック内で条件付きで403を返すような複雑な設定に使えます。
  • 動作: 指定されたパスにアクセスした際に、NGINXが後続の処理(プロキシやファイル提供など)を行わずに、即座に403 Forbiddenを返します。

どちらを選ぶべきか?

不正なアクセスを防ぐという目的においては、deny all; を使用する方がより良い選択肢です。

  • NGINXのベストプラクティス: allowとdenyはアクセス制御のために設計されたディレクティブであり、この目的に最も適しています。
  • 意図の明確さ: 設定の意図が「アクセスを拒否する」ことであることが、コードを見ただけで明確にわかります。
  • 簡潔な記述: locationブロック内でシンプルに設定でき、returnのように他のディレクティブと組み合わせる必要がありません。

したがって、IPアドレスによるアクセス制限には deny all; を使うことを推奨します。return 403; は、特定の条件やエラー処理を目的とする場合に利用すると良いでしょう。

Nginx で WordPress wp-adminのアクセスを制限

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連コンテンツ

最近の記事

Nginx で WordPress wp-adminのアクセスを制限