第八章-第二节-外部安全性

外部安全性

外部安全是保护系统安全的第一道防线,通常包括第 2 层或第 3 层防火墙、DDoS 防护、web 应用防火墙以及其他软件和硬件层面的保护。在攻击者能够危及您的应用程序之前,他们必须首先通过这些硬件和软件层,这些层不是您的应用程序代码的一部分,而是应用程序中许多组件可能共享的共享基础架构层。在本节中,我们将介绍一些外部安全性以及可能对您使用的一些攻击。保护服务的边界通常是由操作完成的任务,但是作为开发人员,我们需要了解流程和风险,因为它极大地增强了我们加固应用程序代码的能力。在本节中,我们将介绍外部安全性的通用方法以及黑客可以利用您的系统的一些方法。

第 2 或第 3 层防火墙

第 2 层更常用于路由,因为它只处理 MAC 地址而不处理 IP 地址,而第 3 层可识别 IP 地址。根据传统,第 2 层是唯一真正的不会增加延迟的方法,因为它的执行速度与网线速度大致相同。随着处理能力和内存的增加,第 3 层现在也以网线速度运行,一般来说,当我们查看边缘防火墙时(通常是系统的第一个入口点),它们现在将会是第 3 层。那么这给了我们什么提示呢?首先,它阻止边缘网络不需要的流量:我们限制外部世界可访问的端口,同时一些导向不允许访问内容的流量在防火墙处被拦截,这样就没有机会从源上进行攻击。除此之外,它还允许我们限制对某些端口的访问。例如,如果您正在运行服务器,则很可能需要某种形式的远程访问,例如 SSH。2015 年出现的 Heartbleed 漏洞利用了 OpenSSH 中的漏洞,直接暴露在网络上的 SSH 服务器很容易受到这种攻击。有效地使用防火墙意味着 SSH 等专用端口将被锁定到 IP 地址或 IP 范围,这可能是您的 VPN、办公室 IP 或公共 IP。这大大减少了攻击者利用此功能进行攻击的媒介,因此当您运行易受 Heartbleed 攻击的 OpenSSH 版本时,你需要将这些 SSH 连接置于受保护区域内。

Heartbleed 漏洞利用了执行缓冲区溢出的能力进行攻击,例如,您要求服务器提供 4 个字母的单词,但指定长度为 500;你得到的是 4 个字母的单词,剩下的 496 个字符是跟随初始分配的内存地址的内存块。实际上,这就允许黑客随机访问服务器中的内存块;这些内存块可能包含更改密码请求等项目,这些项目为其提供访问服务器的凭据。如果您正在运行全局可用的 SSH 服务器,那么您可能会发现存在问题:

Heartbleed

Web 应用程序防火墙

Web 应用程序防火墙(WAF)被配置为系统中的第二道或第三道防线。要了解 WAF 是什么,让我们看看 开源 Web 应用程序安全项目(OWASP)中的定义:

“Web 应用程序防火墙(WAF)是 HTTP 应用程序的防火墙。它将一组规则应用于 HTTP 会话。这些规则涵盖了常见的攻击,如跨站点脚本(XSS)和 SQL 注入。

当代理技术保护客户端时, WAF 保护着服务器。部署 WAF 以保护特定 web 应用程序或 web 应用程序集。WAF 可以被视为反向代理。

WAF 可能以应用、服务器插件或过滤器的形式出现,并且可以针对应用程序进行定制。执行此自定义的工作量很大,需要在修改应用程序时进行维护。“

OWASP 是一个非常有用的资源,实际上为 ModSecurity 提供了一个核心规则集,可以防止 SQL 注入、XSS、Shellshock 等攻击。设置 WAF(如ModSecurity 和 OWASP CRS)应该是您的最低要求。在 Docker 容器中托管这个应该是相对微不足道的,这可能形成第 2 层防火墙后面的第二道防线。

还有另一种选择:一些像 Cloudflare 这样的 CDN 公司提供托管的 WAF。这是对网络边缘的保护,并且由于Cloudflare 等企业的专业知识,您无需担心配置问题。事实上,Cloudflare 支持 OWASP CRS

API 网关

除了 WAF,API 网关也是一个有用的工具;这可以实现双重目的,即将公共 API 路由到其后端服务以及一些其他功能,例如边缘的令牌验证以及输入验证和转换。当我们谈到困惑的代理人问题时,防火墙后面的攻击者可以执行他们没有权限的命令,我们研究了加密网络令牌的可能性;这个问题是用于解密这些令牌的私钥需要分布在多个后端服务中。这使得管理密钥比其应有的难度更具挑战性。API 网关可以通过成为唯一可以解密消息的层来简化这种情况。其他服务使用公钥来验证签名。API 网关通常实现许多其他第一线功能,例如但不限于以下内容:

  • 请求验证
  • 授权
  • 速度限制
  • 日志记录
  • 缓存
  • 请求和响应传递

WAF 和 API 网关之间存在交叉元素;但是,这两个应该被视为基础设施的两个截然不同的部分。关于 API 网关的提供者,这似乎是一个发展中的领域;AWS 具有高级 API 网关,如果您已购买 AWS PaS环境,则可以使用该网关。 对于独立部署,KongTykApigeeMashery 和 Mulesoft 的 Anypoint Platform 都是该领域的领导者。当然,可以使用 Nginx 或 HAProxy 构建自己的 API 网关;但是,在开始构建自己的平台之前,我建议首先要看一看以上特定平台中的一个。

DDoS 防护

2016 年 10 月 21 日,攻击者使用 Mirai 僵尸网络攻击 DYN 的 DNS 服务器造成了一次大规模的网络瘫痪。Mirai 漏洞利用了中国的雄迈信息技术有限公司制造的 IP 摄像机和 DVR 的漏洞攻击者不是攻击目标,而是决定取消互联网基础设施的主要部分,淘汰美国东海岸和西海岸的大部分地区。Mirai 漏洞只利用 60 个用户名和密码来尝试更新易受攻击设备的固件。一旦安装了恶意软件,该设备就可以被僵尸网络控制。剩下要做的就是告诉机器人开始针对 DYN 域名服务器进行 DNS 攻击。

Mirai 的代码已经发布在网上;你可以使用谷歌轻易地找到它。你会为这个代码的简单程度感到惊讶。现在,我不想从设计这种攻击的复杂性中得到任何东西;我只谈谈实现。该漏洞的相当大一部分代码是用 Go 编写的,因此非常易读。channel(通道)有一些很好的用途。如果您查看代码,请尝试甄别可以使用信号量改进的代码段。

Akamai 发布的一份报告指出,今年所有攻击中有 98.34% 是面向基础设施的,只有 1.66% 的目标是应用层。在 98.34% 中,只要保持网络环境干净,许多是可以避免的。让我们看看顶级威胁及其运作方式。

DDoS 攻击类型

以下是 DDoS 攻击的类型“

  • UDP 碎片
  • DNS
  • NTP
  • Chargen
  • UDP
  • SYN
  • SSDP
  • ACK
UDP 碎片攻击

UDP 碎片攻击是攻击者利用数据报碎片在网络上工作的方式。每个网络都有一个称为最大传输单元(MTU)的限制。如果发送到网络的数据报大于 MTU,则其会被分割成碎片进行传输。

UDP 碎片攻击的工作原理是创建包含假包的数据报;当服务器试图重新组装这些包时,它无法完成,资源很快就会被消耗殆尽。

UDP 泛洪攻击

UDP 泛洪攻击的工作原理是将大量带有欺骗源地址的 UDP 数据包发送到 IP 地址。服务器将响应这些请求,向欺骗的地址发送回复。由于大量的攻击,路由器将超过其每秒 UDP 数据报的限制,并在一段时间内对同一安全区域中的所有地址停止发送消息。

这通常也使用称为反射攻击的技术。当源地址 IP 被欺骗时,返回数据包不会被发送回真实源,而是发到被欺骗的 IP 地址。使用此技术的原因是它允许发送方通过仅消耗出站数据包上的资源来放大攻击。

DNS

DNS 攻击利用 UDP 泛洪攻击来获取 DNS 服务器;许多请求被用于查询 DNS 服务器。这些请求旨在从一个微小的请求返回一个非常庞大的回复,以最大限度地提高攻击效率,因为发送者通常不会收到响应。

我们在早些时候看到的针对 Dyn 的基础设施的攻击,在 2016 年 10 月在美国东海岸和西海岸取出了许多网站,这种攻击就是 DNS 攻击。与大多数 DNS 攻击不同,Miraia 网络不使用反射攻击技术,它允许将响应返回给发送方,这可能是由于大量受损设备造成的。

NTP

NTP 是另一种放大攻击,它利用 NTP 服务器内置的功能,返回最后 600 台与之交互的机器。此攻击利用了支持 MONLIST 命令且尚未修补的开放 NTP 服务器。项目 http://openntpproject.org/ 旨在识别未修补的服务器,以鼓励删除此漏洞。不幸的是,NSFOCUS 在 2014 年进行的研究发现,全球有超过 17,000 台服务器容易受到攻击。假设所有这些服务器都可以使用,并且使用 2014 年遭遇 CloudFlare 的 NTP 攻击的有效载荷大小,我们就有了 1.4Tbps 的 DDoS 攻击能力。这种流量将是目前已知的最大攻击的两倍。NTP 为最强大的应用程序攻击之一提供了一个平台,并且仅由于服务器修补不良而存在。

CHARGEN

CHARGEN(字符生成协议)攻击是另一种反射放大攻击。攻击利用开放的 CHARGEN 服务器,每次从连接的主机接收数据报时,在端口 19 上运行的服务器将返回 0 到 512 之间的随机字符长度。CHARGEN 旨在作为一种字节流的源来调试 TCP 网络代码和带宽测量。CHARGEN 攻击通过滥用已在网络连接的打印机上启用的 CHARGEN 服务器来工作。

SSDP

简单服务发现协议(SSDP),通常用于发现 即插即用(UPnP)设备。这正是您的家用路由器实现的协议,所以下次当您抱怨您最喜欢的游戏网络离线时,为什么不先检查您是否无意中将 SSDP 暴露在互联网上?

ACK

ACK 泛洪利用客户端连接到服务器时存在的三次握手。第一步是客户端发送一个 SYN 数据包,从服务器回复 SYN-ACK 数据包。然后客户端最后回复一个 ACK 数据包,然后为数据开放连接。ACK 泛洪采用以下两种形式之一:

  • 攻击者向服务器发送一个欺骗性的 SYN 数据包,然后使用一个伪造的 SYN-ACK 数据包。服务器打开并保持开放的连接。如果打开了足够多的连接,则服务器最终将耗尽资源。
  • 第二种方法是仅发送 ACK 包。由于服务器没有开放连接,因此该数据包将被丢弃;但是,它仍然消耗必须处理这些数据包的资源。

攻击类似于 SYN 攻击;但是,由于它欺骗 DDoS 过滤器将数据包传递到服务器的方式,它可以更有效。

避免这些攻击并非如此简单:您需要在网络边缘检测并过滤此活动。您还需要大量带宽来吸收系统入站的流量,在我看来,这不是内部解决方案可以或应该解决的问题。

避免 DDoS 攻击的第一道防线是确保您没有启用它们。配置防火墙以确保您不暴露易受攻击的服务,并修补您的服务意味着攻击者无法使用您的网络基础架构来攻击其他人。第二条是利用 Cloudflare,Akamai,Imperva 或其他拥有基础架构和网络过滤器的专家的力量,来确保流量永远不会到达您的服务器。

0%