客户的网站目前正遭受攻击,我被叫去修复。
大量 IP(轻易就超过 5,000 个)正在不断攻击/login
,大概是试图强行闯入。
我已经更改了网站,所以页面返回 500 错误,但他们没有放弃。显然这对真实的用户现在无法登录。
负载平衡通过以下方式完成HAProxy,我对此知之甚少(尽管我比几个小时前知道的要多得多)。我尝试了很多在网上找到的合理方法,但似乎都没有帮助,可能是因为有如此大的 IP 块在执行攻击。
那么,回到这个问题:
如果某个 IP 的点击次数/login
超过X次是秒?
并且,子要点——我如何才能看到拒绝日志以便知道它确实有效?
以下是haproxy.log:
Jun 3 14:24:50 hap-server haproxy[11831]: 46.161.62.79:15290 [03/Jun/2017:14:24:49.505] www-https-test~ www-backend/www-03 751/0/202/38/991 500 220 - - ---- 428/428/120/38/0 0/0 "GET /login HTTP/1.1"
Jun 3 14:24:50 hap-server haproxy[11831]: 46.161.63.132:47804 [03/Jun/2017:14:24:49.505] www-https-test~ www-backend/www-04 751/0/202/38/991 500 220 - - ---- 428/428/119/42/0 0/0 "GET /login HTTP/1.1"
Jun 3 14:24:50 hap-server haproxy[11831]: 46.161.62.43:53176 [03/Jun/2017:14:24:49.505] www-https-test~ www-backend/www-02 751/0/202/38/991 500 220 - - ---- 428/428/118/38/0 0/0 "GET /login HTTP/1.1"
答案1
感谢 EEAA 的评论,我能够使用 fail2ban 解决这个问题。
然而,关于如何将 fail2ban 与 HAProxy 结合使用的文档非常少 —— 事实上,这个页面已经接近 Google 搜索“haproxy fail2ban”的顶部,因此我将详细说明我是如何做到的。
首先,安装 fail2ban。如果你做不到这一点,那么你最好不要继续,除非你寻求更多的帮助。
fail2ban 的工作原理是扫描您的访问日志,查找您设置的模式。如果它在 Y 秒内发现该模式 X 次,它将自动禁止该 IP Z 秒。
您的 HAProxy 日志应该位于/var/log/haproxy.log
。如果负载过重,日志可能会太大而无法使用 Vim 或 Nano 打开,因此只需使用 tail 查看最后几行:tail -n50 /var/log/haproxy.log
我的日志中的一个“坏”条目的示例如下:
Jun 3 16:48:03 hap-server haproxy[21751]: 178.159.100.29:48806 [03/Jun/2017:16:48:03.735] www-https-test~ www-backend/www-04 172/0/2/3/177 200 339 - - ---- 36/36/0/0/0 0/0 "GET /login HTTP/1.1"
我们希望 fail2ban 掌握的重要信息是攻击者的 IP 和他们访问的页面。
要告诉 fail2ban 如何执行此操作,首先我们要创建一个过滤器。在文件夹中创建一个文件/etc/fail2ban/filter.d
。我将其命名为applogin.conf
,但您可以随意命名,只要它以 结尾即可.conf
。
内容如下:
[Definition]
failregex = ^.*haproxy\[[0-9]+\]: <HOST>:.* "(GET |POST )/login HTTP/1.1"$
ignoreregex =
<HOST>
是日志中 IP 地址出现的行点。如果您想使用与我相同的正则表达式,请将其替换/login
为攻击者在您的服务器上瞄准的地址。
现在您必须告诉 fail2ban 您希望它查找该过滤器。复制一份/etc/fail2ban/jail.conf
(以防您搞砸了并需要重新开始),然后打开jail.conf
并在底部添加以下几行。
[app-login]
enabled = true
bantime = 1200
findtime = 120
maxretry = 6
filter = applogin
logpath = /var/log/haproxy.log
port = http,https
方括号内的部分只是名称 - 您可以使用任何名称。
bantime
是用户被禁止的秒数。maxretry
是用户在几秒钟内可以访问页面的次数findtime
。因此,在我的示例中,如果有人在 2 分钟内尝试访问 www.mydomain.com/login 超过六次(或者可能正好六次,我不确定),那么他们将被禁止 20 分钟。
filter
是您创建的文件的名称/etc/fail2ban/filter.d
(但没有.conf
)。
logpath
是您希望它在其中搜索的日志文件的路径。
保存该文件,然后重新启动 fail2ban:service fail2ban restart
跟踪 fail2ban 日志文件:tail -f /var/log/fail2ban.log
希望在一两分钟后,您将开始看到类似的内容
2017-06-03 17:04:32,040 fail2ban.actions: WARNING [app-login] Ban 146.185.200.122
就是这样!您不会受到坏人的攻击(不管怎样,那些试图访问该特定页面的人)。
注意 - 您可能还会在 fail2ban 日志中看到一些 SSH 禁令。安装时它会自动为 SSH 创建一些规则,所以不要惊慌。
答案2
我很高兴你似乎已经解决了 fail2ban 的直接问题,而且在 iptables 级别进行阻止确实有意义,但你可以在 HAProxy 配置中执行完全相同的操作:你可以将 acl 与 src_http_req_rate() 或甚至 src_http_err_rate(Abuse) 一起使用:我在一些示例中使用了它们haproxy 配置用于缓解 DDOS 攻击。
长期来看:听起来你可能想要为该页面实现双重登录,如果用户接受,那么你可以在登录页面中放置一个额外的 htaccess 密码,这样他们就需要单独登录(用脚本很难破解)。或者你可以使用 mod_security 来做同样的事情或某种美人计。