如何保护wp-login免受apache / nginx攻击

时间:2017-06-20 21:01:17

标签: php wordpress apache .htaccess nginx

我想问你是否知道apache或nginx中的任何方法来限制对wp-login的访问,而不是整个服务器的访问。我的意思是:

例如,有一个带有Apache / Nginx的服务器,wp-login.php /xmrlpc.php或admin-ajax.php有很多命中。如果我不拒绝通过.htaccess文件访问整个服务器,那么服务器的负载会变得非常高。是否有任何配置或软件(不是wp插件)可能对我的情况有帮助?例如,如果相同的IP击中wp-login.php超过X(数量)次,它是否可以限制访问?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

听起来你正在寻找Nginx rate limiting

以下是我博客中有关如何在Nginx中为wp-login.php配置速率限制的摘录。

Using Rate Limiting in Nginx

Nginx有一些关于如何实现速率限制的优秀文档,但我将提供一个如何为WordPress优化它的示例。在Nginx中设置速率限制很简单,只需要两个组件:

  1. 我们必须在主nginx.conf文件中定义一个区域。
  2. 我们必须在WordPress登录位置块中实现该区域。要定义区域,我们使用limit_req_zonelimit_req_status。这些指令位于主http配置文件的nginx.conf块内。
  3. 代码:

    http {
        limit_req_zone $binary_remote_addr zone=wordpress:10m rate=15r/m;
        limit_req_status 429;
    }
    

    上面的代码段定义了一个名为“wordpress”的10 MB区域,它允许每分钟最多15个请求来自任何一个IP地址。 limit_req_zone需要变量或键。在这种情况下,密钥是$binary_remote_addr,或客户端的IP地址。 Nginx将使用最多10 MB的内存来存储密钥,如果密钥超过允许的最大请求数,Nginx将终止连接并返回limit_req_status中定义的状态代码。默认代码为503 Service Unavailable,但我更喜欢更具体的429 Too Many Requests响应。请记住,如果您未使用error_page指令设置自定义错误页面,Nginx将向客户端显示非标准HTTP代码的空白页。

    您可以根据需要为区域命名(在上面的示例中命名为“wordpress”),您还可以定义您认为合适的任何速率限制。我发现每分钟最多允许15个请求的限制足以严重阻碍蛮力攻击,但足够宽容,不会干扰合法错误输入密码的最终用户。

    要实际使用区域,我们必须通过将此代码添加到WordPress登录位置块来实现它:

    location = /wp-login.php {
        limit_req zone=wordpress;
        # add your PHP fastcgi config here
    }
    

    这告诉Nginx使用我们在上面定义的区域中指定的参数来限制对/wp-login.php页面的请求。确保将“wordpress”替换为您在上一步中为区域命名的内容。重新启动或重新加载Nginx并快速刷新登录页面以测试新的强力保护是否正常。如果刷新速度快于limit_req_zone中定义的速率,则服务器将返回limit_req_status中定义的状态代码。

    强制性说明:如果您已阅读有关如何使用Nginx设置速率限制的其他指南,您可能已经看到了其他语法,例如limit_req zone=one burst=1 nodelayburstnodelay选项更复杂,可让您控制超额请求的发生情况。在这种情况下,它们不是必需的,因为我们希望立即拒绝任何过多的暴力尝试,但我强烈建议您在这里阅读它们的文档。

    来源:https://blog.arnonerba.com/2016/07/server-logs-explained-part-3