用 BIND 搭建高可用性 DNSSEC 仅权威服务器

2014-10-31 18:07:07 +08:00
 TrustyWolf
Setup Hign-Availability DNSSEC Authoritative Only BIND DNS Server

本文的目的在于分享最近业余一直在研究的DNSSEC相关内容以及相关服务器的设置过程。
来V2EX没几个月,作者小狼是学生党,总之属于新人啦~ 所以肯定有不足的地方,大家多多包涵~
本文可以随意转载,但是一定要署名。<del>其实还有个重要的目的,由于博客还没有搭建好所以先找个地方存放供以后参考。</del>


关于DNSSEC的介绍:

请大家参阅ICANN的官方介绍: https://www.icann.org/resources/pages/dnssec-qaa-2014-01-29-zh (有中文翻译,大赞!)
台湾地区从2012年开始进行了大规模的DNSSEC部署,并开设了相关的教学网站: http://dnssec.tanet.edu.tw/
懂日语的同学还可以参考JPNIC的十分钟讲座https://www.nic.ad.jp/ja/newsletter/No43/0800.html


关于DNSSEC目前的普及情况(2014年10月):

所有的根域名()和大部分的顶级域名服务器(超过70%)都部署了DNSSEC。
738 TLDs in the root zone in total
556 TLDs are signed;
546 TLDs have trust anchors published as DS records in the root zone;
6 TLDs have trust anchors published in the ISC DLV Repository.
想了解自己注册的顶级域名是否支持DNSSEC可以参考ICANN的TLD DNSSEC Report:
http://stats.research.icann.org/dns/tld_report/
想了解自己域名的注册商是否支持DNSSEC可以参考:
https://www.icann.org/resources/pages/deployment-2012-02-25-en
完成自己域名的DNSSEC权威服务器的部署需要以下前提条件:
1. YOUR TOP-LEVEL DOMAIN (TLD) MUST BE SIGNED (目前有73%左右的顶级域名达到条件)
2. YOUR DOMAIN REGISTRAR MUST SUPPORT DNSSEC (悲剧的是大部分人都卡在了这一步,目前支持DNSSEC的域名注册商太少,而且大部分支持DNSSEC的注册商只提供部分域名的支持,详情可以参考上面的链接。目前对DNSSEC支持比较好的知名域名注册商有Godaddy和GANDI以及Name.com
3. YOUR DNS HOSTING PROVIDER MUST SUPPORT DNSSEC (这一步也有很多人卡住,部署了DNSSEC的DNS会比没有部署之前消耗更多的资源,所以大部分DNS服务商也都没有提供DNSSEC的支持。Godaddy和DYN的付费DNS提供的DNSSEC的支持。)


关于DNSSEC在递归DNS服务器上的普及情况:

目前国内的大部分运营商的递归服务器还不能支持DNSSEC,不过互联网企业的公共DNS基本已经完成了DNSSEC的支持,以下是小狼目前测试到支持DNSSEC DS记录的DNS:(有待补充)
阿里 AliDNS 223.5.5.5 223.6.6.6
CNNIC SDNS 1.2.4.8 210.2.4.8
114 DNS 114.114.114.114 114.114.115.115
oneDNS 112.124.47.27 114.215.126.16
DNS 派 101.226.4.6 218.30.118.6
123.125.81.6 140.207.198.6
Google DNS 8.8.8.8 8.8.4.4
OpenDNS 208.67.222.222 208.67.220.220
北京电信 219.141.136.10 219.141.140.10
北京联通 202.106.196.115 202.106.46.151 202.106.0.20
黑龙江联通 202.97.224.69
江苏电信 218.2.2.2 218.4.4.4
61.147.37.1 218.2.135.1 (几乎全线支持)
其他很多地区的递归服务器小狼还没有测试,希望各位V友能帮忙测试一下0.0
检查方法很简单:dig +noadditional DS icann.org. @DNS的IP | grep DS
如果有DS记录返回则说明该服务器支持DNSSEC,如:
[root@0w0 ~]# dig +noadditional DS icann.org. @114.114.114.114 | grep DS
; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> +noadditional DS icann.org. @114.114.114.114
;icann.org. IN DS
icann.org. 86400 IN DS 41643 7 1 93358DB22E956A451EB5AE8D2EC39526CA6A87B9
icann.org. 86400 IN DS 41643 7 2 B8AB67D895E62087F0C5FC5A1A941C67A18E4B096F6C622AEFAE30DD 7B1EA199


关于DNSSEC在DNS服务器软件上的普及情况:

目前的BIND、PowerDNS、NSD等主流的DNS服务器软件都已无缝支持DNSSEC,并且经过一段时间的技术演进性能已趋于稳定。但是部署DNSSEC后会加重服务器的负载也成为不争的事实。这也在一定程度上减缓了DNSSEC的普及速度。

所以,虽然DNSSEC的普及还有很长的一段路要走,但是目前的情况已经比之前好很多,如果找到一家靠谱的支持DNSSEC的域名注册商,完全可以通过自己搭建DNS仅权威服务器的方式使自己的域名支持DNSSEC。


DNSSEC部署方面的相关分享(属于纯粹的实验总结分享,并不是严肃的教程=_=,所以不能保证客观正确性):

小狼这次是用肉身做实验了,申请了域名(wolflab.net感觉这个域名不错^_^)并亲自搭建了DNS仅权威服务器。
部署完成后的图形化检测结果(检测地址http://dnsviz.net/):
同时使用KSK和ZSK签署
http://wolfmoe.qiniudn.com/wolflab.net-2014-10-31-03-30-11-UTC.png
仅使用KSK签署
http://wolfmoe.qiniudn.com/wolflab.net-2014-10-31-09-56-49-UTC.png

关于域名的申请:
在看到ICANN提供的那份表单之前,小狼的域名是在Name.com注册的,他家也为域名提供了DNSSEC的管理界面(在国内加载特别慢...),但是增加DS的时候总是提示参数错误,后来给客服发了个Ticket客服回复说让我联系DNS的管理员(我才不会说DNS的管理员就是自己呢o(╯□╰)o)。然后就是各种谷歌,然后,搜到了ICANN的那个页面(https://www.icann.org/resources/pages/deployment-2012-02-25-en),然后,就没有然后了QAQ
/* 此处省略一大段废话 */
最后,小狼选择了TransIP B.V.这家注册商<del>前阵子搞活动.net一年4.75欧,官网也挺高端的-_+</del>

以下分享一下在CentOS 7和BIND9(yum安装)环境下配置DNSSEC的过程:

相关教程的链接(强烈推荐阅读):
DNS搭建相关:
业界良心DigitalOcean的系列文章 An Introduction to Managing DNS: https://www.digitalocean.com/community/tutorial_series/an-introduction-to-managing-dns(包含DNS的相关介绍和Debian系的安装教程)
https://www.digitalocean.com/community/tutorials/how-to-install-the-bind-dns-server-on-centos-6(RedHat系的安装教程 CentOS6 CentOS 7通用)
当然RedHat的官方指南中对BIND也有详细的教程,大家可以参考
DNSSEC部署相关:
https://www.digitalocean.com/community/tutorials/how-to-setup-dnssec-on-an-authoritative-bind-dns-server--2 (RH系)
Debian系的强烈建议参考台湾交大资通安全研究与教学中心的DNSSEC部署SOP
http://dnssec.tanet.edu.tw/index.php/sop

以下是小狼自己的部署过程分享(欢迎各位批评与指正,鞠躬~):

环境:CentOS 7 + BIND 9.9.4

为了增强高可用性(其实是偷懒=_=),此处小狼只使用4096bits的KSK密钥签署整个网域并且不设定密钥的期限。这样做的优点是管理十分方便,每次修改DNS记录后只需要重新签署网域即可,不需要进行复杂的密钥管理。 [而在安全的强度方面,根据"European Network of Excellence in Cryptology II“于2010年3月的报告指出,破解 RSA 2048bits 约需要三亿美金的预算,使用 ASIC 花费 10 年来运算。也就是说,本文所建议的方式,仍然是需要非常高的代价才可被破解,而破解后的收获仅是获得 DNSSEC 的金钥,可用来仿冒 Resource Record。我们认为,除非管理者所管理的相关系统,价值超过数亿美金,否则本文所建议的方式已经提供足够的安全性。——摘自http://dnssec.tanet.edu.tw/images/DNSSEC/DNSSEC_Authoritative_ServerSOPLite_v2.12.pdf]

安装BIND9过程及初始化设置过程略...

[root@sg tw]# nano /etc/named.conf
# 检查以下设置的状态
recursion no;
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;

zone "wolflab.net" IN {
type master;
# 修改文件名
file "wolflab.net.zone.signed";
allow-transfer { 1.1.1.1; 2.2.2.2; };
};

进入 /var/named/
[root@sg named]# ls -al
total 47
drwxr-x--- 6 root named 4096 Oct 31 09:35 .
drwxr-xr-x. 22 root root 4096 Oct 30 18:32 ..
drwxr-x--- 7 root named 4096 Oct 27 23:10 chroot
drwxrwx--- 2 named named 4096 Oct 29 13:12 data
drwxrwx--- 2 named named 4096 Oct 31 09:33 dynamic
-rw-r----- 1 root named 2166 Oct 28 22:19 named.ca
-rw-r----- 1 root named 152 Dec 15 2009 named.empty
-rw-r----- 1 root named 152 Jun 21 2007 named.localhost
-rw-r----- 1 root named 168 Dec 15 2009 named.loopback
drwxrwx--- 2 named named 4096 Jun 10 16:13 slaves
-rw-r--r-- 1 root named 533 Oct 30 14:15 wolflab.net.zone

首先确保zone文件格式正确,BIND9能够正常运行。
修改一下Serial,方便同步从服务器
然后安装haveged (目的是加快密钥生成速度)
[root@sg named]# yum -y install haveged
[root@sg named]# chkconfig haveged on
[root@sg named]# service haveged start

生成KSK密钥
[root@sg named]# dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -r /dev/urandom -K /var/named wolflab.net
Generating key pair...........++ ...............................................................................................................................++
Kwolflab.net.+007+38406
以下是相关参数的说明:
-f 密钥的flag
-a 密钥的算法
-b 密钥的长度
-r 乱数来源
-K 密钥文件产生后存放的目录(默认为当前目录)
Zone name

将密钥添加到zone文件中
[root@sg named]# for key in `ls Kwolflab.net*.key`
> do
> echo "\$INCLUDE $key">> wolflab.net.zone
> done
wolflab.net.zone 中的最后一行会包含以下字样:
$INCLUDE Kwolflab.net.+007+38406.key

签署网域
[root@sg named]# dnssec-signzone -3 7aa7c4b1300f4915 -H 100 -K /var/named -o wolflab.net -S -u -z wolflab.net.zone
Verifying the zone using the following algorithms: NSEC3RSASHA1.
Zone fully signed:
Algorithm: NSEC3RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked
ZSKs: 0 active, 0 stand-by, 0 revoked
wolflab.net.zone.signed
以下是相关参数的说明:
-3 NSEC3使用的salt值,可在Debian系统中使用
head -c 1000 /dev/random | sha1sum | cut -b 1-16
命令随机生成,也可以使用SOP教程中的值61
-H NSEC3 使用的 Iteration 值,默认为10
-K 密钥文件产生后存放的目录(默认为当前目录)
-o 网域名称
-S 智能签署
-u 更新NSEC/NSEC3
-z 使用KSK签署整个zone file
Zone name

权限设置(其实这步可以省略 644权限是不是named组都无所谓啦)
[root@sg named]# chown root:named K*
[root@sg named]# chown root:named *.signed
[root@sg named]# ls -al
drwxr-x--- 6 root named 4096 Oct 31 17:01 .
drwxr-xr-x. 22 root root 4096 Oct 30 18:32 ..
drwxr-x--- 7 root named 4096 Oct 27 23:10 chroot
drwxrwx--- 2 named named 4096 Oct 29 13:12 data
-rw-r--r-- 1 root root 167 Oct 31 17:01 dsset-wolflab.net.
drwxrwx--- 2 named named 4096 Oct 31 17:14 dynamic
-rw-r--r-- 1 root named 951 Oct 31 16:40 Kwolflab.net.+007+38406.key
-rw------- 1 root named 3319 Oct 31 16:40 Kwolflab.net.+007+38406.private
-rw-r----- 1 root named 2166 Oct 28 22:19 named.ca
-rw-r----- 1 root named 152 Dec 15 2009 named.empty
-rw-r----- 1 root named 152 Jun 21 2007 named.localhost
-rw-r----- 1 root named 168 Dec 15 2009 named.loopback
drwxrwx--- 2 named named 4096 Jun 10 16:13 slaves
-rw-r--r-- 1 root named 587 Oct 31 16:52 wolflab.net.zone
-rw-r--r-- 1 root named 22437 Oct 31 17:01 wolflab.net.zone.signed

重启BIND9
[root@sg named]# systemctl restart named-chroot

结果验证
[root@0w0 ~]# dig DNSKEY wolflab.net. @0w0.moe(DNS地址) +multiline
root@debian:~# dig A wolflab.net. @0w0.moe(DNS地址) +noadditional +dnssec +multiline
如果出现一大堆排列很整齐的乱码=_=,恭喜,设置成功~
dsset-wolflab.net.中记录着签署时生成的DS记录
[root@sg named]# cat dsset-wolflab.net.
wolflab.net. IN DS 42945 7 1 EBE05D35D18466A4013B953E51AA1049CB7CB63F
wolflab.net. IN DS 42945 7 2 5F953F58484289F3D886AD8E8F604A7365A4DE9E7FE8B5ACC598023A C0998F62
此记录用来提交给域名注册商
有些域名注册商并不使用DS记录,而是直接提交DNSSEC KEY(比如TransIP),使用dig DNSKEY wolflab.net. @DNS的IP 即可直接查看

最后再次声明,本文可以随意转载,但是一定要署名,首发于V2EX。
11486 次点击
所在节点    DNS
10 条回复
TrustyWolf
2014-10-31 18:11:23 +08:00
再补充一些DNSSEC测试的网站:
http://dnsviz.net/
http://dnssec-debugger.verisignlabs.com/
以及浏览器插件:
https://www.dnssec-validator.cz/

之前的排版废了QAQ...
wwqgtxx
2014-10-31 19:20:27 +08:00
可以用markdown排班一下可能看着更舒服
panzhc
2014-10-31 22:10:26 +08:00
这个赞
TrustyWolf
2014-10-31 23:20:40 +08:00
@wwqgtxx 原来V2支持Markdown...谢谢下次一定会注意!
@panzhc 感谢鼓励!
国内关于这方面中文的资料太少,大部分都已经过时了,最近正好在折腾这些所以赶紧记录下来分享~
wwqgtxx
2014-11-01 07:14:05 +08:00
@TrustyWolf 建议使用v2ex notes的发布功能在发这种技术文章,就像L大大的官方文档一样
https://www.v2ex.com/p/7v9TEc53
因为notes发布的内容可以修改^ω^
0w0
2015-02-04 00:07:59 +08:00
有人 @ 我 冒泡
0w0
2015-02-04 00:09:43 +08:00
我靠 这…… 94天前的帖子 我怎么才收到 @ 的提示 ……

管理管给沉了吧…… 我不是故意挖坟的orz
roxhaiy
2015-07-28 13:24:03 +08:00
虽然略显混乱,但是参考了文中提到的台湾交大DNSSEC部署SOP的pdf,应该说基本搞懂了,谢谢!
TrustyWolf
2016-03-28 15:59:31 +08:00
新发布了 2016 版,请大家移步:/t/266750
bclerdx
2016-08-03 23:20:35 +08:00
顶起来~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/143009

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX