在Linux(RHEL/CentOS 7)中使用DNSSEC密钥保护主从DNS服务器
在本文中,将介绍"使用DNSSEC保护主从DNS服务器"的步骤。
DNSSEC代表域名系统安全性扩展,是应用于DNS的加密安全性。
在DNS层次结构中,一个域中具有不同的名称服务器是一个好主意。
就像我们的情况一样,我们有master.example.com
和slave.example.com
。
这些名称服务器将被配置为主服务器和从属服务器,并且主服务器和从属服务器都可以被联系。
但是通常情况下,它将是唯一可以写入数据的主机名服务器。
在主域名服务器中,有一个同步过程,我们称为区域传输,它可以由主域名服务器触发,也可以由从属域名服务器请求
DNS服务器的安全挑战
第一个挑战是可能发生欺骗。
欺骗意味着其他人伪装成有效的名称服务器。如果此名称服务器正在使用转发器,并且该转发器被欺骗,那么我们如何知道我们正在使用欺骗性的名称服务器?
当我们直接联系根DNS名称服务器时,情况变得有些复杂,但是在那里确实存在问题。有损害命名守护程序本身。
在Linux机器上,DNS是通过运行绑定软件来实现的,并且绑定软件带有一个名称守护程序,该名称守护程序可能会遭到破坏。
未经授权的访问可能是一个问题。
当前,通常在本地DNS名称服务器中发布有关本地环境中可用服务的信息,并且我们不希望环境中的任何人都可以访问该信息。
这些安全挑战的解决方案
首先,有DNSSEC。
我们可以使用DNSSEC保护主从DNS服务器。DNSSEC使用公用专用密钥将签名添加到从名称服务器发送来的信息中。
同样,同步过程(区域传输)可以由TSIG来保护,TSIG也使用密钥来保护在本地同步的本地名称服务器之间的信息传输。
在DNS配置中,我们可以限制访问,因此可以限制递归,可以限制转发,可以在许多项目上设置限制。
而且,如果DNS服务器仅应用于私有环境,则最好使用其中一些限制参数。
并且可以选择以chroot协议运行绑定过程。
chroot环境的想法是,该进程将仅看到它需要查看的目录,并且将无法遍历整个操作系统文件系统层次结构。
服务器设置
主DNS服务器-10.0.2.32(master.example.com)
从DNS服务器-10.0.2.31(slave.example.com)
使用DNSSEC保护主从DNS服务器
我们将集中我们的文章以仅使用DNSSEC密钥保护主从DNS服务器的安全,这样它就不会成为冗长而枯燥的文章。
我们将使用DNSSEC密钥,而不是使用配置文件中的各种参数来告知我们的DNS主服务器和从属服务器。
重要的提示:
确保主服务器和从属DNS服务器之间的时间同步,否则我们可能会遇到"尝试主服务器XX.XX.XX.XX#53(源0.0.0.0#0)失败:时钟未同步"错误。
启用DNSSEC
因此,我们要做的第一件事是确保在主DNS服务器和客户端DNS服务器上的/etc/named.conf下启用了DNSSEC。
在/etc/named.conf
下查找以下值:
dnssec-enable yes; dnssec-validation yes;
在主DNS服务器上生成密钥
使用DNSSEC,我们可以使用加密密钥对区域进行签名,以便使用该加密密钥可以与其他DNS服务器交换密钥。
让我们为我们的主DNS服务器生成安全密钥,即master.example.com
:
[root@master ~]# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST master.example.com Kmaster.example.com.+157+13540
"其中"
-a algorithm Selects the cryptographic algorithm. For DNSSEC keys, the value of algorithm must be one of RSAMD5, RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512, ECCGOST, ECDSAP256SHA256 or ECDSAP384SHA384. For TSIG/TKEY, the value must be DH (Diffie Hellman), HMAC-MD5, HMAC-SHA1, HMAC-SHA224, HMAC-SHA256, HMAC-SHA384, or HMAC-SHA512. These values are case insensitive -b keysize Specifies the number of bits in the key. -n nametype Specifies the owner type of the key.
此命令将在当前目录中生成两种类型的安全密钥。
[root@master ~]# ls -l Kmaster.example.com.+157+13540.* -rw------- 1 root root 62 Jun 22 19:58 Kmaster.example.com.+157+13540.key -rw------- 1 root root 165 Jun 22 19:58 Kmaster.example.com.+157+13540.private
从* .private文件获取密钥:
[root@master ~]# cat Kmaster.example.com.+157+13540.private Private-key-format: v1.3 Algorithm: 157 (HMAC_MD5) Key: yVisaOhpnWZEGaD4g+DKwg== Bits: AAA= Created: 20190622142816 Publish: 20190622142816 Activate: 20190622142816
将DNS密钥添加到主DNS服务器上的named.conf
现在要保护主从DNS服务器,我们必须编辑/etc/named.conf
并添加以下内容:
key master { algorithm hmac-md5; secret "yVisaOhpnWZEGaD4g+DKwg=="; };
其中用密钥替换" yVisaOhpnWZEGaD4g + DKwg =="。
如果我们使用了不同的算法来生成密钥,则在此处定义相同的算法类型。
同时使用主DNS服务器的" NS"修改"允许转移"规则:
allow-transfer { key master; };
以下是我对主DNS服务器所做的所有更改后的示例named.conf
[root@master ~]# cat /etc/named.conf options { listen-on port 53 { 127.0.0.1; 10.0.2.32; }; # listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; recursing-file "/var/named/data/named.recursing"; secroots-file "/var/named/data/named.secroots"; allow-query { localhost; any; }; allow-query-cache { localhost; any; }; allow-transfer { key master; }; notify yes; also-notify { 10.0.2.31; }; recursion yes; dnssec-enable yes; dnssec-validation yes; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; key master { algorithm hmac-md5; secret "yVisaOhpnWZEGaD4g+DKwg=="; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
在从属DNS服务器上修改named.conf
为了保护主从DNS服务器,我们需要对所有从属服务器的/etc/named.conf
进行类似的修改,并通过在named.conf
中添加以下内容来添加DNS安全密钥:
key master { algorithm hmac-md5; secret "yVisaOhpnWZEGaD4g+DKwg=="; };
其中用密钥替换" yVisaOhpnWZEGaD4g + DKwg =="。
如果我们使用了不同的算法来生成dnssec密钥,则在此处定义相同的算法类型。
将密钥绑定到主服务器:
server 10.0.2.32 { keys master; };
其中用IP替换10.0.2.32
,用主DNS服务器的NS替换master
以下是我从奴隶DNS服务器的示例named.conf
[root@slave ~]# cat /etc/named.conf options { listen-on port 53 { 127.0.0.1; any; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; recursing-file "/var/named/data/named.recursing"; secroots-file "/var/named/data/named.secroots"; allow-query { localhost; any; }; allow-query-cache { localhost; any; }; recursion yes; dnssec-enable yes; dnssec-validation yes; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; key master { algorithm hmac-md5; secret "yVisaOhpnWZEGaD4g+DKwg=="; }; server 10.0.2.32 { keys master; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
验证主到从数据复制
现在,我们完成了使用DNSSEC密钥保护主从DNS服务器的步骤,因此让我们验证我们的配置:
在主DNS服务器上,对转发区域文件进行一些更改并更改序列号值:
重要的提示:
确保每次修改区域文件时都更新突出显示的序列号,否则从站将无法获取更新。
[root@master ~]# vim /var/named/example.com.zone $TTL 1D @ IN SOA example.com root ( 11 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum IN NS master master IN A 10.0.2.32 localhost IN A 127.0.0.1 client IN A 10.0.2.30 slave IN A 10.0.2.31 test IN A 10.0.2.33
接下来,在主DNS服务器上重新加载" named-chroot"服务。
[root@master ~]# systemctl reload named-chroot
监视从DNS服务器上/var/named/data/named.run
的输出
[root@slave ~]# tail -f /var/named/data/named.run Jun 22 23:04:03 slave named[6358]: client 10.0.2.32#4382: received notify for zone 'example.com' Jun 22 23:04:03 slave named[6358]: zone example.com/IN: Transfer started. Jun 22 23:04:03 slave named[6358]: transfer of 'example.com/IN' from 10.0.2.32#53: connected using 10.0.2.31#37024 Jun 22 23:04:03 slave named[6358]: zone example.com/IN: transferred serial 11: TSIG 'master' Jun 22 23:04:03 slave named[6358]: transfer of 'example.com/IN' from 10.0.2.32#53: Transfer completed: 1 messages, 8 records, 323 bytes, 0.003 secs (107666 bytes/sec)
因此,使用DNSSEC密钥将来自主DNS服务器的数据成功传输到了从DNS服务器。