AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 421046
Accepted
THpubs
THpubs
Asked: 2012-08-25 18:57:52 +0800 CST2012-08-25 18:57:52 +0800 CST 2012-08-25 18:57:52 +0800 CST

如何限制 Nginx Auth_Basic 重试?

  • 772

我用 Nginx 的 Auth_Basic 模块保护了一个 web 文件夹。问题是,我们可以尝试多个密码直到它起作用(暴力攻击)。有没有办法限制重试失败的次数?

security
  • 6 6 个回答
  • 18672 Views

6 个回答

  • Voted
  1. Best Answer
    quanta
    2012-08-25T19:21:57+08:002012-08-25T19:21:57+08:00

    据我所知,Auth Basic模块不支持此功能,但您可以使用Fail2ban来实现。

    使用不存在的用户进行测试,您将在错误日志中看到如下内容:

    2012/08/25 10:07:01 [error] 5866#0: *1 no user/password was provided for basic authentication, client: 127.0.0.1, server: localhost, request: "GET /pma HTTP/1.1", host: "localhost:81" 2012/08/25 10:07:04 [error] 5866#0: *1 user "ajfkla" was not found in "/etc/nginx/htpasswd", client: 127.0.0.1, server: localhost, request: "GET /pma HTTP/1.1", host: "localhost:81"

    然后创建必要的过滤器:

    /etc/fail2ban/filter.d/nginx-auth.conf

    [Definition]
    failregex = no user/password was provided for basic authentication.*client: <HOST>
                  user .* was not found in.*client: <HOST>
                  user .* password mismatch.*client: <HOST>
    ignoreregex = </host></host></host> 
    

    /etc/fail2ban/jail.conf

    [nginx-auth]
    enabled = true
    filter = nginx-auth
    action = iptables[name=NoAuthFailures, port=80, protocol=tcp]
    logpath = /var/log/nginx*/*error*.log
    bantime = 3600 # 1 hour
    maxretry = 3
    

    测试 Fail2Ban 规则:

    fail2ban-regex /var/log/nginx/localhost.error_log /etc/fail2ban/filter.d/nginx-auth.conf

    Failregex
    |- Regular expressions:
    |  [1] no user/password was provided for basic authentication.*client: <HOST>
    |  [2] user .* was not found in.*client: <HOST>
    |  [3] user .* password mismatch.*client: <HOST>
    |
    `- Number of matches:
       [1] 1 match(es)
       [2] 2 match(es)
       [3] 0 match(es)
    
    Ignoreregex
    |- Regular expressions:
    |
    `- Number of matches:
    
    Summary
    =======
    
    Addresses found:
    [1]
        127.0.0.1 (Sat Aug 25 10:07:01 2012)
    [2]
        127.0.0.1 (Sat Aug 25 10:07:04 2012)
        127.0.0.1 (Sat Aug 25 10:07:07 2012)
    [3]
    

    PS:由于 Fail2ban 会获取要禁止的日志文件,请确保logpath与您的配置相匹配。

    • 35
  2. SColvin
    2017-06-10T07:12:27+08:002017-06-10T07:12:27+08:00

    我很惊讶没有其他人给出这个解决方案/解决方法。

    Nginx basic-auth 并htpasswd支持带有可选成本变量的 bcrypt 密码加密。Bcrypt 的设计速度很慢,因此对尝试不同密码的速度提供了硬性限制。

    创建基本身份验证用户名/密码时使用

    htpasswd -B -C 12 path/to/users.db <username>
    

    成本为 12,您的服务器可能无法每秒尝试超过几次密码,将其增加到 14,您可能会看到每次密码尝试大约 1 秒。

    通过该配置,即使攻击者连续多年尝试密码,任何合理的密码都将免受暴力攻击。

    例如,以每秒 10 次密码尝试对 8 个字符的字母数字密码进行暴力攻击需要 692,351 年:62**8 / (10*3600*24*365).

    这比设置“智能”请求限制更容易配置,也更简单。

    • 9
  3. cjc
    2012-08-25T19:12:32+08:002012-08-25T19:12:32+08:00

    我不相信 nginx 有任何内部设施可以做到这一点。文档页面并不表明这是可能的。

    您可以使用 Fail2Ban 来阻止重复登录尝试失败的 IP 地址。

    Fail2Ban wiki 有一些特定于 nginx 的模式。

    Fail2Ban 应该作为一个包在大多数大型发行版上可用。

    • 3
  4. intika
    2020-01-08T03:05:31+08:002020-01-08T03:05:31+08:00

    Nginx-HTTP-Auth-Digest模块可以用重试和超时等许多附加功能代替基本的 auth 模块。此处提供了其他文档

    唯一的缺点是这可能需要重建 nginx

    • 2
  5. Kevin Cox
    2021-04-16T05:19:23+08:002021-04-16T05:19:23+08:00

    这可以通过结合 NGINX 基本身份验证和速率限制来完成。

    http {
        map $http_cookie $rate_limit_key {
            default $binary_remote_addr;
            "~__Secure-rl-bypass=SomeRandomBytes" "";
        }
        limit_req_status 429;
        limit_req_zone $rate_limit_key zone=auth:10m rate=1r/m;
    
        server {
                auth_basic "Private Content";
                auth_basic_user_file your-auth-file.txt;
    
                limit_req zone=auth burst=20 delay=10;
    
                add_header Set-Cookie "__Secure-rl-bypass=SomeRandomBytes;Max-Age=${toString (3600*24*180)};Domain=$host;Path=/;Secure;HttpOnly";
        }
    }
    

    这个片段是从我的工作配置中提取的,但片段本身没有经过测试。

    基本概念是您创建一个允许绕过速率限制的 cookie,然后在有人成功通过身份验证后设置 cookie。通过这种方式,某人在登录之前会受到速率限制,此时他们可以根据需要执行任意数量的请求。

    这种方法的主要缺点是 cookie 是静态的,一旦有人登录了任何帐户,他们就可以使用令牌来暴力破解其他帐户。如果您相信您的用户不会暴力破解其他用户的密码,那么这不是一个大问题。但是我不认为你可以在 NGINX 的配置中做得更好。理想情况下,cookie 应将hash("$remote_user-SomeRandomBytes")令牌绑定到成功登录的用户。

    • 1
  6. simonmicro
    2022-03-13T09:12:43+08:002022-03-13T09:12:43+08:00

    只是为了解决我自己对这个问题的解决方案:它基于另一个(流行的)答案,类似于你的问题。这是配置:

    limit_req_zone $binary_remote_addr zone=login:10m rate=10r/m;
    
    server {
        listen 80;
        server_name XXX;
    
        location / {
            auth_basic "Authentication required.";
            auth_basic_user_file /path/to/htpasswd; # You should change this
            error_page 401 /AuthFailureLimit/index.html;
    
            root /usr/share/nginx/html/normal; # Demo
        }
    
        location /AuthFailureLimit {
            internal; # To prevent visible redirects
            auth_basic off; # Just in case the "auth_basic" was used in the "server" section
    
            limit_req zone=login burst=20 nodelay;
            limit_req_log_level warn; # Show blocks on the console
            limit_req_status 429; # Make more sense than "503 Service Unavailable"
            
            # ONLY use root or alias in this location, other statements (like return) will be executed before the rate limit triggers!
            alias /usr/share/nginx/html/ratelimit; # Demo
        }
    }
    

    它允许您直接使用 NGINX 的速率限制功能,而不需要客户端存储 cookie。请注意配置本身的注释,因为(由于不同的 NGINX 阶段)某些语句可能会扰乱速率限制。

    • 0

相关问题

  • OpenSSH 漏洞 [重复]

  • 选择什么安全套件?

  • 安全地授予对 SQL 2005 复制监视器的访问权限以创建快照

  • SSH 服务器零日漏洞利用 - 保护自己的建议

  • 如何将安全组添加到正在运行的 EC2 实例?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve