使用挖矿防止对websocket的DDOS攻击:这是一个可行的解决方案吗?

信息安全 网络 哈希 网络服务器 服务器 ddos
2021-08-19 17:00:01

我正在考虑以下方法是否是完全完全防止我的服务器上的 ddos​​ 的好方法。我的想法是使用相同的加密货币挖掘机制(比特币,使用 sha256 或任何其他哈希)来防止 DDOS。

注意:我不建议挖掘加密货币本身。我建议使用相同的机制来避免Sybil 攻击

为什么想法看起来很吸引我?因为创建一个挖掘的哈希是昂贵的,但验证它是超级便宜的。它只需要计算一次哈希。

简而言之,采矿意味着什么?这意味着有一个特定的数据块(比如会话 ID 或 JWT 令牌,可以存储在高性能 NoSQL 服务器中的服务器中),并且用户(或加密货币中的矿工)必须创建一个哈希值符合某些条件。例如,如果我们使用 SHA256,我们可以将难度定义为哈希结果的 256 位结果数中前导零的所需数量。更多的零使找到该散列的概率更加困难。

它是如何工作的?:用户将获取会话令牌(由服务器创建),并将其与随机数(使用一次的数字)组合,并在其前端计算哈希(通过 WASM,或使用 javascript)。由于用户无法对 SHA256 进行逆向工程,他所能做的就是不断地一次又一次地更改随机数,直到他找到一个创建满足所需难度的哈希的随机数。

在此处输入图像描述

该图显示了在比特币中找到一个块(找到正确的随机数)的概率,其中选择了难度使其达到 10 分钟。改变难度会改变这条曲线并按比例改变它的宽度。

服务器验证需要多长时间?几乎为零。只需计算一次哈希并确保它与给定的难度匹配,并授权用户提出任何匿名请求。请注意,这些都不需要使用用户名和密码进行身份验证。这都是匿名的。经过身份验证的用户不需要这样做,因为他们的凭据可能会被系统禁止。这一切都适用于匿名用户(可能还有攻击者)。

结果:在向服务器发出任何请求之前,用户必须以这种难度计算这个哈希值。一旦用户成功,挖掘的身份验证令牌可以存储在 cookie 中以供用户重复使用。如果用户未能提供所请求的哈希,他的连接请求将被突然拒绝,从而防止使用 sock-puppets 进行 DDOS 攻击。

ASIC抗性:不推荐使用 SHA256,因为有专门的硬件可以非常快速地计算它,从而导致可能的协同攻击。有些哈希值很难在硬件上打印,例如 Scrypt 和 Argon2。

选择难度:难度可以是静态的(我不推荐),也可以是动态的以随着网络负载而变化。当存在高网络负载时,增加了所需的难度。这基本上将充当过滤器并在 DDOS 攻击期间保护网络,并且永远不会影响用户,因为用户通常不会在意等待 10 秒来创建会话。在负载非常高的情况下,用户可以选择计算昂贵的 nonce,或者稍后再回来。托管公司还可以根据随时间推移的难度图表来决定是否需要扩展基础设施。

这是防止 websocket 和类似公共协议上的 DDOS 的合理计划吗?我想在我的服务器上实现这个。


编辑:需要明确的是,这不是各种 DDOS 的灵丹妙药。但这可以防止用户操纵服务器的内部功能 + 难以使用服务器功能耗尽带宽。我很想知道为什么这可能会或可能不会起作用,而不是总结这是新的还是旧的。

2个回答

TL;DR:这不是针对典型 DDOS 的解决方案。它可能是针对某些非常特定于应用程序的 DOS 的保护。

拿走你的想法的所有挖掘内容本质上意味着客户端连接到服务器以获取一些难以解决的任务,然后返回为该任务提供易于验证的解决方案。

这种方法的问题是客户端需要首先连接到服务器,并且服务器需要能够向客户端回复任务。这意味着您的想法无法抵御最常见的面向带宽的 DDOS 攻击,这些攻击只是发送比上游系统或服务器可以处理的更多的流量。它也无助于抵抗试图耗尽服务器本身资源的简单 DDOS 攻击,例如SYN 泛洪Slowloris 之类的攻击

它实际上可以帮助抵御针对处理后期阶段的攻击,即特定于应用程序的攻击。但这实际上并不是该领域的一个新想法,它本质上只是另一个众所周知的工作量证明系统

所以,我们现在只讨论应用层 DDoS 攻击。

您提出的建议是众所周知的工作证明许多尝试将这种通用方法用于对抗应用层 DDoS 攻击,但收效甚微。

基本上,您为可疑机器人引入的挑战要么简单且短到足以在几到几十秒内完成,要么需要很长时间。

  1. 在第一种情况下,一个典型的僵尸网络被认为控制了数千台机器,攻击者或多或少地免费获得了这些机器上的所有计算资源。强迫所有这些机器只计算一次大约 10 秒并不能阻止攻击。

  2. 在另一种情况下,您可能仍然会失去一个网站的几乎所有客户,因为合法用户很少会等待几分钟来加载您的页面。实际上,流行的网站现在正在争取几毫秒的页面加载时间,并为此引入了许多技术(CDN、0-RTT 等)。因此,虽然您的服务器正式不会被恶意请求淹没,但最终结果几乎是相同的。

对于某些特定的应用程序,理论上,可能有一些理由来实现类似于您所想的技术。但不幸的是,对于一个任意的网站,它不会很好地工作。