来自 DDOS 2021-07-17 20:18 的文章

ddos防御攻击_燕云盾萝_如何防

ddos防御攻击_燕云盾萝_如何防

正如您可能已经在我们的英特尔辛烷固态硬盘存储博客文章中所读到的,我们已经深入研究了一些令人兴奋的独立研究。我们的研究启发我们去探索并提出一个问题:在保护Docker注册中心时,不遵循最佳实践的真正危险是什么?不出所料,危险是真实存在的,并且表现为一个有趣的Docker引擎漏洞,下面解释。我们发现Docker引擎容易受到zip轰炸的攻击,zip轰炸是一种非常古老的技术,其特点是使应用程序解压缩高度压缩的文件,从而导致系统资源耗尽。易受攻击的版本包括:1.12.6-0、1.10.3、17.03.0、17.03.1、17.03.2、17.06.0、17.06.1、17.06.2、17.09.0及更早版本背景在研究了在Docker环境中,如果没有遵循文件系统驱动程序选择的最佳实践(我们在前面提到的Intel文章中探讨了这一点),我们想深入一点,看看默认设置背后还隐藏着什么其他危险。在资源耗尽的情况下,如何防御ddos么,我们查看了其他图像构建特性,发现了Docker引擎本身的一个缺陷。运行Docker应用程序的基本单元是容器,它运行在Docker引擎上。运行中的容器是从容器映像实例化的,容器映像很容易以压缩存档的形式打包和运送,或者通过Docker注册中心(Docker registries)来实现,后者本质上是一种特殊用途的内容寻址blob存储区。当Docker引擎需要Docker应用程序时,引擎通常会尝试将其从注册表中拉出,然后将其扩展到磁盘并运行封闭的应用程序。Docker容器图像由层组成。每个层表示构建过程中前一步的文件系统增量。如果您熟悉虚拟机(VM)基础设施,您会知道这听起来很像虚拟机的磁盘快照工作原理。这里需要指出的一个重要区别是,Docker映像层中表示的增量是文件级的,而不是像VM快照那样的块级的。Docker引擎(在覆盖文件系统的帮助下)允许在不同的映像之间共享相同的层,从而减少具有共同父代的图像集合的磁盘占用空间。在Docker引擎从Docker注册表中提取的图像层中,是构建过程中特定步骤中对文件系统所做更改的tarfile。整个层以gzip文件的形式提供,然后扩展到磁盘上的一个目录中(根据配置的文件系统驱动程序,cc攻击防御原理,该目录通常位于/var/lib/docker下)。一旦所有层都展开并写入磁盘,Docker引擎使用操作系统overlays的底层功能(假设Linux内核版本4+并且遵循了配置Docker引擎的最佳实践),服务器怎么有效防御ddos,将所有这些层组合到一个文件系统挂载中。这个文件系统装载成为容器内应用程序的根文件系统。如果你是一个BSD或Linux系统管理员,你很可能会看到这一切与chroot监狱有些相似之处。值得指出的是,Linux内核中实现了许多保护(cgroups、namespaces等),以使容器更安全;以在Docker引擎内创建更稳定、更安全的操作环境为名,限制运行容器的资源消耗和访问。然而,Docker引擎本身并没有对至少一个不严格涉及到容器运行的操作进行限制,这就是事情变得有趣的地方。所以这就是问题的症结所在我们尝试通过在常规构建过程中创建一个大文本文件(值20GB的零)并将其加载到Docker注册表中并从单独的Docker引擎运行它,来测试膨胀层对Docker引擎的影响。对包含该文件的大文件进行解压缩后运行。(Docker注册表是一个内容寻址blob存储,记得吗?)我们的下一个问题是:Docker引擎对Docker注册表发布的内容有多信任?答案最终是,可能比它应该做的更多。在Docker注册表中,每个映像都由一个清单文件表示。这个清单文件包含元数据,比如在构建过程中运行的创建映像的命令、每个层的SHA256指纹(这是内容可寻址的密钥)以及与映像相关的其他信息。为了更新映像,客户机(Docker引擎或其他定制客户机)必须拉取清单,ddos攻击及防御,上载更改的层(以每层的gzip文件的形式)并更新清单,华为DDOS攻击防御,引用新层。理想情况下,gzip将包含一个tarball,这正是Docker引擎所期望的。人们还希望在解压缩每个层之前,在引擎中进行一些验证,以确保内容没有格式错误。事实并非如此。为了测试Docker引擎中的层验证,我们将20GB的零压缩到一个gzip归档文件中。这不是tar档案中的文件形式。只需20GB的零,gzip压缩到20MB左右,并作为Docker注册表中现有图像的另一层提供。当我们试图提取中毒图像时,Docker引擎中运行着一个Ubuntu容器。Docker引擎内存不足并死机,导致我们执行中毒图像拉取时正在运行的"金丝雀"容器。答对 了!只要gzip文件的未压缩内容超过可用内存量,引擎就会崩溃,所有正在运行的容器都将被终止。如果您遵循最佳实践,这肯定是一个外部情况。有人必须将凭据泄露给对您环境中使用的Docker注册表中的映像具有写访问权限的帐户。你必须让你的私人登记处向全世界开放。但是,Docker注册表的默认配置不实现加密或身份验证,更不用说嵌入的身份验证材料仍然是一个常见的错误。一瞥https://shodan.io,搜索"Docker Distribution Api Version:registry/2.0"会返回750多个面向公共的注册表。我们没有费尽心思去查看哪些注册中心没有正确配置身份验证,但我们肯定都同意,最好不要不必要地公开任何注册中心,这样一来,泄露的凭证就更难使用了。那你怎么保护自己呢?1不要使用你不信任的图片。如果应用程序是关键的,则始终可以从头开始构建映像。如果必须使用公共映像,请考虑将基本映像(Dockerfile中的FROM行)固定到摘要,而不是图像标记(来源:https://docs/docker.com/docs/engine/reference)2如果您运行自己的私有注册表:遵循Docker的最佳实践!看到了吗https://docs.docker.com/registry/deploying/千万不要这样做:https://docs.docker.com/registry/#tldr除非您所处的环境无法提供证书。不要养成坏习惯。始终使用身份验证和HTTPS,即使您的注册表有受保护的网段。Docker提供了一个可信的注册表,可以简化访问管理等。如果你有预算和一个好的用例,你绝对值得花时间去看看。三。在实现自动化过程时,请记住这种情况。如果您的自动化系统将根据标记映像的shasum的变化触发部署,那么所需做的就是毒害一个广泛使用的映像,从而阻碍您的生产基础设施。进行部署前检查,以确保生产的产品是按照批准的流程构建的。实现图像签名和验证。4尽早和经常分析你使用的图像。确保图像中没有隐藏秘密将漏洞评估作为CI/CD过程的一部分,并在缺陷出现在生产之前发现它们。保持生产容器状态和行为的可见性,特别是在不运行只读容器的情况下。注意你的注册表日志。通过您的SIEM或日志管理系统收集它们,并密切关注诸如失败的身份验证尝试或涉及可信网段之外的工作负载的身份验证事件。对进程外映像更新大发脾气-进程是有原因的。这个发现归功于Hana Lee(Github:@mong2)证明了漏洞并创造了最初的概念验证漏洞。Docker(Moby)错误参考:https://github.com/moby/moby/issues/35075