关于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主配置
通过增加内以下的配置指令启用DNSSEC options{ }
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.comGenerating 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.comGenerating key pair......................++ .............................................................................................................................................................................................................++Kexample.com.+007+62910
该目录现在将有4个键 - 私有/公共对ZSK和KSK。我们必须添加含有的DNSKEY记录区域文件的公共密钥。 下面for
循环会做到这一点。
for key in `ls Kexample.com*.key`doecho "\$INCLUDE $key">> example.com.zonedone
标志的区域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.zoneVerifying 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.signedSignatures generated: 14Signatures retained: 0Signatures dropped: 0Signatures successfully verified: 0Signatures unsuccessfully verified: 0Signing time in seconds: 0.046Signatures per second: 298.310Runtime 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 = 40400example.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.119example.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 1D6AC75083F3CEC31861993E325E0EEC7E97D1DDexample.com. IN DS 62910 7 2 198303E265A856DE8FE6330EDB5AA76F3537C10783151AEF3577859F FFC3F59D
这些必须输入您的域名注册商的控制面板。下面的截图将说明GoDaddy的步骤。 登录到您的域名注册商的控制面板,选择您的域,然后选择管理DS记录的选项。 GoDaddy的控制面板看起来像这样。下面是在数据的分手
dsset-example.com.
文件。
DS记录1:
主要标签:62910 算法:7 摘要类型:1 摘要:1D6AC75083F3CEC31861993E325E0EEC7E97D1DD
DS记录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.8example.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/shPDIR=`pwd`ZONEDIR="/var/cache/bind" #location of your zone filesZONE=$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选项,接着又复杂的命令生成一个随机字符串。 这是可以使用以下中发现的Saltdig查询。
# 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一
https://www.howtoing.com/how-to-setup-dnssec-on-an-authoritative-bind-dns-server-2/