nginx: 대부분의 국가에서 특정 PHP 파일을 차단합니다.

nginx: 대부분의 국가에서 특정 PHP 파일을 차단합니다.

배경: 여러 WordPress 사이트를 운영하고 있는데 엄청난 양의 무차별 대입 로그인 시도가 분산되어 있는 것을 발견했습니다. 여기서는 공격자가 IP당 최대 5번의 로그인만 신중하게 시도한 다음 다른 로그인으로 전환하기 때문에 여기서는 failure2ban이 도움이 되지 않습니다.

내 문제는 비밀번호가 올바르게 추측되는 것에 대해 걱정하는 것이 아닙니다. 나는 이것이 서버에 초래하는 막대한 양의 부하에 대해서만 걱정합니다.

내 생각은 간단합니다. 저는 스위스에 살고 있고일부(모두는 아님) 사이트는 스위스에서만 로그인되므로 해당 사이트에서 다른 국가의 로그인 시도를 차단하고 싶습니다. 쉬운 것 같나요? 글쎄, 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만이 일치한다는 것을 어디에서나 읽었습니다.하나위치 블록이 작동하는 방식이기 때문입니다. 따라서 위치 블록과 일치하거나 wp-login.php블록과 일치할 수만 .php있고 둘 다 일치할 수는 없습니다.

그렇다면 내가제거하다다음 으로 표시된 선은 #1괜찮아 보입니다. 스위스에서는 액세스할 수 있지만 wp-login.php스위스 외부에서는 액세스할 수 없습니다. 엄청난! 그러나 액세스할 수 있으면 파일을 wp-login.php실행하는 대신 파일을 다운로드만 합니다. 실행을 위한 위치 블록이 .php일치하지 않아 fastcgi가 작동하지 않기 때문에 이는 예상된 것 같습니다.

그래서 실제로 로 표시된 줄을 추가해야 한다고 믿게 됩니다 #1. 하지만 그렇게 하면 갑자기 wp-login.php어느 국가 출신인지에 관계없이 모든 IP에서 액세스할 수 있습니다.

내가 도대체 ​​뭘 잘못하고있는 겁니까? 나는 nginx로 PHP를 설정하는 방법에 대한 수많은 기사와 특정 국가를 차단하는 방법에 대한 수많은 기사를 발견했습니다. 하지만 두 가지를 모두 수행하는 사람은 없습니다.

편집하다:

중요한 경우를 대비해 내용은 다음과 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;

관련 정보