如何设置“安全”开放式解析器?


25

这是有关保护公共DNS解析器安全的规范问题

开放式DNS服务器看起来很整洁和方便,因为它们提供了IP地址,无论它们位于何处,我们都可以在公司内部一致地使用它们。Google和OpenDNS提供了此功能,但是我不确定我是否希望这些公司访问我们的DNS查询。

我想设置一个类似的东西供我们公司使用,但是我听到很多关于这是危险的做法(特别是在放大攻击方面),并且我想确保我们做得到正确。建立此类环境时,我需要牢记哪些事情?


5
反对票使我咯咯笑。
Andrew B

Answers:


34

您需要了解以下几点:


这是一个网络工程问题。

希望建立这种类型的环境的大多数人是系统管理员。太酷了,我也是系统管理员!工作的一部分是了解您的责任在哪里结束,别人的责任在哪里开始,并相信我,这不是系统管理员可以自己解决的问题。原因如下:

  • UDP是无状态协议。没有客户端握手。
  • 针对DNS服务器的查询是未经身份验证的两步交易(查询,回复)。服务器无法在答复之前知道源IP是否已被欺骗。
  • 到查询到达服务器时,为防止欺骗性UDP数据包已经为时已晚。只能通过称为入口过滤的做法来防止欺骗,该问题由文档BCP 38BCP 84涵盖。这些由位于DNS服务器前面的网络设备实现。
  • 我们无法为您提供有关如何从头到尾设置数据中心或如何实施这些最佳实践的演练。这些东西非常适合您自己的需求。问答格式对此不起作用,并且本网站也不能替代雇用专业人士来从事专业工作。
  • 不要以为您的十亿美元大公司倒闭就正确地实施了入口过滤。

这不是最佳实践。最佳做法是不要这样做。

设置面向Internet的DNS解析器非常容易。建立一个系统所需要的研究远远少于了解这样做所涉及的风险。这是善意无意中助长了他人的过失(和苦难)的情况之一。

  • 如果您的DNS服务器将响应它看到的任何源IP地址,则说明您正在运行开放式解析器。这些不断被用于对无辜方的放大攻击中。新的系统管理员每天都会站起来开放解决方案,这使恶意人员不断进行扫描很有利。真正的问题是,是否要在攻击中使用您的开放式解析器:从2015年开始,这已成定局。它可能不是立即的,但肯定会发生。
  • 即使使用DNS软件(即BIND)应用ACL,所有这些操作也限制了服务器将答复的欺骗DNS数据包。重要的是要了解,您的DNS基础结构不仅可以用来攻击ACL中的设备,还可以用来攻击DNS服务器与其将响应的设备之间的任何联网设备。如果您不拥有数据中心,那么这不仅仅是您自己的问题。

Google和OpenDNS可以这样做,为什么我不能呢?

有时有必要权衡现实与热情。以下是一些很难问自己的问题:

  • 这是您想一时兴起的东西吗,还是您有几百万美元可以投资做的事情呢?

  • 您有专门的安全团队吗?专门的虐待团队?他们两个都有处理新基础设施滥用的周期,以及是否会收到来自外部各方的投诉?

  • 您有法律团队吗?

  • 当所有这些事情都说完并完成后,所有这些努力会否甚至遥遥无期地开始为自己付出代价,为公司扭亏为盈,或者超过处理导致您朝这个方向带来的不便的金钱价值?


最后,我知道这个问题对于与该链接有关的大多数人来说,问答是一种失望。Serverfault是在这里提供答案的,通常认为“这是一个坏主意,不要这样做”的答案不是很有帮助。有些问题比一开始看起来要复杂得多,这就是其中之一。

如果您尝试执行此工作,则在尝试实施这种解决方案时仍可以向我们寻求帮助。主要要意识到的是,问题本身太大,无法以方便的问答格式提供答案。您需要投入大量时间来研究该主题,并向您提供在实施过程中遇到的特定逻辑问题。此次问答的目的是使您更好地了解全局,并帮助您理解为什么我们不能回答这个问题。

帮助我们确保互联网安全!:)


5
作为补充,人们可以通过openresolver项目检查他们在公共范围内没有开放的dns中继。每个人都应该记住,互联网包含大约2000万个开放中继,它们接受递归查询。结果的一个例子:CloudFlare遭受了0.1%的300 Gb / s DNS放大攻击
Xavier Lucas

您不能禁用UDP并强制所有查询改为使用TCP吗?
小太郎

@小太郎请参阅此问题。解析器库将默认为UDP模式,并且在许多情况下,如果回复被截断,则使用TCP重试,仅此而已。如果应用程序绕过OS并执行自己的查找,它将可以正常工作,但这通常会破坏人们试图通过此设置来完成的目的。
安德鲁B

0

无论您是运行开放的DNS递归服务器还是权威的DNS服务器,问题都是相同的,并且大多数可能的解决方案也是相同的。

最好的解决方案

DNS cookie是一项提议的标准,它为DNS服务器提供了一种要求客户端发送cookie的方式,以证明客户端IP地址未被欺骗。第一次查找将花费一次额外的往返,这是任何解决方案都可以提供的最低开销。

老年客户的后备

由于DNS cookie尚未标准化,因此现在和未来几年当然需要支持老客户。

您可以对没有DNS cookie支持的客户端的限制请求进行评分。但是速率限制使攻击者更容易对您的DNS服务器进行DoS。请注意,某些DNS服务器具有仅用于权威DNS服务器的速率限制功能。由于您正在询问递归解析器,因此此类速率限制实现可能不适用于您。设计上的速率限制将成为服务器的瓶颈,因此,与没有速率限制的攻击者相比,攻击者需要向您发送更少的流量才能导致合法请求被丢弃。

速率限制的优点之一是,如果攻击者确实向DNS服务器发送了DNS请求,则您更有可能留下剩余容量,使您可以通过SSH攻击服务器并调查情况。另外,速率限制可以设计为主要丢弃来自发送许多请求的客户端IP的请求,这可能足以保护您免受无法访问欺骗性客户端IP的攻击者的DoS攻击。

出于这些原因,将速率限制在实际容量之下是一个好主意,即使它实际上并不能防止放大。

使用TCP

可以通过发送错误代码指示客户端对于UDP太大而强制客户端使用TCP。这有两个缺点。它需要花费两个额外的往返时间。而且某些故障客户端不支持它。

使用此方法,可以将两次额外往返的成本限制为仅第一个请求:

当尚未确认客户端IP时,DNS服务器可以发送截断的响应以强制客户端切换到TCP。截短的响应可以和请求一样短(如果客户端使用EDNS0而响应不使用,则更短),这可以消除放大。

任何可以完成TCP握手并在连接上发送DNS请求的客户端IP都可以暂时列入白名单。一旦列入白名单,IP便可以发送UDP查询和接收UDP响应,最大512字节(如果使用EDNS0,则为4096字节)。如果UDP响应触发了ICMP错误消息,则会再次从白名单中删除IP。

该方法也可以使用黑名单来逆转,这意味着默认情况下允许客户端IP通过UDP查询,但是任何ICMP错误消息都会将IP列入黑名单,而需要进行TCP查询才能摆脱黑名单。

可以将覆盖所有相关IPv4地址的位图存储在444MB的内存中。IPv6地址将必须以其他方式存储。

我不知道是否有任何DNS服务器已实现此方法。

还据报道,某些TCP堆栈可用于放大攻击。但是,这适用于任何基于TCP的服务,而不仅仅是DNS。应该通过升级到内核版本来缓解此类漏洞,在该内核版本中,TCP堆栈已固定为响应SYN数据包不发送多个数据包。


公平地说,我的答案集中在我们手中掌握的开箱即用技术上。在Serverfault上提出此问题的大多数人都不想开发自己的名称服务器软件,也不希望为现有的名称服务器软件编写补丁。Alnitak告诉我们,您所建议的TCP +白名单方法似乎已申请专利,尽管他没有引用确切的专利。
安德鲁B

另外,您是否能够使用任何实现RRL的当前DNS服务器软件来产生您提到的DoS攻击,或者知道有人实现了它的情况?我很确定这会出现在我订阅的任意数量的邮件列表中。
Andrew B

@AndrewB我尚未测试,因为我不想在其他人的服务器上造成洪灾。而且有些提到速率限制的人的态度使我认为,如果我在自己的服务器上进行操作,他们将不会相信结果。但是由于您要求我尝试一下,因此我只需要设置一个单独的DNS服务器来对其进行测试。在Ubuntu LTS 14.04上使用默认的绑定版本听起来是否明智?您认为此测试合理的权威服务器上的哪些确切设置?
kasperd '16

不幸的是,我不是要求设置的最佳人选,我们还没有开始实验室测试。我仍然鼓励您尝试创建建议的方案:无论您与之交谈的各方是什么态度,都有来自多个软件安装基础的众多参与者都对实际利用感兴趣。我还建议您使用SNMP监视UDP接收队列溢出,该图表将有助于证明您是否成功使软件接受数据包的能力陷入困境。
安德鲁B

@AndrewB我刚刚在这里意识到一个小的差异。这个问题是关于递归解析器的。但是速率限制不是为递归解析器设计的。Deliberately open recursive DNS servers are outside the scope of this document.目前,我已经对此进行了警告。我应该测试是否甚至有可能对配置为递归解析器的Bind启用速率限制,以及它是否将正常运行。
kasperd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.