重新审视DNS查询隐私

2020-09-12 10:19:11

我在2019年8月写了这篇帖子的第一个版本,并以这样的评论结束:“很可能在一年左右的时间里,我们会回到这个衡量QNAME最小化使用情况的标准上,看看今天的情况是否有什么变化。”

好了,一年过去了,现在是回顾这个主题的时候了,看看DNS解析环境在过去12个月里发生了什么变化。

最近,关于域名系统(DNS)作为查看终端系统行为和推断用户行为的一种手段的使用,人们已经说了很多,也写了很多。

几乎每一笔交易都以DNS查询开始,如果要将互联网用户生成的完整的DNS查询集合起来,就有可能对他们的在线活动进行相对完整的描述。多年来,DNS的这一方面作为观察他人活动的一种手段,很少受到主流的关注,但最近对国家和私人数字监视的敏感性已经引起了对DNS隐私这一总体主题的极大关注。

引起如此关注的另一个原因是,在隐私方面,DNS解析协议遗憾地缺乏一些基本的隐私保护。DNS名称解析协议在设计时没有将隐私作为首要考虑因素。查询和响应是未加密的,这使得它们很容易受到恶意的中间人操纵,并且它们会将多余的信息泄露给第三方旁观者。

第一种方法是通过对DNS事务使用加密来使窃听DNS查询变得更加困难。围绕加密的问题以及使用DNS-over-TLS(DOT)和DNS-over-HTTP(DoH)的努力是当前DNS世界非常感兴趣的话题。

第二种方法是通过减少每个DNS查询中的信息量来减少信息泄漏。IETF发布了一种使用一种名为“查询名称最小化”(QNAME最小化或Qmin)的技术来实现这一点的方法,该技术在一份实验性RFC文件(RFC 7816,“DNS查询名称最小化以改善隐私”,由Stephan Bortzmeyer,2016年3月)中进行了描述。

在这篇文章中,我们将更详细地再看一看QNAME最小化,并展示我们测量这种解析器查询技术在当今互联网中的当前使用水平的一些结果。

RFC 7816中描述的技术是一种基于在RFC 6973中描述的原理的查询管理方法,该原理可以概括为“您发出的数据越少,您可能遇到的隐私问题就越少”。

DNS通常为了简单和性能而优化其行为。DNS名称解析协议中的基本因素是,DNS递归解析器不一定事先知道哪些服务器是给定区域的权威服务器,因此它必须发现此信息。此外,如果一个名称有多个标签,则解析器不一定知道标签之间发生区域剪切的位置。

例如,区域c.example.com可能包含标签b的委派记录。区域b.c.example.com可能包含标签a的委派记录。区域a.b.c.example.com可能包含此名称的资源记录。在这种情况下,域名a.b.c.example.com中存在b和c之间以及a和b之间的区域剪切。或者,区域c.example.com可能包含标签A.B的资源记录,在该记录中,c.example.com下没有进一步的区域削减。

这里的要点是,解析器不能仅仅通过检查区域切割可能在哪里的域名来提前确定。它们由解析器在名称解析过程中发现。

区域剪切可以涉及区域管理员部分将区域管理角色分割到不同服务器的愿望,它们还可以涉及管理控制的改变,其中剪切下的名称空间被委托给不同的管理实体。

IETF于2014年特许成立了DBIND工作组,致力于制定一种方法,明确这些与行政控制变更相关的授权点。其想法是允许DNS自我描述DNS名称层次结构本身内的这些管理控制点的更改点。这项努力旨在取代志愿者运营的公共后缀列表,该列表存在一些令人担忧的缺点。DBIND工作组花了几年时间编写一份问题陈述。该组织在2017年初被关闭,没有发表任何作为RFC的工作。取而代之的是,我们继续依靠Mozilla基金会的志愿者努力来维护公共后缀列表,目前我们在脑海中别无选择。也许这种对志愿者努力的依赖可能会在未来几个月作为一个问题重新浮出水面,因为目前不利的经济状况影响着Mozilla。

这种对志愿者昔日工作的隐性依赖是早期互联网的一个特点,或许也是它当时的核心优势之一。如今,互联网是一个价值万亿美元的行业,当志愿者的努力支撑着互联网的大量商业运营服务基础设施时,仍然发现对志愿者努力的关键依赖似乎有点不舒服。

在没有关于命名空间结构的这种元信息的情况下,DNS递归解析器在所有查询中使用完整的查询名称,因为它沿着名称分层结构向下查找最低级别的权威名称服务器,因为这种迭代技术将暴露每个区域的区域切割和名称服务器。

在此稍加说明,DNS解析是以“自上而下”的方式进行的,当区域的权威服务器接收到对只能在委派的从属区域中解析的名称的查询时(即,在区域层次结构中比此权威服务器所服务的区域更低的区域层次结构中的级别),它在其响应(“NODATA”响应)中返回NOERROR代码和无应答部分(No Answer Section)。该响应包括下一个较低级别的委派区域的名称及其名称服务器,如响应的授权记录(区域切割点)中所列举的,并且假设这些地址对于权威服务器是已知的,则将这些名称服务器的IP地址包括在响应的第二附加部分中。

DNS是一个严格的分层命名空间,因此每台服务器只知道立即委派的区域。名称解析过程将在层次结构中向下迭代,以到达可以为此查询名称提供权威响应的服务器,或者获得指示该名称在DNS中不存在的响应。此过程如图1所示。

当然,高效的递归解析器将在任何可能的时候使用缓存的信息,因此该过程通常远不像从非正式描述中看起来的那样详尽和缓慢。

这种描述并不完全适用于所有情况。服务器可以是‘父’区域及其委托的‘子’区域的一些或全部的权威服务器。查询不指定哪个区域是其查询的预期主题,从而允许服务器使用名称层次结构中与查询名称部分匹配的最特定服务区域中的数据来回答查询。

实现QNAME最小化并且其高速缓存中还没有答案的解析器不是向上游发送完整的QNAME和原始QTYPE,而是向授权的名称服务器发送请求,以寻找原始QNAME的最接近的已知祖先。该请求是通过以下方式完成的:

作为原始QNAME的QNAME,仅剥离为服务器授权区域之外的一个标签