こちらでNginx上にWordpressを構築しましたが、今回はWordpressの管理画面にIPを制限を設定したいと思います。

実はWebサーバーでわざわざ設定しなくてもIP制限を書けるためのプラグインも存在します。

最後に軽く紹介しますが、個人的にはセキュリティ系はアプリより下層のレイヤで制御できるならそちらでしたほうがよいと思うのでウェブサーバー側での制御をお勧めします。

Nginx (リバースプロキシ) – Nginx (Web サーバ)で構成している場合ですが、どちらのNginxで制限することも可能ですが、まずは、リバースプロキシに設定を追加します。

こちらで紹介したの設定ファイルに実際に追加したものを下に。 追加した箇所は72行目から79行目までです。

# ドキュメントルート
root   /var/www/html/wordpress;
# インデックスファイル指定
index  index.php index.html index.htm;

# キャッシュしたファイルが保管されるパスと、キャッシュゾーンの名前、容量を指定
# キャッシュ保管場所 /var/cache/nginx
# キャッシュを保存するサブディレクトリ階層の深さ 1:2
# キャッシュゾーン czone メモリの割当量 32m
# ゾーン内に保存できるキャッシュ最大値 256m
# アクセスの無いキャッシュを削除するまでの期間 1440m
proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=czone:32m max_size=256m inactive=1440m;
# 利用するキャッシュゾーンの名前を指定
proxy_cache czone;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
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;
# ステータスコードが通常応答の「200」と、ファイルが存在しない「404」の場合30分間キャッシュを保持
proxy_cache_valid 200 404 30m;

# プロキシサーバ設定
server {
    listen 80 default_server;

    # ドットファイルへのアクセスを禁止、ログへの記録オフ
    location ~ /\. {deny all; access_log off; log_not_found off; }
    # robots.txt へのアクセスはログへの記録オフ
    location = /robots.txt  { access_log off; log_not_found off; }
    # favicon へのアクセスはログへの記録オフ
    location = /favicon.ico { access_log off; log_not_found off; }
    # JavaScript CSS 画像へのアクセスはログへの記録オフ、直ちにプロキシに通しキャッシュ。
    # この期の設定でアクセス元の状態で複数キャッシュを行うが画像ファイルなどは複数キャッシュさせない
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        log_not_found off;
        proxy_pass http://unix:/var/run/nginx.sock;
        expires 7d;
    }

    # プロキシキャッシュ設定
    # 初期値はキャッシュするにセット
    set $do_not_cache 0;
    # .php ファイルへ直接アクセスがあるのは基本的に管理ページのみのためキャッシュしない
    if ($uri ~* "\.php$") {
        set $do_not_cache 1;
    }

    # POST 時はキャッシュしない
    if ($request_method = POST) {
        set $do_not_cache 1;
    }

    # $proxy_cache_key に任意の文字を加えることで別のキーでページをキャッシュ可能にする

    set $proxy_cache_key "$scheme://$host$request_uri";

    # ログイン状態またはコメントを記入したことがあれば、その情報ごとにキャッシュを分ける
    if ($http_cookie ~ "(wordpress_logged_in_|comment_author_)(.*)") {
        set $proxy_cache_key "$2::$proxy_cache_key";
    }

    # 今まで組み立てたプロキシ設定でキャッシュを実行
    location / {
        proxy_no_cache $do_not_cache;
        proxy_cache_bypass $do_not_cache;
        proxy_cache_key $proxy_cache_key;

        proxy_pass http://unix:/var/run/nginx.sock;
    }

#IP制限を追加
    location = /wp-login.php {
       allow xxx.xxx.xxx.xxx;
       allow xxx.xxx.xxx.yyy;
       deny all;

       proxy_pass http://unix:/var/run/nginx.sock;
    }

}


# ウェブサーバ設定
server {
    # ポートを指定
    #listen       80;
    listen unix:/var/run/nginx.sock;
    # WordPress カスタム パーマネントリンク対応
    try_files $uri $uri/ /index.php?q=$uri&$args;

    # PHP-FPM 設定
    location ~ \.php$ {
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
        fastcgi_pass_header "X-Accel-Redirect";
        fastcgi_pass_header "X-Accel-Buffering";
        fastcgi_pass_header "X-Accel-Charset";
        fastcgi_pass_header "X-Accel-Expires";
        fastcgi_pass_header "X-Accel-Limit-Rate";
        fastcgi_read_timeout 1200;
    }

}

次はリバプロ側ではなく、Webサーバー側に設定します。


ちなみにですが、使ったことは無いのですが、特定のIPアドレスから何度もログインしようとした場合に、そのIPアドレスを一定時間ブロックするWordPressのプラグインも存在します。
Limit Login Attempts
管理者側に固定IPアドレスがなくて制限をかけられない場合は、このようなプラグインを使うのもひとつの手かもしれません。



0 コメント