印度德里的一些剧本小孩从昨晚开始一直在试图破解我们的网站。 他编写了一个浏览器脚本,用大量的嵌套循环来请求我们的服务器,在阳光下试试一切。
他没有到任何地方,甚至没有越过我们的基本防御(但他正在填写我们的日志文件)。
他们进来的时候,我们发回了一个403 Unauthorized
的请求,但是我们越快阻止他的请求,他的脚本运行得越快。
我们想在回复403响应之前引入某种“延迟”。 时间越长越好。
问:如何在不影响网站其他部分的情况下延迟黑客入侵?
403 Unauthorized
错误,或者最终超时,我都不在乎,所以我们甚至可以做一个无限期的/无限的等待。 应该有一个单独的防火墙在你的Web服务器的前面。 你想阻止那些请求到达你的服务器,这样到目前为止,他的IP关心你的服务器不再存在。
有大大小小的实际入侵检测系统会根据各种filter,蜜jar和其他机制自动执行此操作
例如,请参阅fail2ban ,可以将其configuration为基于日志分析采取操作。
这样你可以
还有其他更大的工具,请参阅wikipedia上的另一部分。
由于你的问题被标记为asp.net我假设你的服务器平台是Windows。 不过,如果使用Linux防火墙是一个选项,你可以尝试以上
这样的防火墙可以在非常适中的硬件上运行 – 甚至可以像Linksys路由器(参见这里 )那样获得非常体面的链路带宽。
如果他们来自特定的IP地址或地址块,则可能需要添加黑洞路由:
ip ro add blackhole 10.69.96.0/24 ip ro flush cache
你也可以通过使用iptables规则来实现这一点,但是要意识到iptables规则是线性遍历的,所以如果你开始为每个不法分子添加iptables规则,你可以开始吃掉很多的CPU。 路由表经过优化,可处理多个条目。 例如,我的一个箱子在路由表中有350K条目,没有问题。 但是,如果我有3K的iptables规则,那么这个盒子肯定会崩溃。
如果你尝试做一些让你的应用程序在这些连接上hibernate几秒钟的事情,你可能会得到足够的资源,合法的请求将无法获得任何资源。
你不想让他放慢速度,因为不正确地减慢他的速度会使你的站点下降,就好像它是在DoS攻击下一样,因为你的线程将为这个人的请求“忙”。 你想要做的就是阻止他的IP,并完成它。 没有理由诱惑这个人。
你在找什么是Apache模块mod_evaisve。
在基于Debian的发行版中,使用安装
apt-get install libapache2-mod-evasive
CentOS的/ RHEL
yum install mod_evasive
mod_evasive保持跟踪来到Apache的请求,并使用通过阈值的iptables禁止IP。 这是针对基于HTTP的DoS攻击甚至是分布式DoS攻击的终极工具,当您被具有数千个不同IP的巨大僵尸networking所攻击时。
它作为运行时加载的Apache模块运行,而不是作为单独的守护进程运行。
尽pipe一个拥有巨大僵尸networking控制权的智能攻击者仍然可以通过对僵尸networking中每个僵尸发送的请求进行计时,从而使networking服务器无法通过阈值。
在这种情况下,您必须使用基于exception的IDS,并可能自己对系统进行培训。 但是,除非你有一些真正的大敌人或者有公司议程的人,否则这是不太可能发生的。
如果你使用的是linux,那么使用iptables来限制这个人大概延迟1个字节/秒,并且让他永远拿不到一个请求。 如果是分布式的,那也不会有太大的帮助。
我不确定在Windows上如何做,但是如果您有路由器或硬件防火墙,您可能会发现一些类似的选项。
编辑:同意以上,这更像是一个服务器故障的问题。
如果这个家伙的IP地址非常稳定,你可以创build一个自定义的HttpModule,通过修改web.config文件来插入它,并且当它被识别为这个IP地址时有一个延迟。 或者你可以发回他一些404代码或让他redirect到别的地方。
你知道他们在印度 您的网站是否有重要的印度客户,这将阻止他们在防火墙级别的整个IP范围的增量,直到stream量停止? 这当然不是一个坚定的解决scheme,但如果你只是处理一个典型的“脚本小子”,它应该足以阻止他们,并将他们发送到另一个目标。
更好的是,如果是来自一个IP,你可以回复你自己的拒绝服务攻击:)
除了收到的答案之外,您还需要保存文档(日志,跟踪)并将其提供给服务提供商。 这是事件中最有效的,因为你的提供者可以见证入侵。 即使您的措施取得了成功,重要的是要减less进一步的尝试,并帮助您的提供商升级向攻击者的服务提供商提出的请求。 可以说攻击者的提供者最有效的行为就是拒绝服务他的客户,即被识别的攻击者。
如果你是一个程序员,你可以使用.net Begin_Request事件,并把你的“睡眠”放在那里