如何启用DDoS保护?

cod*_*ama 79 php security ddos denial-of-service

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

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

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

And*_*ock 187

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

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

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

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

    • 托管交换机 - 是的,有时需要更新
    • 路由器
    • 防火墙
    • 负载平衡器
    • 操作系统
    • Web服务器
    • 语言及其图书馆
  4. 确保你有一个好的防火墙或安全设备设置,并定期由合格的安全专家审查.防火墙的强规则可以很好地防御许多简单的攻击.能够管理每个开放服务可用的带宽也很有用.

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

    • 你受到攻击而不是仅仅处于沉重负荷之下
    • 攻击来自何处(可能包括您通常不与之做生意的国家)和
    • 攻击究竟是什么(端口,服务,协议,IP和数据包内容)
  6. 攻击可能只是大量使用合法的网站服务(例如,点击运行查询或插入/更新/删除数据的'合法'URI) - 数千或数百万来自数千到数百万不同IP地址的请求将为其带来一个网站膝盖.或者,某些服务运行起来可能非常昂贵,只有少数请求导致DOS - 认为这是一个非常昂贵的报告.所以你需要对正在发生的事情进行良好的应用程序级监控:

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

    • 使用负载均衡器中的QoS功能将所有匿名会话发送到群集中的单独应用程序服务器,而登录用户使用另一组.这可以防止应用程序级别的匿名DDOS占用有价值的客户
    • 使用强大的CAPCHA来保护匿名服务
    • 会话超时
    • 对某些类型的请求(如报告)设置会话限制或速率限制.确保您可以在必要时关闭匿名访问
    • 确保用户对并发会话数有限制(以防止被黑客入侵的帐户数百万次)
    • 为不同的服务(例如,事务使用与报告使用)使用不同的数据库应用程序用户,并使用数据库资源管理来防止一种类型的Web请求压倒所有其他服务
    • 如果可能,使这些约束动态化,或至少可配置.这样,当您受到攻击时,您可以设置积极的临时限制("限制"攻击),例如每个用户只有一个会话,而不是匿名访问.这对您的客户来说当然不是很好,但比没有服务要好得多.
  8. 最后,但并非最不重要的是,编写DOS响应计划文档,并由所有相关方进行内部审查:业务,管理,SW开发团队,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


K-G*_*Gun 19

根据问题的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;
?>
Run Code Online (Sandbox Code Playgroud)


j_m*_*lly 8

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是一个顶级的免费网络应用防火墙,他们有免费和付费的计划,并将从DDOS中保存你的屁股,我们将它用于我们的高流量网站,仅仅因为它的缓存功能.太棒了!


ndl*_*inh 5

您不能在 PHP 级别执行此操作。DDOS 是一种向您的网络服务器发送过多请求的攻击。您的网络服务器将在调用您的 PHP 脚本之前拒绝请求。

如果您使用的是 Apache,这里有一些来自 Apache 的提示:http : //httpd.apache.org/docs/trunk/misc/security_tips.html


小智 5

DDoS最好由非常昂贵的专用网络设备处理.主机通常不擅长DDoS保护,因为它们的性能相对较低,状态耗尽,带宽有限等.如果您无法访问DDoS缓解硬件,在某些情况下使用iptables,apache mod和类似服务会有所帮助或DDoS缓解服务,但它远非理想,仍然存在攻击风险.

  • 我们需要一个解决方案,如果没有理想的解决方案,则需要部分解决方案.没有人需要一种善意的建议"你就是不能这样做". (8认同)

NVG*_*NVG 5

在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;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

不要使用基于 PHP 的保护,它很糟糕并且几乎不会产生任何影响!配置您的网络服务器以限制请求速率,例如在 Nginx 中使用 limit_req 模块 ( http://nginx.org/en/docs/http/ngx_http_limit_req_module.html )

尽管如此,我还是建议使用 CloudFlare 来对抗第 4 层 - 但不是基于第 7 层的攻击,除非您愿意付费。