通常在服务器级别阻止DDoS(分布式拒绝服务攻击),对吗?
有没有办法在PHP级别上阻止它,或者至少减少它?
如果没有,阻止DDoS攻击的最快,最常见的方法是什么?
通常在服务器级别阻止DDoS(分布式拒绝服务攻击),对吗?
有没有办法在PHP级别上阻止它,或者至少减少它?
如果没有,阻止DDoS攻击的最快,最常见的方法是什么?
Answers:
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 bot。
阻止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;
?>
php级别在请求链中为时已晚。
将apache服务器放在开源设备后面可能是一个不错的选择。
http://tengine.taobao.org/提供了一些文档和源代码以及更多旨在防止DDOS的模块。它是nginx的扩展,因此您可以轻松地将其设置为apache实例的反向代理。
请参阅:http : //blog.zhuzhaoyuan.com/2012/01/a-mechanism-to-help-write-web-application-firewalls-for-nginx/,了解如何对抗具有DoS攻击的冲突。
也完全忘记了,http://www.cloudflare.com是顶级的免费Web应用程序防火墙之一,它们有免费的和付费的计划,并且会从DDOS中省掉您的钱,我们将其用于大量的高流量站点,只是因为它具有缓存功能。太棒了!
您不能在PHP级别上执行此操作。DDOS是一种向您的Web服务器发送过多请求的攻击。您的网络服务器将在调用PHP脚本之前拒绝请求。
如果您使用的是Apache,以下是来自Apache的一些技巧:http : //httpd.apache.org/docs/trunk/misc/security_tips.html
在PHP方面怎么样呢?
//if user does not change IP, then ban the IP when more than 10 requests per second are detected in 1 second
$limitps = 10;
if (!isset($_SESSION['first_request'])){
$_SESSION['requests'] = 0;
$_SESSION['first_request'] = $_SERVER['REQUEST_TIME'];
}
$_SESSION['requests']++;
if ($_SESSION['requests']>=10 && strtotime($_SERVER['REQUEST_TIME'])-strtotime($_SESSION['first_request'])<=1){
//write the IP to a banned_ips.log file and configure your server to retrieve the banned ips from there - now you will be handling this IP outside of PHP
$_SESSION['banip']==1;
}elseif(strtotime($_SERVER['REQUEST_TIME'])-strtotime($_SESSION['first_request']) > 2){
$_SESSION['requests'] = 0;
$_SESSION['first_request'] = $_SERVER['REQUEST_TIME'];
}
if ($_SESSION['banip']==1) {
header('HTTP/1.1 503 Service Unavailable');
die;
}
您可以在apache中为ddos / dos使用一些插件。此处的好开始 http://www.debianadmin.com/how-to-protect-apache-against-dosddos-or-brute-force-attacks.html
如果您使用的是LEMP,则可以在此处查看。 http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
这些是很好的廉价起点。
千万不要使用基于PHP的保护,这是可怕的,几乎不会有根本影响!将您的Web服务器配置为对请求进行速率限制,例如在Nginx中使用limit_req模块(http://nginx.org/en/docs/http/ngx_http_limit_req_module.html)
虽然,我建议您使用CloudFlare来抵抗第4层-但不要使用基于第7层的攻击,除非您愿意付费。
通常在服务器级别阻止DDOS,请在服务器级别启用DDOS保护。请检查以下注意事项以获取DDOS保护。
可帮助防止DDOS问题的Apache HTTP Server配置设置:
RequestReadTimeout指令允许限制客户端发送请求所花费的时间。
等待10秒以接收请求,包括标头,等待30秒以接收请求正文:
RequestReadTimeout header=10 body=30
至少等待10秒钟以接收请求正文。如果客户端发送数据,则每接收1000个字节将超时增加1秒,没有超时上限(LimitRequestBody间接给出的限制除外):
RequestReadTimeout body=10,MinRate=1000
RequestReadTimeout header=10-30,MinRate=500
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
在遭受DoS攻击的站点上,还可以降低KeepAliveTimeout指令。有些站点甚至通过KeepAlive完全关闭了keepalive,这当然在性能上还有其他缺点。应检查其他模块提供的与超时相关的各种指令的值。
应当仔细配置指令LimitRequestBody,LimitRequestFields,LimitRequestFieldSize,LimitRequestLine和LimitXMLRequestBody,以限制客户端输入触发的资源消耗。调整MaxRequestWorkers指令以允许服务器处理最大同时连接数而不会耗尽资源。
反DDOS步骤: