如何使用dig命令行测试和验证DNSSEC

时间:2020-01-09 10:46:05  来源:igfitidea点击:

在Linux,macOS,* BSD和类似Unix的系统下,如何使用dig命令行测试和验证DNSSEC?

DNSSEC是域名系统安全扩展的首字母缩写。
它是一组Internet工程任务组(IETF)规范,用于保护域名系统(DNS)提供的某些类型的信息。

Dig是一个DNS查找工具,用于查询dns服务器以获取DNS记录。
例如,dig可以使用DNS解析器告诉您邮件服务器或者网站的IP地址。
可以使用DNSSEC减轻安全风险,并帮助防止恶意动作,例如缓存中毒,篡改和中间人攻击。
使用DNSSEC,可以验证和认证DNS数据和DNS完整性。
本教程说明如何使用dig命令测试和验证影响DNS解析的DNSSEC问题。

如何使用dig测试和验证DNSSEC

  • 在Linux/Unix/macOS桌面上打开终端应用程序
  • 使用dig验证DNSSEC记录,运行:dig YOUR-DOMAIN-NAME + dnssec + short
  • 获取用于验证DNS记录的公共密钥,执行:dig DNSKEY YOUR-DOMAIN-NAME + short
  • 使用dig命令显示DNSSEC信任链:dig DS YOUR-DOMAIN-NAME + trace
  • 使用dig进行DNSSEC验证,运行以下两个命令:
dig . DNSKEY | grep -Ev '^($|;)' > keys
dig +sigchase +trusted-key=./keys YOUR-DOMAIN-NAME. A | less
dig +sigchase +trusted-key=./keys YOUR-DOMAIN-NAME. A | grep -i validation

让我们详细查看所有命令和示例。

是否为指定域名启用了DNSSEC?

启用DNSSEC时,签名委托(DS)记录提供有关签名区域文件的信息。
让我们使用dig打印域的DS记录:

dig DS {domain-name}
dig DS google.com
dig DS theitroad.local +short

DNSKEY只是一条记录,其中包含一个公用密钥,DNS解析程序可以使用该公用密钥来验证DNSSEC签名。
要显示DNSKEY,请运行:

dig DNSKEY {domain-name}
dig DNSKEY google.com
dig DNSKEY theitroad.local +short

DNSKEY记录包含一个公共签名密钥,而DS记录包含一个DNSKEY记录的哈希(如果启用了DNSSEC)

请注意,google.com没有定义DS和DNSKEY。
换句话说,该域未启用DNSSEC。

使用dig验证dnssec

接下来,我们将查询并验证DNSSEC。
语法非常简单:

dig +dnssec {domain-name}.
dig +dnssec www.theitroad.local. +short
dig +dnssec www.theitroad.local.

首先,您需要传递+ dnssc标志来深入验证区域数据。
其次,当我的解析器配置为自行执行DNSSEC验证时,请注意输出中的" ad",以确认区域数据正确。
第三看响应的RRSIG行。

ad标志表示经过身份验证的答案,必须设置do标志指示DNSSEC正常:

dig theitroad.local +dnssec +multi

输出示例:

; <<>> DiG 9.11.5-P4-5.1ubuntu2.1-Ubuntu <<>> theitroad.local +dnssec +multi
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53272
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;theitroad.local.		IN A

;; ANSWER SECTION:
theitroad.local.		135 IN A 104.20.187.5
theitroad.local.		135 IN A 104.20.186.5
theitroad.local.		135 IN RRSIG A 13 2 300 (
				20191212194711 20191210174711 34505 theitroad.local.
				meJ8aERJ6AddCA3Fbno7ixH63hRQTal0wXCnaJG8de4z
				yhXDJRMXYJshPnKR6ucKONa/R6SO4rivCxSiqSfcsw== )

;; Query time: 0 msec
;; SERVER: 192.168.1.254#53(192.168.1.254)
;; WHEN: Thu Dec 12 00:19:55 IST 2019
;; MSG SIZE  rcvd: 183

DNSSEC验证失败的示例

运行以下dig命令:

dig www.dnssec-failed.org
dig www.brokendnssec.net +dnssec
; <<>> DiG 9.11.5-P4-5.1ubuntu2.1-Ubuntu <<>> www.brokendnssec.net +dnssec
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 22087
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;www.brokendnssec.net.		IN	A

;; Query time: 1378 msec
;; SERVER: 192.168.1.254#53(192.168.1.254)
;; WHEN: Thu Dec 12 00:08:50 IST 2019
;; MSG SIZE  rcvd: 49

上面的dig命令返回了SERVFAIL错误,因为区域数据不正确。

使用dig测试dnssec

我们可以使用dig命令显示DNSSEC信任链。
您所要做的就是将+ trace选项传递给dig,如下所示:

dig DS {your-domain.} +trace
dig DS google.com +trace @8.8.4.4
dig DS google.com +trace @1.1.1.1
dig DS theitroad.local +trace
dig DS theitroad.local +trace @8.8.8.8

完整的例子

让我们看看如何从Linux或者Unix/macOS命令行测试DNSSEC的有效性。
首先,从根服务器获取根密钥,运行以下dig命令以及grep命令

dig . DNSKEY | grep -Ev '^($|;)' > keys

使用cat命令查看键:

cat keys

输出示例:

.			49440	IN	DNSKEY	256 3 8 AwEAAbPwrxwtOMENWvblQbUFwBllR7ZtXsu9rg/LdyklKs9gU2GQTeOc 59XjhuAPZ4WrT09z6YPL+vzIIJqnG3Hiru7hFUQ4pH0qsLNxrsuZrZYm XAKoVa9SXL1Ap0LygwrIugEk1G4v7Rk/Alt1jLUIE+ZymGtSEhIuGQdX rEmj3ffzXY13H42X4Ja3vJTn/WIQOXY7vwHXGDypSh9j0Tt0hknF1yVJ CrIpfkhFWihMKNdMzMprD4bV+PDLRA5YSn3OPIeUnRn9qBUCN11LXQKb +W3Jg+m/5xQRQJzJ/qXgDh1+aN+Mc9AstP29Y/ZLFmF6cKtL2zoUMN5I 5QymeSkJJzc=
.			49440	IN	DNSKEY	257 3 8 AwEAAaz/tAm8yTn4Mfeh5eyI96WSVexTBAvkMgJzkKTOiW1vkIbzxeF3 +/4RgWOq7HrxRixHlFlExOLAJr5emLvN7SWXgnLh4+B5xQlNVz8Og8kv ArMtNROxVQuCaSnIDdD5LKyWbRd2n9WGe2R8PzgCmr3EgVLrjyBxWezF 0jLHwVN8efS3rCj/EWgvIWgb9tarpVUDK/b58Da+sqqls3eNbuv7pr+e oZG+SrDK6nWeL3c6H5Apxz7LjVc1uTIdsIXxuOLYA4/ilBmSVIzuDWfd RUfhHdY6+cn8HFRm+2hM8AnXGXws9555KrUB5qihylGa8subX2Nn6UwN R1AkUTV74bU=

最后使用dig进行DNSSEC验证,如下所示:

dig +sigchase +trusted-key=./keys www.theitroad.local. A | more
dig +sigchase +trusted-key=./keys www.theitroad.local. A | grep -i validation

最后命令的输出示例:

;; WE HAVE MATERIAL, WE NOW DO VALIDATION
;; WE HAVE MATERIAL, WE NOW DO VALIDATION
;; WE HAVE MATERIAL, WE NOW DO VALIDATION
;; Ok this DNSKEY is a Trusted Key, DNSSEC validation is ok: SUCCESS

我可以请求一个没有DNSSEC签名的域,而应该只给出正常的DNS答案吗?

是的,后备功能是一个功能。
这是apple.com的操作方法

dig www.apple.com +dnssec

输出示例:

<<>> DiG 9.11.5-P4-5.1ubuntu2.1-Ubuntu <<>> www.apple.com +dnssec
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4032
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;www.apple.com.			IN	A

;; ANSWER SECTION:
www.apple.com.		806	IN	CNAME	www.apple.com.edgekey.net.
www.apple.com.edgekey.net. 3592	IN	CNAME	www.apple.com.edgekey.net.globalredir.akadns.net.
www.apple.com.edgekey.net.globalredir.akadns.net. 2182 IN CNAME	e6858.dsce9.akamaiedge.net.
e6858.dsce9.akamaiedge.net. 20	IN	A	23.66.255.148

;; Query time: 360 msec
;; SERVER: 192.168.1.254#53(192.168.1.254)
;; WHEN: Thu Dec 12 00:24:42 IST 2019
;; MSG SIZE  rcvd: 193