以编程方式检查域是否受DNSSEC保护

时间:2014-10-01 08:19:07

标签: python dns dnssec

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

如果有一个pythonic解决方案,这将是很好的。

更新: 改变了对回复的请求,抱歉造成混淆

2 个答案:

答案 0 :(得分:13)

使用DNS解析程序(例如dnspython),您可以在域中查询其DNSKEY RRset并打开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

答案 1 :(得分:2)

要查看特定的请求是否受到保护,请查看请求数据包中的DO标志。无论您使用哪种语言和库与DNS进行交互,都应该有一个访问器(它可能被称为其他内容,例如" dnssec")。

如果您想知道某个区域是否受到保护,那么第一个答案是正确但不完整的。所描述的过程将告诉您区域自己的数据是否已签名。为了检查区域的授权是否受到保护,您需要向父区域的名称服务器询问您感兴趣的区域的(正确签名的)DS记录。