关于DNSSEC
我们都知道DNS是一种将域名解析为IP地址的协议,但是我们如何知道返回的IP地址的真实性?这是可能的攻击者篡改DNS响应或 使DNS Cache Poison ,并采取用户恶意站点,在地址栏的合法域名。 DNS安全扩展(DNSSEC)是一个旨在维护DNS响应的数据完整性的规范。 DNSSEC使用PKI(公钥基础设施)签署区域的所有DNS资源记录(A,MX,CNAME等)。现在启用DNSSEC的DNS解析器(如Google Public DNS)可以使用公共DNSKEY记录验证DNS回复(包含IP地址)的真实性。DNSSEC资源记录
资源记录(RR)包含有关域的特定信息。一些常见的是包含域的IP地址的记录,保存IPv6信息的AAAA记录,以及具有域的邮件服务器的MX记录。 DNS资源记录的完整列表,可以发现 在这里 。 同样,DNSSEC也需要几个RR。- DNSKEY持有其解析器使用验证公钥。
- RRSIG存在为每个RR和包含一个记录的数字签名。
- DS -授权签名者-这个记录存在于顶级域名的域名服务器。 所以,如果example.com是您的域名,TLD是“COM”,其域名服务器是
a.gtld-servers.net.
b.gtld-servers.net.
高达m.gtld-servers.net.
其目的的这个记录是要验证DNSKEY本身的真实性。
安装环境
域名:example.com 我用了一个真正的.COM域名要做到这一点,但与 example.com本文取而代之。 主Nameservers: IP地址:1.1.1.1 主机名:master.example.com 操作系统:Debian的7 从属Nameservers: IP地址:2.2.2.2 主机名:slave.example.com 操作系统:CentOS的文件位置和名称
BIND的配置和区域文件的名称和位置根据所使用的Linux分发而不同。Debian / Ubuntu
服务名称: bind9 主配置文件:/etc/bind/named.conf.options
区域名称文件:
/etc/bind/named.conf.local
默认区域文件位置:
/var/cache/bind/
CentOS / Fedora
服务名称: 命名 主配置和区域名称文件:/etc/named.conf
默认区域文件位置:
/var/named/
如果你使用这些可能改变
bind-chroot
。对于本教程,我使用Debian作为主NS和CentOS的从属NS,所以根据您的分布更改它。
DNSSEC主配置
通过增加内以下的配置指令启用DNSSECoptions{ }
nano /etc/bind/named.conf.options
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
这些可能已经在一些分布中添加。导航到区域文件的位置。
cd /var/cache/bind
使用以下命令创建区域签名密钥(ZSK)。
dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE example.com
如果您已经安装
haveged ,它会采取只需要几秒钟才会产生这一关键;否则将需要很长时间。示例输出。
root@master:/var/cache/bind# dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE example.com
Generating key pair..................+++ .............+++
Kexample.com.+007+40400
使用以下命令创建密钥签名密钥(KSK)。
dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE example.com
示例输出。
root@master:/var/cache/bind# dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE example.com
Generating key pair......................++ .............................................................................................................................................................................................................++
Kexample.com.+007+62910
该目录现在将有4个键 - 私有/公共对ZSK和KSK。我们必须添加含有的
DNSKEY记录区域文件的公共密钥。 下面
for
循环会做到这一点。
for key in `ls Kexample.com*.key`
do
echo "\$INCLUDE $key">> example.com.zone
done
标志的区域
dnssec-signzone
命令。
dnssec-signzone -3 <salt> -A -N INCREMENT -o <zonename> -t <zonefilename>
用随机的东西替换Salt。这里是一个输出的例子。
root@master:/var/cache/bind# dnssec-signzone -A -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) -N INCREMENT -o example.com -t example.com.zone
Verifying the zone using the following algorithms: NSEC3RSASHA1.
Zone signing complete:
Algorithm: NSEC3RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked
ZSKs: 1 active, 0 stand-by, 0 revoked
example.com.zone.signed
Signatures generated: 14
Signatures retained: 0
Signatures dropped: 0
Signatures successfully verified: 0
Signatures unsuccessfully verified: 0
Signing time in seconds: 0.046
Signatures per second: 298.310
Runtime in seconds: 0.056
必须输入16个字符的字符串作为“salt”。以下命令
head -c 1000 /dev/random | sha1sum | cut -b 1-16
输出一个16字符的随机字符串,将被用作Salt。 这将创建一个名为新文件
example.com.zone.signed
其中包含
RRSIG记录每个DNS记录。我们必须告诉BIND加载这个“签名”区域。
nano /etc/bind/named.conf.local
更改
file
里面的选项
zone { }
部分。
zone "example.com" IN {
type master;
file "example.com.zone.signed";
allow-transfer { 2.2.2.2; };
allow-update { none; };
};
保存此文件并重新装入绑定
service bind9 reload
检查是否使用DNSKEY记录
dig
在同一台服务器上。
dig DNSKEY example.com. @localhost +multiline
示例输出
root@master:/var/cache/bind# dig DNSKEY example.com. @localhost +multiline
;; Truncated, retrying in TCP mode.
; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> DNSKEY example.com. @localhost +multiline
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43986
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;example.com. IN DNSKEY
;; ANSWER SECTION:
example.com. 86400 IN DNSKEY 256 3 7 (
AwEAActPMYurNEyhUgHjPctbLCI1VuSj3xcjI8QFTpdM
8k3cYrfwB/WlNKjnnjt98nPmHv6frnuvs2LKIvvGzz++
kVwVc8uMLVyLOxVeKhygDurFQpLNNdPumuc2MMRvV9me
fPrdKWtEEtOxq6Pce3DW2qRLjyE1n1oEq44gixn6hjgo
sG2FzV4fTQdxdYCzlYjsaZwy0Kww4HpIaozGNjoDQVI/
f3JtLpE1MYEb9DiUVMjkwVR5yH2UhJwZH6VVvDOZg6u6
YPOSUDVvyofCGcICLqUOG+qITYVucyIWgZtHZUb49dpG
aJTAdVKlOTbYV9sbmHNuMuGt+1/rc+StsjTPTHU=
) ; key id = 40400
example.com. 86400 IN DNSKEY 257 3 7 (
AwEAAa2BE0dAvMs0pe2f+D6HaCyiFSHw47BA82YGs7Sj
qSqH3MprNra9/4S0aV6SSqHM3iYZt5NRQNTNTRzkE18e
3j9AGV8JA+xbEow74n0eu33phoxq7rOpd/N1GpCrxUsG
kK4PDkm+R0hhfufe1ZOSoiZUV7y8OVGFB+cmaVb7sYqB
RxeWPi1Z6Fj1/5oKwB6Zqbs7s7pmxl/GcjTvdQkMFtOQ
AFGqaaSxVrisjq7H3nUj4hJIJ+SStZ59qfW3rO7+Eqgo
1aDYaz+jFHZ+nTc/os4Z51eMWsZPYRnPRJG2EjJmkBrJ
huZ9x0qnjEjUPAcUgMVqTo3hkRv0D24I10LAVQLETuw/
QOuWMG1VjybzLbXi5YScwcBDAgtEpsQA9o7u6VC00DGh
+2+4RmgrQ7mQ5A9MwhglVPaNXKuI6sEGlWripgTwm425
JFv2tGHROS55Hxx06A416MtxBpSEaPMYUs6jSIyf9cjB
BMV24OjkCxdz29zi+OyUyHwirW51BFSaOQuzaRiOsovM
NSEgKWLwzwsQ5cVJBEMw89c2V0sHa4yuI5rr79msRgZT
KCD7wa1Hyp7s/r+ylHhjpqrZwViOPU7tAGZ3IkkJ2SMI
e/h+FGiwXXhr769EHbVE/PqvdbpcsgsDqFu0K2oqY70u
SxnsLB8uVKYlzjG+UIoQzefBluQl
) ; key id = 62910
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Nov 27 18:18:30 2013
;; MSG SIZE rcvd: 839
检查是否存在RRSIG记录。
dig A example.com. @localhost +noadditional +dnssec +multiline
; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> A example.com. @localhost +noadditional +dnssec +multiline
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32902
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 5
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;example.com. IN A
;; ANSWER SECTION:
example.com. 86400 IN A 93.184.216.119
example.com. 86400 IN RRSIG A 7 2 86400 20131227171405 (
20131127171405 40400 example.com.
JCoL8L7As1a8CXnx1W62O94eQl6zvVQ3prtNK7BWIW9O
lir/4V+a6c+0tbt4z4lhgmb0sb+qdvqRnlI7CydaSZDb
hlrJA93fHqFqNXw084YD1gWC+M8m3ewbobiZgBUh5W66
1hsVjWZGvvQL+HmobuSvsF8WBMAFgJgYLg0YzBAvwHIk
886be6vbNeAltvPl9I+tjllXkMK5dReMH40ulgKo+Cwb
xNQ+RfHhCQIwKgyvL1JGuHB125rdEQEVnMy26bDcC9R+
qJNYj751CEUZxEEGI9cZkD44oHwDvPgF16hpNZGUdo8P
GtuH4JwP3hDIpNtGTsQrFWYWL5pUuuQRwA== )
;; AUTHORITY SECTION:
example.com. 86400 IN NS master.example.com.
example.com. 86400 IN NS slave.example.com.
example.com. 86400 IN RRSIG NS 7 2 86400 20131227171405 (
20131127171405 40400 example.com.
hEGzNvKnc3sXkiQKo9/+ylU5WSFWudbUc3PAZvFMjyRA
j7dzcVwM5oArK5eXJ8/77CxL3rfwGvi4LJzPQjw2xvDI
oVKei2GJNYekU38XUwzSMrA9hnkremX/KoT4Wd0K1NPy
giaBgyyGR+PT3jIP95Ud6J0YS3+zg60Zmr9iQPBifH3p
QrvvY3OjXWYL1FKBK9+rJcwzlsSslbmj8ndL1OBKPEX3
psSwneMAE4PqSgbcWtGlzySdmJLKqbI1oB+d3I3bVWRJ
4F6CpIRRCb53pqLvxWQw/NXyVefNTX8CwOb/uanCCMH8
wTYkCS3APl/hu20Y4R5f6xyt8JZx3zkZEQ== )
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Nov 28 00:01:06 2013
;; MSG SIZE rcvd: 1335
主服务器的配置已完成。
DNSSEC从站配置
该 从属服务器只需要DNSSEC启用和区域文件的位置被改变。编辑BIND的主配置文件。nano /etc/named.conf
放置在里面这些行
options { }
如果它们不存在部分。
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
编辑
file
里面的选项
zone { }
部分。
zone "example.com" IN {
type slave;
file "example.com.zone.signed";
masters { 1.1.1.1; };
allow-notify { 1.1.1.1; };
};
重新加载BIND服务。
service named reload
检查是否有新的
.signed
区域文件。
[root@slave ~]# ls -l /var/named/slaves/
total 16
-rw-r--r-- 1 named named 472 Nov 27 17:25 example.com.zone
-rw-r--r-- 1 named named 9180 Nov 27 18:29 example.com.zone.signed
Voila!而已。只是为了确保一切正常,他们应该,查询使用DNSKEY
dig
上一节中提到。
使用注册商配置DS记录
当我们跑了dnssec-signzone
在命令除了
.signed
区域文件,一个文件名为
dsset-example.com
也被创造了,这包含了DS记录。
root@master:/var/cache/bind# cat dsset-example.com.
example.com. IN DS 62910 7 1 1D6AC75083F3CEC31861993E325E0EEC7E97D1DD
example.com. IN DS 62910 7 2 198303E265A856DE8FE6330EDB5AA76F3537C10783151AEF3577859F FFC3F59D
这些必须输入您的域名注册商的控制面板。下面的截图将说明GoDaddy的步骤。 登录到您的域名注册商的控制面板,选择您的域,然后选择管理DS记录的选项。 GoDaddy的控制面板看起来像这样。
下面是在数据的分手
dsset-example.com.
文件。
DS记录1:
主要标签:62910 算法:7 摘要类型:1 摘要:1D6AC75083F3CEC31861993E325E0EEC7E97D1DDDS记录2:
主要标签:62910 算法:7 摘要类型:2 摘要:198303E265A856DE8FE6330EDB5AA76F3537C10783151AEF3577859FFFC3F59D 中第二个DS记录dsset-example.com.
文件曾在一个消化的空间,但在表单中输入时,你应该忽略它。 单击
下一步 ,单击
Finish并
保存记录。
这些更改需要几分钟时间才能保存。要检查是否已创建DS记录,请查询TLD的Nameservers。相反,找到顶级域名的域名服务器,我们可以做一个
dig +trace
这要简单得多。
root@master:~# dig +trace +noadditional DS example.com. @8.8.8.8 | grep DS
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> +trace +noadditional DS example.com. @8.8.8.8
example.com. 86400 IN DS 62910 7 2 198303E265A856DE8FE6330EDB5AA76F3537C10783151AEF3577859F FFC3F59D
example.com. 86400 IN DS 62910 7 1 1D6AC75083F3CEC31861993E325E0EEC7E97D1DD
一旦确认,我们可以使用以下任何在线服务检查DNSSEC是否正常工作。
第一个工具是一个简单的工具,而第二个工具给你的东西的视觉表示。这是第一个工具的屏幕截图。
注意我已经标记的行。第一个提到的DS记录的
关键字标签值(62910),而DNSKEY记录的第二个
键ID(40400)持有的ZSK(区签名密钥)。
修改区域记录
每次通过添加或删除记录来编辑区域时,必须对其进行签名才能使其工作。因此,我们将为此创建一个脚本,以便我们不必每次都键入长命令。root@master# nano /usr/sbin/zonesigner.sh
#!/bin/sh
PDIR=`pwd`
ZONEDIR="/var/cache/bind" #location of your zone files
ZONE=$1
ZONEFILE=$2
DNSSERVICE="bind9" #On CentOS/Fedora replace this with "named"
cd $ZONEDIR
SERIAL=`/usr/sbin/named-checkzone $ZONE $ZONEFILE | egrep -ho '[0-9]{10}'`
sed -i 's/'$SERIAL'/'$(($SERIAL+1))'/' $ZONEFILE
/usr/sbin/dnssec-signzone -A -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) -N increment -o $1 -t $2
service $DNSSERVICE reload
cd $PDIR
保存文件并使其可执行。
root@master# chmod +x /usr/sbin/zonesigner.sh
每当你想添加或删除的记录,编辑
example.com.zone
和
不.signed
文件 。此文件还负责递增序列值,因此您无需在每次编辑文件时都执行此操作。编辑后,通过传递域名和区域文件名作为参数运行脚本。
root@master# zonesigner.sh example.com example.com.zone
您不必在从属Nameservers上执行任何操作,因为递增的序列将确保传输和更新的区域。
从区域步行保护DNSSEC设置
区散步是通过查询 NSEC(下一页-Secure公司)记录 。NSEC3发布使用Salt,“散列”这些信息用来寻找区域的所有资源记录的技术。 回想dnssec-signzone
在我们指定的命令
-3
选项,接着又复杂的命令生成一个随机字符串。 这是可以使用以下中发现的Salt
dig
查询。
# dig NSEC3PARAM example.com. @master.example.com. +short
1 0 10 7CBAA916230368F2
所有这些使得区域行走困难,但不是不可能。使用A意志坚定的黑客
彩虹表可以打破哈希,尽管它会需要很长的时间。 为了防止这种情况,我们可以定期重新计算这个Salt,这使得黑客的尝试徒劳无益,因为有一个新的Salt,他/她可以找到与旧Salt的哈希。 创建一个cron作业来使用我们之前创建的
zonesigner.sh脚本为你做这个。 如果您运行的cronjob为
root
不必担心文件的所有权。 否则,确保你把谁的cron下的用户已经
对区域目录写权限
和私有密钥读取权限 (Kexample.com。*私有的)。
root@master:~# crontab -e
0 0 */3 * * /usr/sbin/zonesigner.sh example.com example.com.zone
这将每隔3天对该区域进行签名,因此将生成一个新的Salt。您还会收到包含的输出电子邮件
dnssec-signzone
命令。
:提交
Jesin一