unbound之DNSSEC缓存服务器作弊条
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地址⚠️ 小心
(20130423增加) 如果监听所有IPv4和IPv6地址的话,就必须限制允许访问的IP地址范围。假设一台主要针对内网,同时为202.96.0/24服务的服务器,应配置如下ACL:
| |
当然,对于对内网服务的机器来说,应单独指定内网的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):
| |
此外也可以用浏览器访问 http://dnssectest.sidn.nl/ 来测试。
目前美国联邦政府的许多网站都已经启用了DNSSEC,但在大家的缓存服务器以及更多的商业站点支持DNSSEC之前,这样做并不能显著改善安全性。