2014-10-01 81 views
5

如标题所示,我想以编程方式检查域的DNS响应是否受DNSSEC保护。
我该怎么做?以编程方式检查域是否受DNSSEC保护

这将是巨大的,如果是这样的Python的解决方案。

UPDATE: 改变的请求到响应,遗憾的混乱

+1

这看起来相关:HTTP:// www.unbound.net/documentation/pyunbound/examples/example4.html – kasperd 2015-02-04 17:42:23

+0

不错的链接!谢谢 – Thorben 2015-02-04 22:05:35

+0

我们试图使用unbound很长一段时间,它从来没有运行良好。 – vy32 2016-11-18 16:56:55

回答

11

使用DNS解析器(例如dnspython),可以查询该域为它DNSKEY资源记录集,并开启DO(DNSSEC OK)的查询标志。如果查询成功,答案将会设置AD(已验证数据)标志并包含该区域的RRSIG签名(如果已签名)。

更新:使用dnspython

import dns.name 
import dns.query 
import dns.dnssec 
import dns.message 
import dns.resolver 
import dns.rdatatype 

# get nameservers for target domain 
response = dns.resolver.query('example.com.',dns.rdatatype.NS) 

# we'll use the first nameserver in this example 
nsname = response.rrset[0] # name 
response = dns.resolver.query(nsname,dns.rdatatype.A) 
nsaddr = response.rrset[0].to_text() # IPv4 

# get DNSKEY for zone 
request = dns.message.make_query('example.com.', 
           dns.rdatatype.DNSKEY, 
           want_dnssec=True) 

# send the query 
response = dns.query.udp(request,nsaddr) 
if response.rcode() != 0: 
    # HANDLE QUERY FAILED (SERVER ERROR OR NO DNSKEY RECORD) 

# answer should contain two RRSET: DNSKEY and RRSIG(DNSKEY) 
answer = response.answer 
if len(answer) != 2: 
    # SOMETHING WENT WRONG 

# the DNSKEY should be self signed, validate it 
name = dns.name.from_text('example.com.') 
try: 
    dns.dnssec.validate(answer[0],answer[1],{name:answer[0]}) 
except dns.dnssec.ValidationFailure: 
    # BE SUSPICIOUS 
else: 
    # WE'RE GOOD, THERE'S A VALID DNSSEC SELF-SIGNED KEY FOR example.com 
+0

我也已经偶然发现了dnspython,但是我没有找到一种方法来获取我需要的数据,而且文档非常糟糕。你知道如何编码吗? – Thorben 2014-10-01 11:24:53

+0

@Thorben在答案中增加了一个基本示例。 – isedev 2014-10-01 13:12:56

+0

谢谢。代码看起来不错。不幸的是,我得到一个奇怪的错误:'TypeError:强制转换为Unicode:需要字符串或缓冲区,NS发现'在'response = dns.query.udp(request,ns)',但我相信你一般都在工作。但是,我已经结束了解析'dig + dnssec domain'的输出。 – Thorben 2014-10-01 13:22:50

2

要查看是否有特定的要求保护一个基本的例子,看看在请求报文中的DO标志。无论使用什么语言和库来连接DNS,都应该有一个访问器(它可能被称为别的东西,比如“dnssec”)。

如果您想知道某个区域是否受保护,则第一个答案是正确的,但不完整。所描述的程序会告诉你区域自己的数据是否被签名。为了检查代表团到该区域受到保护,你需要问父区域的名称服务器的(正确签名)DS记录你感兴趣的区域

+0

我已经得到了这个问题,但我不知道如何扩展代码来验证信任链与dnspython。你知道一个简单的例子吗? – 2015-01-01 19:34:52

+1

不幸的不是。我们最近发布的工具Zonemaster中有执行此检查的代码(以及其他许多代码),但是这些代码是用Perl编写的。如果你想看看它,它在https://github.com/dotse/zonemaster-engine的Github上,最相关的函数是在文件lib/Zonemaster/Test/DNSSEC.pm – 2015-01-02 22:34:22

+0

中的'dnssec11' ,你如何检查一个特定的“响应”是否受到保护?我们是否也在响应数据包中查看“DO标志”的存在? – weefwefwqg3 2017-02-10 18:31:41