DNSSEC 是一种验证域名信息真实性的协议扩展。个人之前一直觉得这事相当的蛋疼:DNS协议本身是不安全的,而DNSSEC无非是增加了数字签名验证,而这验证还依赖于相当复杂的密钥更新和分发机制,这一切都给它的推广带来了困难。
最近闲着没事把几台自己的机器上的unbound配置了 DNSSEC 支持。 unbound 是一款 NLnet Labs 开发和维护的 DNS 缓存(解析)服务器实现,它内建了对 DNSSEC 的验证支持。与比较常用的 BIND 相比, unbound 性能更好,并且在设计时充分考虑了安全问题,在安全方面有很好的记录。
在 FreeBSD 上可以使用 port 来安装 unbound:
# cd /usr/ports/dns/unbound # make install
在 /etc/rc.conf.local 中启用 unbound:
# echo 'unbound_enable="YES"' >> /etc/rc.conf.local
配置 unbound,如果需要对外提供服务,在 /usr/local/etc/unbound/unbound.conf 中的 server 小节添加:
interface: 0.0.0.0 # 监听所有IPv4地址 interface: ::0 # 监听所有IPv6地址
当然,对于对内网服务的机器来说,应单独指定内网的 IP 地址而不是监听全部可用 IP 地址,以避免暴露攻击面。此时还应配置 outgoing-interface,具体请参见配置文件中的说明。
然后是获得 trust anchor,这和根证书的意思类似。unbound-anchor 可以创建和更新 trust anchor。用下面的命令来下载和立即检查trust anchor的完整性,这个检查是使用 unbound-anchor 内建的 ICANN 证书进行的,如果不确认的话,还应检查它的完整性,包括 unbound-anchor -l 和检验源代码,不过由于 FreeBSD 的 portsnap 系统采用了数字签名验证,并对每个源码包都做 SHA256 校验,因此一般来说可以认为没有问题。
# sudo -u unbound unbound-anchor # sudo -u unbound unbound-anchor -a "/usr/local/etc/unbound/root.key" || echo "Wrong key!"
如果一切正常,则系统不会给出任何提示。
配置 unbound 使用 DNSSEC 验证只需在 server 小节增加一行:
auto-trust-anchor-file: "/usr/local/etc/unbound/root.key"
然后重启 unbound 即可。用 dig com. SOA +dnssec 应该可以看到 DNSSEC 验证成功(flags: ad):
% dig com. SOA +dnssec ; <<>> DiG 9.8.1-P1 <<>> com. SOA +dnssec ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4552 ;; flags: qr rd raad; QUERY: 1, ANSWER: 2, AUTHORITY: 14, ADDITIONAL: 1 (...)
此外也可以用浏览器访问http://dnssectest.sidn.nl/来测试。
目前美国联邦政府的许多网站都已经启用了 DNSSEC,但在大家的缓存服务器以及更多的商业站点支持 DNSSEC 之前,这样做并不能显著改善安全性。
[版权声明]BSD爱好者乐园站内文章,如来源不是互联网,则均系原创或翻译之作,可随意转载,或以此为基础进行演译,但务必以链接形式注明原始出处和作者信息,否则属于侵权行为。另对本站转载他处文章,俱有说明,如有侵权请联系本人,本人将会在第一时间删除侵权文章。
[站长微博]欢迎访问剑心通明的腾讯微博, BSD爱好者微群, 点击此处开通微博同时与剑心互听
TAG: DNSSEC 缓存
