如何设置DNSSEC的权威BIND DNS服务器上

关于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.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的控制面板看起来像这样。 GoDaddy的域控制面板 下面是在数据的分手 dsset-example.com.文件。

DS记录1:

主要标签:62910 算法:7 摘要类型:1 摘要:1D6AC75083F3CEC31861993E325E0EEC7E97D1DD DS记录1

DS记录2:

主要标签:62910 算法:7 摘要类型:2 摘要:198303E265A856DE8FE6330EDB5AA76F3537C10783151AEF3577859FFFC3F59D DS记录2 中第二个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一
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏