代码之家  ›  专栏  ›  技术社区  ›  jturnbull

使用nginx限制django管理员登录以防止字典攻击的速率

  •  4
  • jturnbull  · 技术社区  · 16 年前

    我正在研究各种限制django管理员登录速率的方法,以防止字典攻击。

    这里介绍一种解决方案: http://simonwillison.net/2009/Jan/7/ratelimitcache/

    但是,我更喜欢在Web服务器端使用nginx进行速率限制。

    nginx的 limit_req 模块就是这样做的-允许您指定每分钟的最大请求数,并在用户通过时发送503: http://wiki.nginx.org/NginxHttpLimitReqModule

    很完美!我想我已经破解了它,直到我意识到django admin的登录页面不在一个一致的地方,例如/admin/blah/在那个URL上给你一个登录页面,而不是跳转到一个标准的登录页面。

    所以我无法在URL上匹配。有人能想出另一种方法来知道管理页面正在被显示吗(regexp-the-response-html?)

    2 回复  |  直到 13 年前
        1
  •  3
  •   bmaeser    16 年前

    首先:为了稍微保护django管理员的安全,我总是使用一个不同于/admin的管理员URL/一个好主意是将该管理员部署为另一个域或子域上的第二个应用程序

    您可以通过iptables/netfilter将每分钟的请求限制为整个webapp。有关如何完成此操作的教程,请参见 debian administrator . 这是一个如何保护ssh端口的示例,但是您可以对http使用相同的技术。

    您可以使用nginxhtplimitzone模块限制分配会话的同时连接数,或者作为特殊情况,从一个IP地址进行连接。编辑nginx.conf:

    从 www.cyberciti.biz

    ### Directive describes the zone, in which the session states are stored i.e. store in slimits. ###
    ### 1m can handle 32000 sessions with 32 bytes/session, set to 5m x 32000 session ###
           limit_zone slimits $binary_remote_addr 5m;
    
    ### Control maximum number of simultaneous connections for one session i.e. ###
    ### restricts the amount of connections from a single ip address ###
            limit_conn slimits 5;
    

    以上将限制每个远程IP地址的远程客户端同时“打开”连接不超过5个。

        2
  •  1
  •   salty-horse s29    13 年前

    BMaeser是对的,您应该在一个单独的实例(即单独的域/子域/端口)中运行admin。

    你也可能对 django-sentinel 它使用memcached和自动黑名单对可疑的IP地址/网络进行动态灰名单,重复违规行为。