nginx: ほとんどの国からの特定の PHP ファイルをブロック

nginx: ほとんどの国からの特定の PHP ファイルをブロック

背景: 私はいくつかの WordPress サイトを運営していますが、大量の分散ブルート フォース ログイン試行があることに気づきました。攻撃者は IP ごとに最大 5 回のログインのみを慎重に試行し、その後別の IP に切り替えるため、fail2ban はここでは役に立ちません。

私が心配しているのは、パスワードが正しく推測されることを心配しているわけではありません。これがサーバーに多大な負荷をかけることだけを心配しています。

私の考えはシンプルです。私はスイスに住んでいて、いくつかの(すべての) サイトはスイスからのみログインされるため、それらのサイトで他の国からのログイン試行をブロックしたいと思います。簡単そうに聞こえますか? まあ、nginx は私に同意したくないようです。

次のようにスニペットを設定しましたsnippets/php.conf:

index index.html index.htm index.php;

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    fastcgi_read_timeout 300;
}

のほとんどのファイルからこのスニペットを含めます/etc/nginx/sites-enabled。nginx geoip モジュールを有効にして構成しましたが、正常に動作するようです (構成はここには示されていません)。多くのサイトの構成は次のようになります。

server {
    listen 80;
    server_name mydomain.com;

    location /  {
        # common WordPress config
        try_files $uri $uri/ /index.php;
    }

    location ^~ /wp-login.php {
        # CH is the country code for Switzerland
        if ($geoip_country_code != CH) {
                return 444;
        }
        include snippets/php.conf;    # <-- #1
    }

    root /var/www/mydomain.com;
    include snippets/php.conf;
}

nginxは常に一致するとどこでも読んだことがあります1つロケーション ブロックです。それが動作の仕方だからです。したがって、 のロケーション ブロックと一致するwp-login.phpか、 のブロックと一致するかのどちらか一方のみが可能で.php、両方と一致することはありません。

だからもし私が取り除くでマークされた行では、#1問題ないように見えます。スイス国内ではアクセスできますwp-login.phpが、スイス国外ではアクセスできません。すばらしい! ただし、アクセスできる場合は、ファイルを実行するのではなく、ダウンロードするだけです。実行のための場所ブロックが一致しなかったため、fastcgi が機能しないため、wp-login.phpこれは予想どおりのようです。.php

そうすると、 でマークされた行を実際に追加する必要があると確信します#1。しかし、そうすると、突然、wp-login.phpどの国からの IP であっても、すべての IP から にアクセスできるようになります。

何が間違っているのでしょうか? PHP を nginx で設定する方法に関する記事がたくさん見つかりました。また、特定の国をブロックする方法に関する記事もたくさん見つかりました。しかし、両方を扱っている記事はありません。

編集:

snippets/fastcgi-php.conf重要であれば、ここにその内容を示します。これは、Debian Stretch の nginx のデフォルト インストールから取得したものだと思います。

# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+\.php)(/.+)$;

# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;

# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

fastcgi_index index.php;
include fastcgi.conf;

関連情報