在Linux(RHEL/CentOS 7)中使用DNSSEC密钥保护主从DNS服务器

时间:2020-02-23 14:40:25  来源:igfitidea点击:

在本文中,将介绍"使用DNSSEC保护主从DNS服务器"的步骤。

DNSSEC代表域名系统安全性扩展,是应用于DNS的加密安全性。

在DNS层次结构中,一个域中具有不同的名称服务器是一个好主意。
就像我们的情况一样,我们有master.example.comslave.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服务器。