【问题标题】:Programmatically check if domains are DNSSEC protected以编程方式检查域是否受 DNSSEC 保护
【发布时间】:2014-11-26 00:54:51
【问题描述】:

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

如果有pythonic解决方案,那就太好了。

更新: 将请求更改为响应,很抱歉造成混淆

【问题讨论】:

标签: python dns dnssec


【解决方案1】:

使用 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].to_text() # 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

【讨论】:

  • 我也已经偶然发现了 dnspython,但是我没有找到从中获取所需数据的方法,而且文档非常糟糕。你知道如何编码吗?
  • @Thorben 在答案中添加了一个基本示例。
  • 谢谢。代码看起来不错。不幸的是,我在response = dns.query.udp(request, ns) 收到了一个奇怪的错误TypeError: coercing to Unicode: need string or buffer, NS found,但我相信你它通常可以正常工作。但是,我已经解析了dig +dnssec domain 的输出。
  • 能否扩展代码来验证信任链?
  • @tmaier 不幸的是,我不确定如何使用 dnspython 实现这一目标
【解决方案2】:

要查看特定的请求 是否受到保护,请查看请求数据包中的 DO 标志。无论您使用什么语言和库来连接 DNS,都应该有一个访问器(它可能被称为其他名称,例如“dnssec”)。

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

【讨论】:

  • 我确实遇到了这个问题,但我不知道如何扩展代码以使用 dnspython 验证信任链。你知道一个简单的例子吗?
  • 很遗憾没有。在我们最近发布的工具 Zonemaster 中有执行此检查的代码(以及许多其他代码),但它是用 Perl 编写的。如果您想查看它,它在 Github 上的 github.com/dotse/zonemaster-engine 和最相关的功能是文件 lib/Zonemaster/Test/DNSSEC.pm 中的 dnssec11
  • 那么,您如何检查特定的“响应”是否受到保护?我们是否也看看响应包中是否存在“DO flag”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 2012-01-10
  • 2015-08-24
  • 2013-03-31
  • 2013-02-05
相关资源
最近更新 更多