如何理解DNSSEC,域名系统安全扩展
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.