我有一个带有 apache 的服务器,我最近安装了 mod_security2,因为我受到了很多攻击:
我的 apache 版本是 apache v2.2.3,我使用 mod_security2.c
这是错误日志中的条目:
[Wed Mar 24 02:35:41 2010] [error]
[client 88.191.109.38] client sent HTTP/1.1 request without hostname
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)
[Wed Mar 24 02:47:31 2010] [error]
[client 202.75.211.90] client sent HTTP/1.1 request without hostname
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)
[Wed Mar 24 02:47:49 2010] [error]
[client 95.228.153.177] client sent HTTP/1.1 request without hostname
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)
[Wed Mar 24 02:48:03 2010] [error]
[client 88.191.109.38] client sent HTTP/1.1 request without hostname
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)
以下是 access_log 中的错误:
202.75.211.90 - -
[29/Mar/2010:10:43:15 +0200]
"GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 392 "-" "-"
211.155.228.169 - -
[29/Mar/2010:11:40:41 +0200]
"GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 392 "-" "-"
211.155.228.169 - -
[29/Mar/2010:12:37:19 +0200]
"GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 392 "-" "-"
我尝试像这样配置 mod_security2:
SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind"
SecFilterSelective REQUEST_URI "\w00tw00t\.at\.ISC\.SANS"
SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS"
SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:"
SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:\)"
mod_security2 中的东西是 SecFilterSelective 不能使用,它给了我错误。相反,我使用这样的规则:
SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind"
SecRule REQUEST_URI "\w00tw00t\.at\.ISC\.SANS"
SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS"
SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:"
SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:\)"
即使这样也行不通。我不知道该怎么办了。有人有什么建议吗?
更新 1
我看到没有人可以使用 mod_security 解决这个问题。到目前为止,使用 ip-tables 似乎是最好的选择,但我认为文件会变得非常大,因为 ip 每天会更改几次。
我想出了另外两个解决方案,有人可以评论他们的好坏。
我想到的第一个解决方案是从我的 apache 错误日志中排除这些攻击。这将使我更容易在其他紧急错误发生时发现它们,并且不必在长日志中吐槽。
我认为第二种选择更好,那就是阻止未以正确方式发送的主机。在这个例子中,w00tw00t 攻击是在没有主机名的情况下发送的,所以我认为我可以阻止不正确形式的主机。
更新 2
在仔细阅读答案后,我得出了以下结论。
为 apache 进行自定义日志记录会消耗一些不必要的资源,如果确实存在问题,您可能希望查看完整的日志而不会丢失任何内容。
最好忽略命中并专注于分析错误日志的更好方法。为您的日志使用过滤器是一个很好的方法。
关于这个主题的最后想法
如果你至少有一个最新的系统,上面提到的攻击不会到达你的机器,所以基本上不用担心。
一段时间后很难从真实攻击中过滤掉所有虚假攻击,因为错误日志和访问日志都变得非常大。
以任何方式防止这种情况发生都会消耗您的资源,最好不要将资源浪费在不重要的事情上。
我现在使用的解决方案是Linux logwatch。它会向我发送日志摘要,并对其进行过滤和分组。通过这种方式,您可以轻松地将重要的与不重要的分开。
谢谢大家的帮助,我希望这篇文章也能对其他人有所帮助。
从您的错误日志中,他们发送的 HTTP/1.1 请求没有 Host: 请求的一部分。根据我的阅读,Apache 在移交给 mod_security 之前对此请求回复了 400(错误请求)错误。因此,您的规则似乎不会被处理。(Apache 在要求移交给 mod_security 之前处理它)
自己试试:
您应该收到 400 错误并在日志中看到相同的错误。这是一个错误的请求,apache 给出了正确的答案。
正确的请求应如下所示:
解决此问题的方法可能是修补 mod_uniqueid,即使对于失败的请求也生成唯一 ID,以便 apache 将请求传递给其请求处理程序。以下 URL 是有关此解决方法的讨论,其中包含您可以使用的 mod_uniqueid 补丁: http ://marc.info/?l=mod-security-users&m=123300133603876&w=2
找不到任何其他解决方案,想知道是否真的需要解决方案。
过滤IP不是一个好主意,恕我直言。为什么不尝试过滤您知道的字符串?
我是说:
Iv 也开始在我的日志文件中看到这些类型的消息。防止此类攻击的一种方法是设置fail2ban(http://www.fail2ban.org/)并设置特定的过滤器以在您的iptables规则中将这些IP地址列入黑名单。
下面是一个过滤器示例,该过滤器将阻止与发送这些消息相关的 IP 地址
[2011 年 8 月 16 日星期二 02:35:23] [错误] [客户端] 文件不存在:/var/www/skraps/w00tw00t.at.blackhats.romanian.anti-sec :) === apache w00t w00t 消息监狱- 正则表达式和过滤器 === 监狱
筛选
w00tw00t.at.blackhats.romanian.anti-sec 是一次黑客攻击,并使用欺骗 IP,因此 VisualRoute 等查找将根据当时借调的 IP 报告中国、波兰、丹麦等。因此,设置拒绝 IP 或可解析的主机名几乎是不可能的,因为它会在一小时内改变。
我个人编写了一个 Python 脚本来自动添加 IPtables 规则。
这是一个略带缩写的版本,没有记录和其他垃圾:
我相信 mod_security 对您不起作用的原因是 Apache 无法自己解析请求,它们不符合规范。我不确定你这里有问题 - apache 正在记录网络上发生的奇怪的事情,如果它没有记录它,你甚至不会意识到它正在发生。记录请求所需的资源可能很少。我理解有人正在填写您的日志令人沮丧 - 但如果您禁用日志记录只是为了发现您确实需要它,那将更加令人沮丧。就像有人闯入您的网络服务器一样,您需要日志来显示他们是如何闯入的。
一种解决方案是通过 syslog 设置 ErrorLogging,然后使用 rsyslog 或 syslog-ng,您可以专门过滤和丢弃这些有关 w00tw00t 的 RFC 违规。或者,您也可以将它们过滤到一个单独的日志文件中,这样您的主 ErrorLog 就易于阅读。Rsyslog 在这方面非常强大和灵活。
所以在 httpd.conf 你可能会这样做:
然后在 rsyslog.conf 你可能有:
请注意,这种方法实际上会比最初直接使用日志记录到文件使用更多的资源。如果您的网络服务器非常繁忙,这可能会成为一个问题。
最好的做法是尽快将所有日志发送到远程日志服务器,如果您被闯入,这将使您受益,因为擦除所做工作的审计跟踪要困难得多。
IPTables 阻塞是一个想法,但您最终可能会得到一个非常大的 iptables 阻塞列表,它本身可能会对性能产生影响。IP 地址中是否存在某种模式,还是来自大型分布式僵尸网络?需要有 X% 的重复项才能从 iptables 中受益。
你在更新 2 中说:
从我之前的回复中,我们了解到 Apache 由于 HTML 1.1 查询格式不正确而返回错误消息。所有支持 HTTP/1.1 的网络服务器在收到此消息时可能应该返回一个错误(我没有仔细检查 RFC - 也许 RFC2616 告诉我们)。
拥有 w00tw00t.at.ISC.SANS.DFind: 在您的服务器上的某些地方并不神秘地意味着“您遇到了麻烦”...如果您在 DocumentRoot 甚至创建 w00tw00t.at.ISC.SANS.DFind: 文件DefaultDocumentRoot 没关系......扫描仪正在发送一个损坏的 HTTP/1.1 请求,而 apache 说“不,这是一个糟糕的请求......再见”。w00tw00t.at.ISC.SANS.DFind: 文件中的数据将不会被提供。
在这种情况下不需要使用 mod_security ,除非您真的想要(没有意义?)......在这种情况下,您可以查看手动修补它(其他答案中的链接)。
您可能会考虑使用的另一件事是 mod_security 中的 RBL 功能。也许有一个在线 RBL 提供 w00tw00t IP(或其他已知的恶意 IP)。然而,这意味着 mod_security 会为每个请求进行 DNS 查找。
向 modsecurity 添加规则怎么样?像这样的东西:
我看到上面已经介绍了大多数解决方案,但是我想指出,并非所有客户端发送的没有主机名攻击的 HTTP/1.1 请求都直接针对您的服务器。有许多不同的尝试来指纹和/或利用您的服务器之前的网络系统,即使用:
以 Linksys 路由器等为目标。因此,有时它有助于扩大您的注意力,并在所有系统之间平分防御工作,即:实施路由器规则,实施防火墙规则(希望您的网络有一个),实施服务器防火墙/IP 表规则和相关服务,即 mod_security、fail2ban 等。
这个怎么样 ?
对我来说很好。