仅允许通过NGINX中的IP白名单访问某些位置

时间:2018-03-05 06:10:50

标签: wordpress nginx subdomain multisite

我正在使用Sucuri Scanner通知我登录尝试失败,我目前每天收到大约50封以上的电子邮件。我已经尝试了几种不同的方法来阻止访问 wp-login.php wp-admin 而没有任何运气,因为我认为这些规则可能不会使用子域(或通常只是吮吸)。

server {
    # Primary domain, secondary domain and subdomains are explicitly 
    # declared so that I can generate certs using CertBot
    server_name primarydomain.com
                secondarydomain.com
                subdomain1.primarydomain.com
                subdomain2.primarydomain.com
                subdomain3.primarydomain.com;

    client_max_body_size 20M;
    root /home/username/www/primarydomain.com/public_html;
    index index.php;
    error_log /home/username/www/primarydomain.com/logs/error.log error;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }

    # This doesn't seem to block access
    location /wp-login.php {
        allow XXX.XXX.XXX.XXX;    # this is my ipaddress
        deny all;
    }

    # This doesn't seem to block access    
    location /wp-admin/ {
        deny all;
        allow XXX.XXX.XXX.XXX;    # this is my ipaddress
    }

    # This doesn't seem to block access
    location ~ ^/(wp-admin|wp-login\.php) {
        deny all;
        allow XXX.XXX.XXX.XXX;    # this is my ipaddress
    }
}

3 个答案:

答案 0 :(得分:7)

它无法正常工作,因为regexps更高优先级比nginx

中的前缀更高

https://nginx.ru/en/docs/http/ngx_http_core_module.html#location

  

要查找与给定请求匹配的位置,nginx首先检查   使用前缀字符串(前缀位置)定义的位置。其中   它们,选择具有最长匹配前缀的位置   记住了。

这就是重点:

  

然后按照它们的出现顺序检查正则表达式   在配置文件中。搜索正则表达式   终止于第一个匹配,相应的配置是   用过的。如果找不到与正则表达式匹配的话   使用前面记住的前缀位置的配置

所以这个表达式会处理所有请求

location ~ \.php$

其中一个解决方案可能是将您的prefix位置转换为regexp并在配置文件中向上移动

或者对您要限制访问的网址使用=修饰符

  

此外,使用“=”修饰符可以定义完全匹配   的URI和位置。如果找到完全匹配,则搜索终止

来自文档的更多示例:

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}
  

“/”请求将匹配配置A,即“/index.html”请求   将匹配配置B,“/documents/document.html”请求   将匹配配置C,“/ images / ..gif”请求将匹配   配置D,“/documents/1.jpg”请求将匹配   配置E

答案 1 :(得分:3)

请尝试使用自定义登录网址和iTheme security plugin插件google recaptcha。它可以在一定程度上减少攻击。一个月前我们在我们的网站上遭到了如此多的攻击,但现在它很好,它减少到2 /周到零。

答案 2 :(得分:2)

最简单的解决方法是使用嵌套位置

http{
server {

        server_name *.domain.com;
        listen 80;

        location ~ \.php$ {
           location ~ /wp-login\.php$ {
                deny all;
           }
           location ~ ^/wp-admin/ {
                deny all;
           }
           return 200 "OK";
        }
}

测试结果如下

$ curl vm/testing.php
OK%                                                                                                                                                                                         

$ curl vm/wp-login.php
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>openresty/1.11.2.2</center>
</body>
</html>

 $ curl vm/wp-admin/index.php
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>openresty/1.11.2.2</center>
</body>
</html>