DNSSec 是普通的 DNS,但带有签名。它绝对可以防止 DNS 欺骗;这就是它的用途,它就是这样做的。
理论上,注册商仍然可以滥用他们的立场,因为他们负责将您的意图传达给根服务器。这包括有关您的 DNSSec 密钥的信息。这种关系永远不会改变;如果您不能信任您的注册商,请找一个新的注册商。
DNSSec 不能防止 MITM 攻击。它绝对可以防止 DNS 欺骗。但是,除了 DNS 欺骗之外,还有其他方法可以将自己插入到流量中。
怎么运行的
从本质上讲,您通过创建记录告诉注册商您的签名密钥的指纹DS
,并且该信息将从您的 TLD 中获得,该上游密钥以类似的方式链接到单个全球受信任的密钥。
通过此设置,您的密钥现在被视为您域的受信任机构,并允许签署您的 DNS 记录。因此,现在为您区域中的每条记录创建一个RRSIG
包含相关数字签名的相应记录。
现在,当有人在您的区域中查找域时,您不仅可以发送响应,还可以发送相应的RRSIG
记录,表明响应是由您签名的。为了验证签名,客户端获取您的 DNSKEY 记录,其中包含您的完整公钥,然后只需遵循正常的加密签名验证技术。
显然该DNSKEY
记录也有自己对应的RRSIG
记录,这样你就可以验证它没有被篡改。但更重要的是DS
,您的父区域有一条可用记录(请记住,您在第一段中将其提供给了您的注册商),其中包含有关您的公钥的足够信息,以验证您的DNSKEY
记录实际上已被授权用于您的区域。
反过来,该 DS 记录由您父母的 DNSKEY 签名,在根区域中有相应的 DS 记录。这样,所有密钥签名都可以追溯到单个受信任的来源。
问题
当您需要告诉某人某条记录不存在时,就会出现复杂情况。显然,响应需要签名,但通常 DNS 服务器本身无法访问您的签名密钥,也无法即时签署响应;签名都是提前“离线”创建的。如果您的 DNS 服务器受到威胁,这可以防止您的密钥被泄露。
因此,相反,您将子域按字母顺序排列并说“对于 和 之间的每个名称mail.example.com
,pop.example.com
不存在其他子域”并签署该断言。然后,当有人要求您时,nachos.example.com
您可以只给他们那个响应(已经签名)并且客户知道因为nachos.example.com
按字母顺序介于mail.example.com
and之间pop.example.com
,那么“这个域不存在”响应被认为是正确签名的并且实际上来了从你那里。
这成为问题的地方在于,通过一组明确指出“X
和之间不存在响应”的负面响应Y
,您可以轻松地准确绘制出整个区域存在哪些域。您知道“X”存在,并且你知道“Y”的存在,并且你知道它们之间没有别的东西。只要再随机戳一下,你就可以快速编译出所有确实存在的记录的列表。
争议
关于这是否是一个问题,DNS 世界中有两个阵营。第一组说:
“如果人们知道存在哪些区域怎么办;DNS 是公共信息。无论如何,它从来都不是秘密。”
第二组说:
“这是一个安全风险。如果我有一个名为 的服务器accounting.example.com
,那么入侵我网络的人可以快速判断哪台机器上有大量信息,因此要攻击哪台。”
然后第一组回复:
“那就不要这么说!如果您的整个安全模型都是基于对公共信息保密的概念,那么您,先生,就是个白痴。”
第二组回答说:
“这不是保守秘密,而是不要透露比你必须透露的更多的信息。”
等等,令人作呕。
DNS(和 DNSSec)主要由第一阵营的人设计;DNS 是公共的,因此能够映射出域中存在哪些子域并不是一个重大的安全问题。无论如何,你真的不能以任何其他方式签署负面回应。
另一方面,服务器往往由第二阵营的人运行。他们担心自己网络的安全,他们不想泄露任何不必要的信息,因为他们知道所有信息最终都会被用来对付他们。
所以你有一个协议在密码学上是健全的并且功能完善,但现实世界的管理员往往不愿实施。
我想,我们最终都会到达那里。毕竟,与映射子域所带来的任何危险相比,DNS 欺骗更像是一个现实世界的问题。但改变需要令人信服。所以我们在这里......仍然。