如何启用DDoS防护?
DDoS(分布式拒绝服务攻击)通常在服务器级别被阻止,对吗?
有没有办法在PHP级别阻止它,或者至少减少它?
如果没有,阻止DDoS攻击的最快,最常见的方法是什么?
DDoS(分布式拒绝服务攻击)通常在服务器级别被阻止,对吗?
有没有办法在PHP级别阻止它,或者至少减少它?
如果没有,阻止DDoS攻击的最快,最常见的方法是什么?
DDOS是一系列攻击,可淹没数据中心的关键系统,包括:
在开始构建 DDOS 防御之前,请考虑最坏情况下的风险价值是什么。对于一个小社区的非关键、免费使用的服务,面临风险的总价值可能是花生。对于一个已建立的数十亿美元业务的付费,面向公众的任务关键型系统,其价值可能是公司的价值。在后一种情况下,您不应该使用StackExchange:)无论如何,要防御DDOS,您需要一种深入防御的方法:
使用最新的安全补丁更新所有系统和软件包 - 我的意思是所有这些补丁:
确保您设置了良好的防火墙或安全设备,并由合格的安全专家定期进行审查。防火墙上的强大规则可以很好地防御许多简单的攻击。能够管理每个开放服务的可用带宽也很有用。
拥有良好的网络监控工具 - 这可以帮助您了解:
这种攻击可能只是大量使用合法的网站服务(例如,点击运行查询或插入/更新/删除数据的“合法”URI) - 来自数千到数百万个不同IP地址的数千或数百万个请求将使站点瘫痪。或者,某些服务的运行成本可能非常高,以至于只有少数请求会导致DOS - 想想一个非常昂贵的报告。因此,您需要对正在发生的事情进行良好的应用程序级监控:
应用程序中的合理约束和限制。例如,您可以:
最后,但并非最不重要的一点是,编写DOS响应计划文档,并由所有相关方进行内部审查:业务,管理,软件开发团队,IT团队和安全专家。编写文档的过程将使您和您的团队仔细考虑问题,并帮助您在休息日凌晨3点发生最坏的情况时做好准备。该文件应涵盖(除其他事项外):
所以,撇开序言不谈,这里有一些具体的答案:
DDOS通常在服务器级别被阻止,对吧?
不是真的 - 大多数最严重的DDOS攻击都是低级的(在IP数据包级别),并由路由规则,防火墙和为处理DDOS攻击而开发的安全设备处理。
有没有办法在PHP级别阻止它,或者至少减少它?
一些DDOS攻击针对应用程序本身,发送有效的URI和HTTP请求。当请求速率上升时,您的服务器开始挣扎,并且您将遇到SLA中断。在这种情况下,您可以在PHP级别执行一些操作:
应用程序级监视:确保每个服务/页面都以一种可以看到正在发生的事情的方式记录请求(以便您可以采取措施来缓解攻击)。一些想法:
拥有一种日志格式,您可以轻松地将其加载到日志工具(或Excel或类似工具)中,并使用命令行工具(grep,sed,awk)进行解析。请记住,DDOS将生成数百万行日志。您可能需要对日志进行切片(特别是关于URI,时间,IP和用户)以计算出正在发生的事情,并且需要生成如下数据:
记录每个请求的 IP 地址。不要反转DNS - 具有讽刺意味的是,这样做的成本使DDOS更容易被攻击者使用
合理的速率限制:您可以对给定 IP 或用户可以在给定时间段内发出的请求数实施限制。合法客户每秒可以发出超过 10 个请求吗?匿名用户是否可以访问昂贵的报告?
用于匿名访问的 CAPTCHA:为所有匿名请求实现 CAPTCHA,以验证用户是人,而不是 DDOS 机器人。
阻止DDOS攻击的最快,最常用的方法是什么?
最快的可能是屈服于勒索,尽管这可能不可取。
否则,您要做的第一件事就是联系您的托管和/或CDN提供商并与他们合作(如果他们还没有与您联系,已经询问到底发生了什么...)。当DDOS发生时,它可能会附带影响托管服务提供商的其他客户,并且提供商可能面临相当大的压力,仅为了保护其资源而关闭您的网站。准备好与提供商共享您的日志(任何和所有信息);这些日志与其网络监视器相结合,可以共同提供足够的信息来阻止/缓解攻击。
如果您期望DDOS,那么最好根据托管服务提供商可以提供的保护级别来限定他们。他们应该拥有DDOS经验和工具来缓解它 - 了解他们的工具,流程和升级程序。还要询问托管服务提供商从其上游提供商那里获得了哪些支持。这些服务可能意味着更多的前期或每月成本,但将其视为保险单。
在受到攻击时,你需要抓住你的日志并挖掘它们 - 尝试找出攻击的模式。您应该考虑关闭匿名访问并限制受到攻击的服务(即降低应用程序的服务速率限制)。
如果幸运的话,并且您有一个小的固定客户群,您可能能够确定有效的客户IP地址。如果是这种情况,您可能会在短时间内切换到白名单方法。确保所有客户都知道这种情况正在发生,以便他们可以在需要从新的 IP :)进行访问时拨打电话。
道格·麦克莱恩(Doug McClean)在以下方面有一些很好的建议:https://stackoverflow.com/a/1029613/1395668
根据问题的PHP部分;
虽然我不依赖PHP来实现这一点,但它可以实现,但需要考虑所有这些可能性或更多;
简单的伪;
<?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;
?>