阻止HAProxy中的IP

一个客户的网站目前正在遭受攻击,我已经被调用来解决这个问题。

大量的IP(容易超过5000个)不断地打/login ,可能试图暴露自己的方式。

我已经改变了网站,所以页面返回一个500错误,但他们并没有放弃。 显然这对于​​现在无法login的真实用户来说并不好。

负载平衡是通过HAProxy来完成的,我对这方面的知识还很less(虽然我比几个小时前还多了很多)。 我已经尝试了很多我在网上find的明智的东西,但似乎没有任何帮助,可能是因为存在如此大量的IP来执行攻击。

在这个问题上,那么: 如果在Y秒内点击/login超过X次,我该如何拒绝IP?

而且,子点 – 我怎么能看到拒绝的日志,所以我知道它实际上工作?

以下是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" 

感谢EEAA的评论,我能够使用fail2ban来解决这个问题。

关于如何在HAProxy上使用fail2ban的文档很less – 实际上这个页面已经接近谷歌search“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如何做到这一点,首先我们要创build一个filter。 在文件夹/etc/fail2ban/filter.d创build一个文件。 我打电话给我的applogin.conf但你可以称它为你喜欢的,只要它以.conf结尾。

内容如下:

 [Definition] failregex = ^.*haproxy\[[0-9]+\]: <HOST>:.* "(GET |POST )/login HTTP/1.1"$ ignoreregex = 

<HOST>是IP地址出现的日志行中的点。 如果你想使用和我一样的正则expression式,用你的服务器上的攻击者地址replace/login

现在你必须告诉fail2ban你希望它find那个filter。 复制/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秒内点击页面的findtime 。 所以,在我的例子中,如果有人试图在2分钟内访问www.mydomain.com/login超过六次(或者正好六次,我不确定),那么他们将被禁止20分钟。 filter是在/etc/fail2ban/filter.d (但没有.conf )中创build的文件的名称。 logpath是要search的日志文件的path。

保存该文件,然后重新启动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创build一些规则,所以不要惊慌。

我很高兴你似乎已经解决了fail2ban的即时问题,在iptables级别阻塞是有意义的,但是你可以在你的HAProxyconfiguration中做同样的事情:你可以使用src_http_req_rate()或甚至src_http_err_rate(滥用):我已经在这里使用haproxyconfiguration的一些例子来减lessDDOS 。

更长一点:这听起来像你可能想实现该页面的双重login,如果用户将接受它,那么你可以从login页面中添加一个额外的htaccess密码,以便他们需要分开login(很难用脚本来破解)。 或者你可以使用mod_security来做同样的事情或某种亲爱的陷阱 。