2

长时间的听众,第一次来电。

我正在编写一个包含 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 进行签名,我认为甚至如果父区域也对子区域具有权威性。

请帮助并提前感谢您

4

1 回答 1

0

正如您所注意到的,相同的名称服务器对 .UK 和 CO.UK 都具有权威性,因此您没有从父区域获得正常的推荐响应,该响应将在权威部分中有 DS 和 NS 记录,而是权威来自子区域的响应,在答案部分带有 NS 记录。

因此,正如您意识到的那样,您确实需要对 .UK 名称服务器进行额外的 DS 查询,但请注意,您不需要该 DS 记录来验证 NS 记录的 DNSKEY 和 RRSIG 记录。在正常委托响应中返回的(非顶点)NS 记录没有签名,也不需要验证。当您返回子区域响应时,NS 记录是顶点记录,并且(如果该区域是 DNSSEC 签名的)NS 记录集将有一个 RRSIG,但在使用它们之前不需要验证这些 NS 记录作为区域的名称服务器。验证递归名称服务器仅在处理来自客户端的显式 NS 查询时才需要验证 NS 记录。

最终,DNSSEC 依赖于验证区域中的数据,而不是提供它们的名称服务器的名称或地址。这与仅对服务器(可能还有客户端)端点进行身份验证的许多其他安全协议(例如 HTTPS)有很大不同。

于 2018-07-01T22:55:04.697 回答