基于动态IP的黑名单制度

6
大家都知道IP黑名单并不起作用-垃圾邮件发送者可以通过代理进入,而且可能会影响到合法用户... 话虽如此,对于阻止持续攻击者来说,黑名单似乎是一种有效的机制,因为实际的IP列表是动态确定的,基于应用程序的反馈和用户行为。
例如: - 有人试图暴力破解您的登录屏幕 - 一个编写不良的机器人向您的站点发出非常奇怪的HTTP请求 - 一个脚本小子使用扫描器寻找您应用程序中的漏洞
我想知道以下机制是否可行,如果可行,是否有任何工具可以实现:
- 在Web应用程序中,开发人员有一个钩子来报告“违规行为”。违规行为可能是轻微的(无效的密码),需要数十次这样的违规行为才能被列入黑名单;或者它可以是重大的,在24小时内发生几次这样的违规行为就会将其踢出。 - 每加载一页之前都会启动某种形式的Web服务器级别的阻止,并确定用户是否来自“坏”IP。 - 内置了“宽恕”机制:一段时间后,违规行为不再针对IP计数。
谢谢!
额外说明:如果解决方案在PHP中可行,那将是很棒的,但我很想听听您对任何语言/平台的方法的看法。
6个回答

5

看一下fail2ban。这是一个Python框架,可以让你从日志文件中查找不良行为的模式,并提高IP表格阻塞。


2
你是在*nix机器上吗?这种事情最好留给操作系统层面处理,使用像iptables这样的工具。
编辑:
回应评论,是的(有点像)。但是,iptables可以独立工作。你可以设置一个特定的阈值来限制流量(例如,阻止TCP 80端口上超过x个请求/分钟的请求),所有这些都是透明处理的(也就是说,你的应用程序不需要知道任何关于它的东西,动态阻塞就会发生)。
如果你完全控制这台机器,并且希望让防火墙处理限流,我建议使用iptables方法(优点是你不需要将这个逻辑构建到你的Web应用程序中,并且它可以节省资源,因为请求在到达Web服务器之前被拒绝)。
否则,如果你预计阻止不会是一个巨大的组成部分(或者你的应用程序是可移植的,不能保证访问iptables),那么将该逻辑构建到你的应用程序中会更有意义。

有没有一种方法可以从Web应用程序与iptables进行通信?比如说,“嘿,IPtables,我认为在X地址上有入侵者,请观察他们是否会在未来表现不良。”我确实在运行PHP的Linux系统上。 - Alex Weinstein

0

这种系统很容易,并且很常见,我可以轻松地把我的给你

它在这里被简单地解释 http://www.alandoherty.net/info/webservers/

脚本目前没有注释,因此无法下载,但是您可以在上述网站上给我发送电子邮件,我会将代码发送给您,并乐意帮助您调试/调整以适应您的服务器


0

我认为应该是用户名加上IP地址块的组合,而不仅仅是IP地址。


他指的是用户尚未登录或根本没有登录的情况。他明确提到了登录屏幕...如果用户已经登录,那么这将是微不足道的。 - AviD

0

你正在查看自定义锁定代码。在开源世界中有许多包含各种风格的此类代码的应用程序。也许你应该看看其中一些,尽管你的要求相当简单,所以标记一个IP/用户名组合,并利用它来阻止IP在x时间内进行阻止。(请注意,我说的是阻止IP,而不是用户。用户可能会尝试通过有效的IP/用户名/密码组合上网。)

事实上,你甚至可以保留用户登录的痕迹,当从未知IP登录时,使用3次错误的用户名/密码组合,为该用户名锁定该IP,时间长短由你决定。(请注意,许多ISP共享IP,因此...)

你还可以在认证中放置延迟,这样IP就不能每隔“y”秒尝试一次登录。


关于你提到的最后一点:延迟认证是我最喜欢的技术之一。在应用程序确定凭据无效但在响应显示给用户之前,等待一秒钟。这样,合法用户不会受到影响,但机器人则被追踪并拦截。 - Alex Weinstein

0

我曾经为一位客户开发了一个系统,用来追踪 Web 服务器的点击量,并在操作系统/防火墙级别上动态屏蔽 IP 地址,对于某些违规行为,屏蔽的时间可以是可变的,所以,这绝对是可能的。正如 Owen 所说,防火墙规则比 Web 服务器更适合执行此类操作。(不幸的是,客户选择严格保密此代码,因此我不能分享它。)

我通常使用 Perl 而不是 PHP 进行工作,但只要您的防火墙规则引擎有一个命令行界面 (例如 /sbin/iptables),您应该能够轻松地从任何具备执行系统命令功能的语言中完成此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接