2019-08-29

目前 dnssec 已经开始进入普及状态 icann也发布了DNSSEC的重要性说明 https://www.icann.org/resources/pages/dnssec-what-is-it-why-important-2019-03-20-zh 目前 dnssec的三个执行标准分别是:

  • RFC 4033 – DNS Security Introduction and Requirements
  • RFC 4034 – Resource Records for the DNS Security Extensions
  • RFC 4035 – Protocol Modifications for the DNS Security Extensions

还有另外几个拓展标准

  • RFC 4470 – Minimally Covering NSEC Records and DNSSEC On-line Signing
  • RFC 4641 – DNSSEC Operational Practices
  • RFC 5155 – DNS Security (DNSSEC) Hashed Authenticated Denial of Existence
  • RFC 6014 – Cryptographic Algorithm Identifier Allocation for DNSSEC

上面是dnssec的全部内容。

如果要理解的话,跟https是有点相似的。都是采用证书链加签名验证。有统一的可信组织下发签名。只是dnssec比 https 证书链简单一些。

网上的dnssec解释都很详细,但刚开始可能不好理解。 比如 wikipedia 上面。 我们只需要知道 dnssec 其实就是给dns 拓展了 几个记录,最核心的就是 RRSIG, DNSKEY, DS 这三种记录, 接下来根据这三种记录来分析一个域名是如何通过签名校验的

首先,用dig +dnssec www.netfilter.cc @8.8.8.8

www.netfilter.cc.   299 IN  A   104.31.67.69
www.netfilter.cc.   299 IN  A   104.31.66.69
www.netfilter.cc.   299 IN  RRSIG   A 13 3 300 20190328090907 20190326070907 34505 netfilter.cc. e0F/RHFsrC3XhaSTactLws/aB6kGJccfXVg9yL8JjvuOfRcj1GUX3sLg WpPVt4/wP3PMPcG8K+v9iocv4AO0Iw==

查询到三行记录,A记录,以及A记录的签名 RRSIG。我们可以了解到,RRSIG的信息是使用 keyid 为 34505 的zsk DNSKEY来 校验数据的

那么DNSKEY在哪儿呢,(用来校验RRSIG的DNSKEY必须由上层域名提供),也就是 dig +dnssec DNSKEY netfilter.cc @8.8.8.8

netfilter.cc.       3599    IN  DNSKEY  257 3 13 mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+ KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==
netfilter.cc.       3599    IN  DNSKEY  256 3 13 oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8 KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==
netfilter.cc.       3599    IN  RRSIG   DNSKEY 13 2 3600 20190422084745 20190221084745 2371 netfilter.cc. qh7P+uzK8hdTSOumKX7J9nftNIpXsb1z5CC1pqgVYCXB0p+KP0pmC5Ck rWdpjShgkH8Edy/JU5VjPkYNNo+TJQ==

我们看到了 两个DNSKEY,一个是类型257,一个是256,我们只需要知道257是ksk,256是zsk,另外,我们用一个直观一点的工具drill来查看这两个key的信息 drill DNSKEY netfilter.cc

;; ANSWER SECTION:
netfilter.cc.   3145    IN  DNSKEY  257 3 13 mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ== ;{id = 2371 (ksk), size = 256b}
netfilter.cc.   3145    IN  DNSKEY  256 3 13 oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA== ;{id = 34505 (zsk), size = 256b}

这里id 34505 就是zsk,我们就是用这个pubkey来校验 www.netfilter.cc a跟rrsig记录合法。 然后id 2371 这个ksk是只用来签名zsk的pubkey,所以 用ksk来签名校验 zsk跟zsk的RRSIG(也就是上面dig DNSKEY的时候也看到了RRSIG记录的而且指了该条RRSIG是用2371签名校验的),

这样的话,通过ksk,我们就知道zsk也是合法的了, 那么,如何知道ksk是合法的呢,就只能让上层域,也就是cc. 来验证该ksk了。那么我们是不是拿着ksk给cc.的DNSKEY来签名下不就行了?

没错。这时候用到DS记录 dig +dnssec DS netfilter.cc @8.8.8.8

netfilter.cc.       21599   IN  DS  2371 13 2 12B3AD211976F421C1D88AAC440CE141AAC4B44952E53A7F07F278DC 54D039DA
netfilter.cc.       21599   IN  RRSIG   DS 8 2 86400 20190402172012 20190326172012 56044 cc. Vg+SvF58yezFvwZ/CZJGrmsvARt8YS0GgRNkdWV0mpyIW1bzS6bbmaZw QU3o8gXkmAPJ4COAugTg8mtKNcJnLyFH6oZDQewH69D+lGBjXHsw5zFD cWTAymkDlpZ1ocyV5OrqUSIoN6y9gooX13BfbJDRAsD43ggxM/5Fjywj b90=

DS记录其实就是 上面 ksk的hash,DS记录本身就代表netfilter.cc的ksk 这时候,我们只要拿着 上层 cc. 的 DNSKEY(zsk)来 校验 DS记录+RRSIG DS记录通过,那么就可以说: 通过cc. 的DNSKEY,我们知道netfilter.cc 的 ksk是合法的

上面 看到 netfilter.cc 的RRSIG DS 显示了 上层 cc. 的 keyid 是 56044

我们看一下 drill DNSKEY cc.

cc. 18641   IN  DNSKEY  256 3 8 AwEAAbbuQDI33GIl2/9V27xNTtY3Lk1lJBCjB7UhFFi2rg5xVW6RlPCztvtNconm3I6bKiL9wCWR7YUi1qgEPNeL9Dr1aM/CKq8yI768kuuYOFS8Ld0uow8A1RFtuXq5gIrGJWzUjOUrS1sDVa8p1AMV0pYOMJobxGG4LNFraBbx27cX ;{id = 56044 (zsk), size = 1024b}
cc. 18641   IN  DNSKEY  257 3 8 AQPpexyFq/cE7G+Kh1V9tl7nccHwSH3KRpsm6Rqj3LHdI1LhaZpqfl/yg9elcY/I0G3o7Cc+BV3RpFpSZXSt1FCH7/gm8VG9ei5QxQoCcrhIV/EIDzW8E+oVKE//FtCP9WnZ7am4J+tErndII+mtJdppuAYjXk7ub0tgWfebl3zLHwZSxSIJ4ZWAEDvzV4nvBU1AxdNwBYnacWGqM38REh5nsTOkysX3TuH9VIz5lT3caMrFXyiq8aLBXo9KYmfwTs/wr2qtdvD3gFqspO22rDyEFPsrZIDBQtBx/hJFHAzvhaQGs3zH+Vzu1hrji9GZEvZC4dhhzMEl18ZRDpOebsaZ ;{id = 519 (ksk), size = 2048b}

果然这里查到了 cc. 的 zsk id 是 56044。

这样就可以一直循环到达根域 .

就跟https一样,只要我们在自己的 stub resolver 信任 根域的 DNSKEY,那么就跟 信任根证书颁发组织一样。在完成整个DNSSEC 域名验证系统。

http://dnsviz.net/d/www.netfilter.cc/dnssec/ 这个网站可以用图形更好的理解整个链路校验过程

Written with StackEdit.