阻止对 PHP 应用程序的无效 HTTP 请求

阻止对 PHP 应用程序的无效 HTTP 请求

多年来,这是我第一次部分负责帮助管理 PHP Web 应用程序(使用 Apache 提供服务)的服务器。

我们看到了许多无效 URL 请求,我猜测这些请求是与恶意软件/漏洞相关的探测。例如

r/www/cache/static/home/img/logos/nuomi_ade5465d.png
cgi-bin/test.sh
cgi-sys/entropysearch.cgi

ETC。

我想屏蔽这些请求,一方面是为了打击那些坏人,但更重要的是清除我的日志。为此,我有几个问题

  1. 一般来说,通过 IP 地址进行阻止是否有效?我知道“IP 地址 == 互联网上的唯一设备”已经过去很久了,但我想知道这些探测是否通常来自我可以安全地直接阻止它们的网络

  2. 如果我无法通过 IP 地址进行阻止,是否有人维护一个不良行为者通常会探测的 URL 列表,以便我可以通过 URL 进行阻止?

  3. 回复:#2——如果我要在服务器级别处理这种阻塞,哪个 Apache 模块适合这种事情?(MOD_REWRITEMOD_SECURITY

  4. 除了通过 IP 或 URL 之外,还有其他更好的方法来阻止这些请求吗?

  5. 此外,该系统托管在 EC2 上——亚马逊对这类事情提供任何帮助吗?

答案1

  1. 封锁 IP 地址将是一场你不可能赢的比赛。这些请求通常来自僵尸网络或被黑客入侵的系统。我建议封锁 IP 只是作为具体事件的临时解决方案,当这些请求给你带来问题时。

  2. 我不知道有这样的名单

  3. 两种方法都可以。但我认为(未经测试)忽略请求实际上可以减少 CPU 占用

  4. 使用反向代理(例如 varnish 甚至 mod_cache)来缓存负面命中(404)。这样对相同(不存在)URL 的请求就可以非常快速地处理,而不需要每次都检查文件系统。

  5. 不知道

答案2

  1. 一般来说,通过 IP 地址进行阻止是否有效?我知道“IP 地址 == 互联网上的唯一设备”已经过去很久了,但我想知道这些探测是否通常来自我可以安全地直接阻止它们的网络

您可以使用一个简单的 .htaccess 文件轻松阻止许多请求。在那里,您可以阻止 IP、URL 和很多东西。但我不确定您的“不良请求”的来源是什么。我知道的是,您应该从阻止我们已知的不良流量开始。如果您将目标定得更大一些,并且阻止拒绝服务攻击,同时限制不良请求,就可以做到这一点!您需要的一切都在这里非常有用的资源。但是他们并没有真正说明要安装哪些模块。我建议:mod_antilorismod_evasive但你还可以找到更多这里

我个人会考虑设置其中一些,然后再继续硬性阻止某些 URL 或 IP。但是,如果您想开始限制特定模式,使用 PHP 脚本可能会更容易。即将所有参数路由到 index.php 并在那里进行分析。这仍然需要使用 .htaccess 文件进行重新路由。Drupal 会执行如下操作:

# Pass all requests not referring directly to files in the filesystem to
# index.php. Clean URLs are handled in drupal_environment_initialize().
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]

通过这样做,您可以“捕获”每个传入的 URL。 Drupal 实际上内置了此功能,它会告诉您 X 个人正在寻找文件 Y。而且 Drupal 还具有可以使用某些规则阻止某些访问的模块。如果这是可能的,我相信连接到 PHP 会向您展示大量不同的选项,您可以使用这些选项来阻止或不阻止来自 ips 的访问。

我认为我提出了一个解决方案,但我确实需要更多信息来提供进一步的建议。如果您执行上述操作,您将能够收集更多信息,也许可以查明您的错误请求问题的确切来源。使用这些工具,您将能够看到模式,并且至少可以学习更好的方法来配置规则以阻止坏人。

  1. 如果我无法通过 IP 地址进行阻止,是否有人维护一个不良行为者通常会探测的 URL 列表,以便我可以通过 URL 进行阻止?

有一些 Apache 模块可以做到这一点,并使用它们自己的库。还有一些 PHP 库可以做到这一点,并且各种网络可以跟踪“坏人”,无论是使用 IP 的垃圾邮件发送者,还是使用电子邮件地址发送垃圾邮件等。以下是跟踪被列入黑名单的服务器的人员的完整列表出于各种原因。请输入 www.google.com 尝试一下。

  1. 回复 #2。如果我要在服务器级别处理此阻止,哪个 Apache 模块适合这种事情?(MOD_REWRITE、MOD_SECURITY)

MOD_REWRITE 可以将请求发送到 PHP 文件,之后您可以在 PHP 中处理问题。但这确实有点开销。您最好使用 MOD_SECURITY 和 MOD_EVASIVE

  1. 除了通过 IP 或 URL 之外,还有其他更好的方法来阻止这些请求吗?

这确实要视情况而定。你必须研究出现的模式并找出原因。我非常沮丧,因为我们不断收到“transparent.png”(或其他内容)的请求,而这后来成为许多手机的新标准请求。我们原以为这很糟糕,其实这是好事。不要这样做。

  1. 此外,该系统托管在 EC2 上——亚马逊对这类事情提供任何帮助吗?

我不知道。根据我个人的经验,主要是使用它来发送信息,即使发送不到 2500 封电子邮件,我们也会很快被列入黑名单。但是,如果您与他们一起托管并希望他们阻止传入的“不良请求”,他们应该已经在某种程度上这样做了。除非您的服务器每隔几天就会有一支大规模的机器人大军攻击,否则您应该要求他们进行干预。也许请他们帮助您识别来源,或者自己进行调查并从那里做出决定。

答案3

据我所知,没有完美的记录方法来处理此类问题。你只能尽量减少对 Web 应用程序的可疑尝试。

是的,可以在 Apache 上阻止 IP。点击此处查看 Apache 文档.它使用mod_rewrite并给出403如果 IP 在黑名单中,则向客户端发送响应代码。监控日志并维护hosts.deny

比第一个选项稍微轻松一点的工作是,如果您知道这些无效 URL 的模式,则mod_rewrite根据请求的模式来阻止请求。扩展第一个选项中使用的规则,向规则添加额外条件。

RewriteMap hosts-deny txt:/path/to/hosts.deny
RewriteCond ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND [OR]
RewriteCond ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND [OR]
RewriteCond %{QUERY_STRING} <any suspicious keyword/pattern> [NC,OR]
RewriteCond %{REQUEST_URI} <any suspicious keyword/pattern> [NC] 
RewriteRule ^ - [F] 

根据您网站的功能添加不同的规则。假设您的网站仅提供.php文件服务,则只需在上述代码中添加一个条件即可。 RewriteCond %{REQUEST_URI} !.php$ [NC]

答案4

Fail2ban 的设计目的正是实现您所描述的功能。例如,参见http://linuxaria.com/howto/how-to-protect-apache-with-fail2ban

您可以将其配置为对(例如)404 响应敏感。或者您甚至可以在 URL 上设置蜜罐,以便立即发出黑旗,让 fail2ban 采取行动。

关于具体问题:

  1. 是的,它可以工作,但小心不要通过坏链接进行 DOS 攻击

  2. 这样的列表很快就会过时 - 这就是为什么你应该使用流量本身作为数据源。但是 /^/cgi-bin/ 和 /.asp(x+)$/ 是你可能想要标记的东西

  3. 无需任何模块,除非你想将黑标 URL 重定向到更复杂的处理程序

  4. 您向亚马逊支付了服务费,然后问我们您付的是什么钱?

相关内容