如何启用DDoS防护?

2022-08-30 07:54:56

DDoS(分布式拒绝服务攻击)通常在服务器级别被阻止,对吗?

有没有办法在PHP级别阻止它,或者至少减少它?

如果没有,阻止DDoS攻击的最快,最常见的方法是什么?


答案 1

DDOS是一系列攻击,可淹没数据中心的关键系统,包括:

  • 托管中心与互联网的网络连接
  • 托管中心的内部网络和路由器
  • 您的防火墙和负载平衡器
  • 您的 Web 服务器、应用程序服务器和数据库。

在开始构建 DDOS 防御之前,请考虑最坏情况下的风险价值是什么。对于一个小社区的非关键、免费使用的服务,面临风险的总价值可能是花生。对于一个已建立的数十亿美元业务的付费,面向公众的任务关键型系统,其价值可能是公司的价值。在后一种情况下,您不应该使用StackExchange:)无论如何,要防御DDOS,您需要一种深入防御的方法:

  1. 与您的托管中心合作,了解他们提供的服务,包括他们与互联网的网络连接的IP和端口过滤以及他们提供的防火墙服务。这一点至关重要:托管公司将许多站点从互联网上拉出,因为托管公司处理DDOS对一个客户造成的数据中心范围的中断。此外,在DDOS攻击期间,您将与托管中心的工作人员密切合作,因此请了解他们的紧急电话号码并与他们保持良好的关系:)他们应该能够阻止整个国际区域,完全阻止特定服务或网络协议和其他广泛的防御措施,或者只允许列入白名单的IP(取决于您的业务模式)
  2. 在托管中心时 - 使用内容交付网络在最终用户附近分发(主要是静态)服务,并向DDOS架构师隐藏您的真实服务器。完整的CDN太大,DDOS无法取出所有国家/地区的所有节点;如果DDOS专注于一个国家,至少其他用户仍然可以。
  3. 使用最新的安全补丁更新所有系统和软件包 - 我的意思是所有这些补丁:

    • 管理型交换机 - 是的,这些有时需要更新
    • 路由器
    • 防火墙
    • 负载均衡器
    • 操作系统
    • 网络服务器
    • 语言及其库
  4. 确保您设置了良好的防火墙或安全设备,并由合格的安全专家定期进行审查。防火墙上的强大规则可以很好地防御许多简单的攻击。能够管理每个开放服务的可用带宽也很有用。

  5. 拥有良好的网络监控工具 - 这可以帮助您了解:

    • 你受到攻击,而不仅仅是承受沉重的负担
    • 攻击来自何处(可能包括您通常不与之有业务往来的国家/地区)以及
    • 攻击实际上是什么(端口、服务、协议、IP 和数据包内容)
  6. 这种攻击可能只是大量使用合法的网站服务(例如,点击运行查询或插入/更新/删除数据的“合法”URI) - 来自数千到数百万个不同IP地址的数千或数百万个请求将使站点瘫痪。或者,某些服务的运行成本可能非常高,以至于只有少数请求会导致DOS - 想想一个非常昂贵的报告。因此,您需要对正在发生的事情进行良好的应用程序级监控

    • 调用了哪些服务以及发送了哪些参数/数据(即在应用程序中记录)
    • 哪些用户正在调用以及从哪些 IP 进行调用(即登录您的应用程序)
    • 数据库正在执行哪些查询和插入/更新/删除
    • 系统中所有计算机(和 VM)上的负载平均值、CPU 利用率、磁盘 I/O、网络流量
    • 确保所有这些信息都易于检索,并且您可以关联来自不同计算机和服务的日志(即确保所有计算机都使用ntp进行时间同步)。
  7. 应用程序中的合理约束和限制。例如,您可以:

    • 使用负载平衡器中的 QoS 功能将所有匿名会话发送到集群中单独的应用程序服务器,而登录用户则使用另一组会话。这可以防止应用程序级匿名DDOS抢走有价值的客户
    • 使用强大的 CAPCHA 保护匿名服务
    • 会话超时
    • 对某些类型的请求(如报告)设置会话限制或速率限制。确保在必要时可以关闭匿名访问
    • 确保用户对并发会话数有限制(以防止被黑客入侵的帐户登录一百万次)
    • 为不同的服务(例如事务性使用与报告使用)拥有不同的数据库应用程序用户,并使用数据库资源管理来防止一种类型的Web请求压倒所有其他请求
    • 如果可能的话,使这些约束成为动态的,或者至少是可配置的。这样,当您受到攻击时,您可以设置积极的临时限制(“限制”攻击),例如每个用户只有一个会话,并且没有匿名访问。这对您的客户来说当然不是很好,但比根本没有服务要好得多。
  8. 最后,但并非最不重要的一点是,编写DOS响应计划文档,并由所有相关方进行内部审查:业务,管理,软件开发团队,IT团队和安全专家。编写文档的过程将使您和您的团队仔细考虑问题,并帮助您在休息日凌晨3点发生最坏的情况时做好准备。该文件应涵盖(除其他事项外):

    • 风险所在以及业务成本
    • 为保护资产而采取的措施
    • 如何检测攻击
    • 计划的响应和上报程序
    • 使系统和本文档保持最新状态的流程

所以,撇开序言不谈,这里有一些具体的答案:

DDOS通常在服务器级别被阻止,对吧?

不是真的 - 大多数最严重的DDOS攻击都是低级的(在IP数据包级别),并由路由规则,防火墙和为处理DDOS攻击而开发的安全设备处理。

有没有办法在PHP级别阻止它,或者至少减少它?

一些DDOS攻击针对应用程序本身,发送有效的URI和HTTP请求。当请求速率上升时,您的服务器开始挣扎,并且您将遇到SLA中断。在这种情况下,您可以在PHP级别执行一些操作:

  • 应用程序级监视:确保每个服务/页面都以一种可以看到正在发生的事情的方式记录请求(以便您可以采取措施来缓解攻击)。一些想法:

    • 拥有一种日志格式,您可以轻松地将其加载到日志工具(或Excel或类似工具)中,并使用命令行工具(grep,sed,awk)进行解析。请记住,DDOS将生成数百万行日志。您可能需要对日志进行切片(特别是关于URI,时间,IP和用户)以计算出正在发生的事情,并且需要生成如下数据:

      • 正在访问的 URI
      • 哪些 URI 以高速率失败(可能是攻击者正在攻击的特定 URI 的指标)
      • 哪些用户正在访问服务
      • 每个用户从中访问服务的 IP 数
      • 匿名用户访问的 URI 是什么
      • 对给定服务使用哪些参数
      • 审核特定用户的操作
    • 记录每个请求的 IP 地址。不要反转DNS - 具有讽刺意味的是,这样做的成本使DDOS更容易被攻击者使用

    • 记录整个URI和HTTP方法,例如“GET http://example.com/path/to/service?arg1=ddos"
    • 记录用户 ID(如果存在)
    • 记录重要的 HTTP 参数
  • 合理的速率限制:您可以对给定 IP 或用户可以在给定时间段内发出的请求数实施限制。合法客户每秒可以发出超过 10 个请求吗?匿名用户是否可以访问昂贵的报告?

  • 用于匿名访问的 CAPTCHA:为所有匿名请求实现 CAPTCHA,以验证用户是人,而不是 DDOS 机器人。

阻止DDOS攻击的最快,最常用的方法是什么?

最快的可能是屈服于勒索,尽管这可能不可取。

否则,您要做的第一件事就是联系您的托管和/或CDN提供商并与他们合作(如果他们还没有与您联系,已经询问到底发生了什么...)。当DDOS发生时,它可能会附带影响托管服务提供商的其他客户,并且提供商可能面临相当大的压力,仅为了保护其资源而关闭您的网站。准备好与提供商共享您的日志(任何和所有信息);这些日志与其网络监视器相结合,可以共同提供足够的信息来阻止/缓解攻击。

如果您期望DDOS,那么最好根据托管服务提供商可以提供的保护级别来限定他们。他们应该拥有DDOS经验和工具来缓解它 - 了解他们的工具,流程和升级程序。还要询问托管服务提供商从上游提供商那里获得了哪些支持。这些服务可能意味着更多的前期或每月成本,但将其视为保险单。

在受到攻击时,你需要抓住你的日志并挖掘它们 - 尝试找出攻击的模式。您应该考虑关闭匿名访问并限制受到攻击的服务(即降低应用程序的服务速率限制)。

如果幸运的话,并且您有一个小的固定客户群,您可能能够确定有效的客户IP地址。如果是这种情况,您可能会在短时间内切换到白名单方法。确保所有客户都知道这种情况正在发生,以便他们可以在需要从新的 IP :)进行访问时拨打电话。


道格·麦克莱恩(Doug McClean)在以下方面有一些很好的建议:https://stackoverflow.com/a/1029613/1395668


答案 2

根据问题的PHP部分;

虽然我不依赖PHP来实现这一点,但它可以实现,但需要考虑所有这些可能性或更多;

  1. 攻击者可以更改每个请求的 IP
  2. 攻击者可能将参数传递给目标站点不关心这些参数的URI
  3. 攻击者可以在到期前重新启动会话...

简单的伪;

<?php
// Assuming session is already started
$uri = md5($_SERVER['REQUEST_URI']);
$exp = 3; // 3 seconds
$hash = $uri .'|'. time();
if (!isset($_SESSION['ddos'])) {
    $_SESSION['ddos'] = $hash;
}

list($_uri, $_exp) = explode('|', $_SESSION['ddos']);
if ($_uri == $uri && time() - $_exp < $exp) {
    header('HTTP/1.1 503 Service Unavailable');
    // die('Easy!');
    die;
}

// Save last request
$_SESSION['ddos'] = $hash;
?>

推荐