[TOC]
关于 DNSSEC
DNSSEC 全称 Domain Name System Security Extensions,即 DNS安全扩展,是由Internet工程任务组 (IETF)提供的一系列DNS安全认证的机制(可参考RFC2535)。
它是对DNS提供给DNS客户端(解析器)的DNS数据来源进行认证,并验证不存在性和校验数据完整性验证,但不提供或机密性和可用性。来源:域名系统安全扩展 - 维基百科。
一些基础的相关介绍
通俗点讲, DNSSEC 的主要作用就是防止 DNS劫持,从而保证 DNS安全。
但在这个保证安全的过程中,DNSSEC 的 RR 和 RRSIG 的传输过程都是未加密的(即:不提供机密性),我们通过一些嗅探工具可以读取 RRSIG记录 以及由 DS记录 建立的信任链。
今天我们就来聊聊 DNSSEC 信任链的那些事。
DNSSEC 相关的资源记录
以国际知名的博客AWSL Blog为例。
awsl.blog 域名配置了 DNSSEC 签名,以下是使用支持 DNSSEC 的 DNS服务器 1.1.1.1
查询 A
记录 的解析结果:
dig awsl.blog +dnssec @1.1.1.1
;; QUESTION SECTION:
;awsl.blog. IN A
;; ANSWER SECTION:
awsl.blog. 300 IN A 104.21.31.232
awsl.blog. 300 IN A 172.67.180.189
awsl.blog. 300 IN RRSIG A 13 2 300 20210207155851 20210205135851 34505 awsl.blog. LViVaczzjt5QsASYOH//Yo3X8ImXQ4bGWRELCiq1+E9oEaH+iV6WUqhT kq5+AiAIrl3qQQ1/hQQEWpU5OA78XA==
RRSIG:
RRSIG 资源记录值很长,乍一看是一堆乱码,咱们还是对照格式来看:
A
- 记录类型
13
- 算法类型 (参考附录「算法类型列表」)
2
- 标签 (泛解析中原先 RRSIG 记录的名称)
300
- 原 TTL 大小
20210207155851
- 签名失效时间
20210205135851
- 签名签署时间
34505
- Key 标签 (一个简短的数值,用来迅速判断应该用那个 DNSKEY 记录来验证)
awsl.blog.
- 签名名称 (用于验证该签名的 DNSKEY 名称)
......==
- 加密签名
DNSKEY 和 DS (Delegation Signer)记录也都看下。
dig awsl.blog +dnssec @1.1.1.1 DNSKey
;; QUESTION SECTION:
;awsl.blog. IN DNSKEY
;; ANSWER SECTION:
awsl.blog. 536 IN DNSKEY 256 3 13 oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8 KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==
awsl.blog. 536 IN DNSKEY 257 3 13 mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+ KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==
awsl.blog. 536 IN RRSIG DNSKEY 13 2 3600 20210305234217 20210104234217 2371 awsl.blog. W7N5606xAKtPNjVZvXqhKuGTTS3j02SJZ7zY0Yk/2JAQo2Do8MQHEhpJ tgbIOo/sci/BO4Hjip9ASY/1gtEatw==
DNSKEY:
256
- 标识符 (Zone Key (DNSSEC密钥集) 以及 Secure Entry Point (KSK和简单密钥集))
3
- 协议 (固定值3 向下兼容)
13
- 算法类型 (参考附录「算法类型列表」)
“…最后的…”
- 公钥内容
dig awsl.blog +dnssec @1.1.1.1 DS
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
;; QUESTION SECTION:
;awsl.blog. IN DS
;; ANSWER SECTION:
awsl.blog. 3600 IN DS 2371 13 2 7E282E377408DD6817CE980E6A8E1C7EABAA9B2C48EE75FB12ED422D A5F1DDD5
awsl.blog. 3600 IN RRSIG DS 8 2 3600 20210222160328 20210123222351 40719 blog. 0/nArHn/lJOs2QYl9tHt7l0gJQFMsGCzd8Qkb0hG4LuzSeltAKrEFWOA KTHFz/8wJ7FNZcOXsnVkc9qVZxeRljYf7JScsXtTb/+L+fcuvkk7bXqp gwoalYNYKQeGEbI5lHjSvRGD0m/L0AnYQ40phTg+5ppx3gTG2+PwxJex l/I=
DS:
2371
- Key 标签 (一个简短的数值,用来迅速判断应该用那个 DNSKEY 记录来验证)
13
- 算法类型 (参考附录「算法类型列表」)
2
- 摘要类型 (创建摘要值的加密散列算法)(参考附录「摘要类型列表」)
“…最后的…”
- 摘要:引用的 DNSKEY记录 的加密哈希值。
DS记录 建立的 DNSSEC 信任链
DS
,是 Delegation Signer 的缩写,即“委派签名者”,用于构建到子 zone 的身份验证链。
对于 awsl.blog 来说,其 DS记录值 是上一级 .blog 的私钥对其 DNSKEY
进行加密后得到的。
而如果 awsl.blog 存在独立的子域时,又将利用其私钥对其子 zone 的 DNSKEY 执行加密从而生成子域的 DS记录值 。
下图是用 DNSViz 查询到的 awsl.blog 的信任链:
awsl.blog-2021-02-06-15_11_01-UTC.svg
图中展示的三个框,从上至下依次代表域名.
、blog.
和awsl.blog.
,每个框中间的内容分别对应这三个 zone 的 DNSKey 和 DS 的传递关系。
可以通过点击http://dnsviz.net/d/awsl.blog/dnssec/ 查看更多细节。
DNSSEC 的现状及问题
无法保证私密性
DNSSEC 并没有改变 DNS 基于 UDP
的通讯方式,数据流也都是明文传输,他所做的只是加上了一个数字签名,而中间人依然可以看到你请求了什么、结果是什么
挟持发生时不能告诉用户真正的记录
当用户的 DNS 被挟持的时候,用户通过检查 DNSSEC 签名,可以知道自己得到的并不是真正的解析结果,而是得到了一个被伪造的地址。 但是,用户并不知道真正的解析结果是什么。(就不给你真实地址了,你能拿我怎么着?)
支持 DNSSEC 的递归服务器并不多
就目前国内而言,例如 114.114.114.114
以及 223.5.5.5
都不支持
而国外的话,谷歌在 2013 年 5 月 6 号宣布其公共 DNS 服务器 8.8.8.8
以及 8.8.4.4
支持 DNSSEC。
主流浏览器并没有原生对 DNSSEC 的支持
Chrome
早在 14.0.794.0
的时候,Chrome 默认就启用了 DNSSEC 的检查,当时是这样子的
而后来,因为缺少使用因此该功能被删除
Update: this has been removed from Chrome due to lack of use.
详情请看:DNSSEC authenticated HTTPS in Chrome (16 Jun 2011)")
Firefox
目前同样没有原生支持,和 Chrome 需要安装拓展才可以使用。
有兴趣的话可以看这里的讨论:Bug 672600 - Use DNSSEC/DANE chain stapled into TLS handshake in certificate chain validation
更多
Against DNSSEC - Quarrelsome
Verisign - DNSSEC
DNSCrypt-Proxy
之前写过一篇文章https://awsl.blog/ubuntu/dnscrypt-proxy 。配合 DoH
/ DoT
一起使用,DNSSEC
才能更好地发挥出它的用处。
附录
算法类型列表
- 1: RSA/MD5
- 2: Diffie-Hellman
- 3: DSA/SHA-1
- 4: Elliptic Curve
- 5: RSA/SHA-1
- 6: DSA-NSEC3-SHA1
- 7: RSASHA1-NSEC3-SHA1
- 8: RSA/SHA-256
- 10: RSA/SHA-512
- 12: RSA/SHA-512
- 13: ECDSA Curve P-256 with SHA-256
- 14: ECDSA Curve P-384 with SHA-384
- 252: Indirect
- 253: Private DNS
- 254: Private OID
摘要类型列表
- 1: SHA-1
- 2: SHA-256
- 3: GOST R 34.11-94
- 4: SHA-384
文章原作者
Ephen
https://ephen.me/2016/dnssec-dnsviz/
imlonghao
https://imlonghao.com/41.html
(有大量删改)
本篇文章采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 许可协议进行许可。
转载或引用本文时请遵守许可协议,注明出处。