文/段海新
DNSSEC原理、配置与部署(二)
文/段海新
DNSSEC是为解决DNS欺骗和缓存污染而设计的一种安全机制。本文概要介绍DNSSEC的背景、工作原理以及在BIND上的配置,最后介绍它在国际上的部署情况和可能对互联网安全机制的影响。本刊上期已经刊载其背景、目的和工作原理。
DNSSEC是为解决DNS欺骗和缓存污染而设计的一种安全机制。本文概要介绍DNSSEC在BIND上的配置,最后介绍国际上的部署情况和它可能对互联网安全机制的影响。
尽管DNSSEC的工作原理看起来让人气馁,实际的配置操作却并不复杂。本节以BIND 9为例介绍DNSSEC的基本配置。尽管BIND 9.3以上就开始支持DNSSEC,仍然建议使用当前最高版本的BIND(当前最新的版本是9.8)。
配置或部署DNSSEC有两种场景:
(1)配置安全的域名解析服务器(Resolver),该服务器可以保护使用它的用户,防止被DNS 欺骗攻击。这里只涉及数字签名的验证工作。
(2)配置安全的权威域名服务器(Name Server),对权威域的资源记录进行签名,保护服务器不被域名欺骗攻击。
配置安全解析服务器
激活D N S S E C
首先,在BIND的配置文件(一般是/etc/named.conf)中打开DNSSEC选项,比如:
配置Trust anchor
其次,要给解析服务器配置可信锚(Trust Anchors),也就是你所信任的权威域的DNSKEY。理想情况下我们可以配置一个根的密钥就够了,但是目前DNSSEC还没有完全部署的情况下,我们需要配置很多安全岛(Secure Island)的密钥,可以从很多公开的网站下载这些可信域的DNSKEY文件,包括:
(1)Root Zone DNSSEC Trust Anchors:https://www.iana.org/dnssec/。2010年7月部署实施,如果DNSSEC全部部署成功,这一个公开密钥就足够了。
(2)The UCLA secspider : https://secspider.cs.ucla.edu,由美国加州大学洛杉矶分校(UCLA)张丽霞教授的实验室维护。
(3)The IKS Jena TAR:https://www.iksjena.de/leistungen/dnssec.php
这些文件大概是这样的格式:
假设上述trust anchors的文件为/var/named/trust-anchors.conf,则在/etc/named.conf中增加下面一行:
测试
在完成上述配置修改之后重新启动named进程,然后选择一个trust anchor文件中有的区或者它下一级的域名,在解析服务器上用dig测试一下,例如:
如果配置正确,应该返回test.net的SOA记录和相应的RRSIG记录,另外返回的头部中应该包含A D标志位,表示DNSSEC相关的数字签名验证是正确的,类似下面的样子:
如果没有得到期望的结果,需要查看DNS的日志来找出问题。BIND为DNSSEC相关的事件增加了一个dnssec类别,可以在/etc/named.conf配置日志如下:配置权威服务器
生成签名密钥对
首先为你的区(zone)文件生成密钥签名密钥KSK:
然后生成区签名密钥ZSK:
其中的-a 参数是签名算法,-b是密钥长度。上述命令共产生两对DNSKEY密钥(共四个文件),分别以.key和.private结尾,表明这个文件存储的是公开密钥或私有密钥。
签名
签名之前,你需要把上面的两个DNSKEY写入到区文件中
然后执行签名操作:
上面的-o选项指定代签名区的名字。生成的db.test.net.signed
然后修改/etc/named.conf如下:
记住,你每次修改区中的数据时,都要重新签名:
发布公钥
要让其他人验证你的数字签名,其他人必须有一个可靠的途径获得你的公开密钥。DNSSEC通过上一级域名服务器数字签名的方式签发你的公钥。
用dnssec-signzone时,会自动生成keyset-文件和dsset-开头的两个文件,分别存储着KSK的DNSKEY记录和DS记录。作为test.net区的管理员,你需要把这两个文件发送给.net的管理员,.net的管理员需要把这两条记录增加到.net区中,并且用.net的密钥重新签名。
如果你的上一级域名服务器还没有配置DNSSEC,你不得不另找其他方式了,比如,把上述两个文件提交到一些公开的trust anchor数据库中发布(如上面介绍过的secspider),或者直接交给愿意相信你的解析服务器的管理员,配置到他们的trust anchor文件中。
互联网工程技术领域普遍认为DNSSEC是增强互联网基础设施安全非常关键的一步,比如,美国国土安全部发起了DNSSEC部署计划,美国网络空间国家战略安全明确要求部署DNSSEC。DNSSEC的大规模部署还可能解决其他的安全问题,比如密钥的分发和安全的电子邮件。
尽管互联网工程界认为DNSSEC非常重要,但是大规模的部署仍然非常谨慎。巴西 (.br)、保加利亚 (.bg)、捷克 (.cz)、波多黎各 (.pr) 和瑞典 (.se), 很早就开始在他们国家的顶级域名上部署DNSSEC,IANA在2007年开始在一个根域名服务器上进行签名试验。许多机构在DNSSEC的部署上付出了巨大的努力。
在ICANN和VeriSign的推动下,2010年7月,所有13个根域名服务器都对根域签名完毕且投入运营。顶级域名(如.org, .net等)也在计划之中,有些国家级的顶级域名服务器(如.cz、.jp、.us、.fr等)已经完成了这一任务。
国际上一些大的ISP已经开始部署支持DNSSEC的解析服务器,以保护他们接入用户的安全,美国Comcast 公司是其中的先驱者之一。
作者认为如果DNSSEC能够普遍部署,可能对互联网的安全体系产生重大的影响;因为有了DNSSEC的数字签名,把DNS作为密钥分发的PKI在很多应用场合已经具有了可行性。它不仅仅可以加强DNS系统本身的安全,作为网络的基础设施,还给其他的应用,特别是端到端的移动通信、IPv6网络环境的安全问题提供新的解决办法。
但是作者也认为,离这一目标的实现还有很长的路要走。一方面DNSSEC自身的协议还在发展,另一方面其他的应用要想利用DNSSEC的机制还需要大规模的研究试验和最后的标准化。另外,DNSSEC在某些国家是否会遭遇政策性的阻碍,也是个未知数。
尽管如此,因为DNS对互联网实在太重要了,如果DNSSEC是通往一个安全可靠的互联网基础设施的必由之路(目前作者还没有看到可以替代DNSSEC的其他解决方案),为此付出代价,也是别无选择的。
(作者单位为清华大学信息网络工程研究中心)