dns - 联合王国 使用 DNSSEC 进行 dns 区域验证
问题描述
长时间的听众,第一次来电。
我正在编写一个包含 DNSSEC 验证的 DNS 解析器,并且在对受影响的 RFC 进行了几次通读后,我注意到了一些我无法真正理解的东西。
在解析uk.
(特别是co.uk.
)TLD 中的域期间,我遇到了 DNSSEC 验证触发的无限循环。为了简单起见,我们假设该进程已经缓存了所有根区域,所以让我们从那里开始:
co.uk. IN NS
在其中一个注册的uk.
名称服务器上执行查询; <<>> DiG 9.10.5 <<>> co.uk. NS @nsa.nic.uk +dnssec ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54513 ;; flags: qr aa rd; QUERY: 1, ANSWER: 9, AUTHORITY: 0, ADDITIONAL: 14 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags: do; udp: 4096 ;; QUESTION SECTION: ;co.uk. IN NS ;; ANSWER SECTION: co.uk. 172800 IN NS dns3.nic.uk. co.uk. 172800 IN NS dns2.nic.uk. co.uk. 172800 IN NS dns1.nic.uk. co.uk. 172800 IN NS nsb.nic.uk. co.uk. 172800 IN NS nsc.nic.uk. co.uk. 172800 IN NS nsa.nic.uk. co.uk. 172800 IN NS nsd.nic.uk. co.uk. 172800 IN NS dns4.nic.uk. co.uk. 172800 IN RRSIG NS 8 2 172800 20180622150723 20180518150505 33621 co.uk. pYoHwxWpkPP6FfIUk14o5qsO0cxA3CaPvfKGT++MuBhW9Ls/7Xnl6WwE pyU3BIDylkVyELe6be6hCwVOfV3VWcT1JW86RJexhRtU74ZHWdVNnjYd +oQVOQ0V/rhDorVSKdA0G+uDyq11T6Z1ecCERlks63GF21aPM9bWEJD6 cOo= ;; ADDITIONAL SECTION: nsa.nic.uk. 172800 IN A 156.154.100.3 nsb.nic.uk. 172800 IN A 156.154.101.3 nsc.nic.uk. 172800 IN A 156.154.102.3 nsd.nic.uk. 172800 IN A 156.154.103.3 dns1.nic.uk. 172800 IN A 213.248.216.1 dns2.nic.uk. 172800 IN A 103.49.80.1 dns3.nic.uk. 172800 IN A 213.248.220.1 dns4.nic.uk. 172800 IN A 43.230.48.1 nsa.nic.uk. 172800 IN AAAA 2001:502:ad09::3 dns1.nic.uk. 172800 IN AAAA 2a01:618:400::1 dns2.nic.uk. 172800 IN AAAA 2401:fd80:400::1 dns3.nic.uk. 172800 IN AAAA 2a01:618:404::1 dns4.nic.uk. 172800 IN AAAA 2401:fd80:404::1
- 在任何事情之前(例如将响应元素视为有效),应该进行 DNSSEC 验证;所以我们很自然地对 RRSIG 签名的 DNSKEY 执行查询(我们注意到这
co.uk.
是记录的签名者) - 为了获得区域的 DNSKEY,
co.uk.
我们需要知道该区域的 NS 权威(提醒,我们已经拥有该信息,但尚未设法验证它),因此我们co.uk. IN NS
向父区域 (uk.
)发起查询名称服务器,我们又回到了起点。
我确定这是一个设计缺陷,但无法真正理解是什么。从逻辑上讲(这里触发循环的关键步骤是)在验证之前不应该考虑使用 RR,并且从逻辑上讲,子区域委派记录也不应该使用子区域的 DNSKEY 进行签名,我认为甚至如果父区域也对子区域具有权威性。
请帮助并提前感谢您
解决方案
正如您所注意到的,相同的名称服务器对 .UK 和 CO.UK 都具有权威性,因此您没有从父区域获得正常的推荐响应,该响应将在权威部分中有 DS 和 NS 记录,而是权威来自子区域的响应,在答案部分带有 NS 记录。
因此,正如您意识到的那样,您确实需要对 .UK 名称服务器进行额外的 DS 查询,但请注意,您不需要该 DS 记录来验证 NS 记录的 DNSKEY 和 RRSIG 记录。在正常委托响应中返回的(非顶点)NS 记录没有签名,也不需要验证。当您返回子区域响应时,NS 记录是顶点记录,并且(如果该区域是 DNSSEC 签名的)NS 记录集将有一个 RRSIG,但在使用它们之前不需要验证这些 NS 记录作为区域的名称服务器。验证递归名称服务器仅在处理来自客户端的显式 NS 查询时才需要验证 NS 记录。
最终,DNSSEC 依赖于验证区域中的数据,而不是提供它们的名称服务器的名称或地址。这与仅对服务器(可能还有客户端)端点进行身份验证的许多其他安全协议(例如 HTTPS)有很大不同。
推荐阅读
- python - Pandas read_csv 具有正确的标题,但列名是 None
- excel - 使用 vba 将我当前帐户的余额从网页复制到 Excel
- audit.net - Audit.Net 实体框架 - 独立关联 [表多对多]
- javascript - 以不同的方式声明相同的函数会改变 Javascript 中的编译代码
- sql - 如何从另一个表插入一个表并使用函数
- r - DataTable 上的列未对齐;R 包装:DT
- java - 如何为java GUI编写登录名
- python - 将前导零添加到没有 zfill、格式、循环或控制语句的字符串
- vb.net - 字符串中的 VB.net 变量被忽略
- pouchdb - 本地 PouchDB 实例之间的复制