13.4 安全的加密传输
前文反复提及,域名解析服务是互联网基础设施中重要的一环,几乎所有的网络应用都依赖于DNS才能正常运行。如果DNS服务发生故障,那么即便Web网站或电子邮件系统服务等都正常运行,用户也无法找到并使用它们了。
互联网中的绝大多数DNS服务器(超过95%)都是基于BIND域名解析服务搭建的,而bind服务程序为了提供安全的解析服务,已经对TSIG(RFC 2845)加密机制提供了支持。TSIG主要是利用了密码编码的方式来保护区域信息的传输(Zone Transfer),即TSIG加密机制保证了DNS服务器之间传输域名区域信息的安全性。
接下来的实验依然使用了表13-2中的两台服务器。
书接上回。前面在从服务器上配妥bind服务程序并重启后,即可看到从主服务器中获取到的数据配置文件。
主机名称 | 操作系统 | IP地址 |
主服务器 | RHEL 7 | 192.168.10.10 |
从服务器 | RHEL 7 | 192.168.10.20 |
- [root@linuxprobe ~]# ls -al /var/named/slaves/
- total 12
- drwxrwx---. 2 named named 54 Jun 7 16:02 .
- drwxr-x---. 6 root named 4096 Jun 7 15:58 ..
- -rw-r--r--. 1 named named 432 Jun 7 16:02 192.168.10.arpa
- -rw-r--r--. 1 named named 439 Jun 7 16:02 linuxprobe.com.zone
- [root@linuxprobe ~]# rm -rf /var/named/slaves/*
第1步:在主服务器中生成密钥。dnssec-keygen命令用于生成安全的DNS服务密钥,其格式为“dnssec-keygen [参数]”,常用的参数以及作用如表13-3所示。
表13-3 dnssec-keygen命令的常用参数
参数 | 作用 |
-a | 指定加密算法,包括RSAMD5(RSA)、RSASHA1、DSA、NSEC3RSASHA1、NSEC3DSA等 |
-b | 密钥长度(HMAC-MD5的密钥长度在1~512位之间) |
-n | 密钥的类型(HOST表示与主机相关) |
使用下述命令生成一个主机名称为master-slave的128位HMAC-MD5算法的密钥文件。在执行该命令后默认会在当前目录中生成公钥和私钥文件,我们需要把私钥文件中Key参数后面的值记录下来,一会儿要将其写入传输配置文件中。
- [root@linuxprobe ~]# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST master-slave
- Kmaster-slave.+157+46845
- [root@linuxprobe ~]# ls -al Kmaster-slave.+157+46845.*
- -rw-------. 1 root root 56 Jun 7 16:06 Kmaster-slave.+157+46845.key
- -rw-------. 1 root root 165 Jun 7 16:06 Kmaster-slave.+157+46845.private
- [root@linuxprobe ~]# cat Kmaster-slave.+157+46845.private
- Private-key-format: v1.3
- Algorithm: 157 (HMAC_MD5)
- Key: 1XEEL3tG5DNLOw+1WHfE3Q==
- Bits: AAA=
- Created: 20170607080621
- Publish: 20170607080621
- Activate: 20170607080621
第2步:在主服务器中创建密钥验证文件。进入bind服务程序用于保存配置文件的目录,把刚刚生成的密钥名称、加密算法和私钥加密字符串按照下面格式写入到tansfer.key传输配置文件中。为了安全起见,我们需要将文件的所属组修改成named,并将文件权限设置得要小一点,然后把该文件做一个硬链接到/etc目录中。
- [root@linuxprobe ~]# cd /var/named/chroot/etc/
- [root@linuxprobe etc]# vim transfer.key
- key "master-slave" {
- algorithm hmac-md5;
- secret "1XEEL3tG5DNLOw+1WHfE3Q==";
- };
- [root@linuxprobe etc]# chown root:named transfer.key
- [root@linuxprobe etc]# chmod 640 transfer.key
- [root@linuxprobe etc]# ln transfer.key /etc/transfer.key
第3步:开启并加载Bind服务的密钥验证功能。首先需要在主服务器的主配置文件中加载密钥验证文件,然后进行设置,使得只允许带有master-slave密钥认证的DNS服务器同步数据配置文件:
- [root@linuxprobe ~]# vim /etc/named.conf
- 1 //
- 2 // named.conf
- 3 //
- 4 // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
- 5 // server as a caching only nameserver (as a localhost DNS resolver only).
- 6 //
- 7 // See /usr/share/doc/bind*/sample/ for example named configuration files.
- 8 //
- 9 include "/etc/transfer.key";
- 10 options {
- 11 listen-on port 53 { any; };
- 12 listen-on-v6 port 53 { ::1; };
- 13 directory "/var/named";
- 14 dump-file "/var/named/data/cache_dump.db";
- 15 statistics-file "/var/named/data/named_stats.txt";
- 16 memstatistics-file "/var/named/data/named_mem_stats.txt";
- 17 allow-query { any; };
- 18 allow-transfer { key master-slave; };
- ………………省略部分输出信息………………
- [root@linuxprobe ~]# systemctl restart named
至此,DNS主服务器的TSIG密钥加密传输功能就已经配置完成。此时清空DNS从服务器同步目录中所有的数据配置文件,然后再次重启bind服务程序,这时就已经不能像刚才那样自动获取到数据配置文件了。
- [root@linuxprobe ~]# rm -rf /var/named/slaves/*
- [root@linuxprobe ~]# systemctl restart named
- [root@linuxprobe ~]# ls /var/named/slaves/
第4步:配置从服务器,使其支持密钥验证。配置DNS从服务器和主服务器的方法大致相同,都需要在bind服务程序的配置文件目录中创建密钥认证文件,并设置相应的权限,然后把该文件做一个硬链接到/etc目录中。
- [root@linuxprobe ~]# cd /var/named/chroot/etc
- [root@linuxprobe etc]# vim transfer.key
- key "master-slave" {
- algorithm hmac-md5;
- secret "1XEEL3tG5DNLOw+1WHfE3Q==";
- };
- [root@linuxprobe etc]# chown root:named transfer.key
- [root@linuxprobe etc]# chmod 640 transfer.key
- [root@linuxprobe etc]# ln transfer.key /etc/transfer.key
第5步:开启并加载从服务器的密钥验证功能。这一步的操作步骤也同样是在主配置文件中加载密钥认证文件,然后按照指定格式写上主服务器的IP地址和密钥名称。注意,密钥名称等参数位置不要太靠前,大约在第43行比较合适,否则bind服务程序会因为没有加载完预设参数而报错:
- [root@linuxprobe etc]# vim /etc/named.conf
- 1 //
- 2 // named.conf
- 3 //
- 4 // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
- 5 // server as a caching only nameserver (as a localhost DNS resolver only).
- 6 //
- 7 // See /usr/share/doc/bind*/sample/ for example named configuration files.
- 8 //
- 9 include "/etc/transfer.key";
- 10 options {
- 11 listen-on port 53 { 127.0.0.1; };
- 12 listen-on-v6 port 53 { ::1; };
- 13 directory "/var/named";
- 14 dump-file "/var/named/data/cache_dump.db";
- 15 statistics-file "/var/named/data/named_stats.txt";
- 16 memstatistics-file "/var/named/data/named_mem_stats.txt";
- 17 allow-query { localhost; };
- 18
- 19 /*
- 20 - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
- 21 - If you are building a RECURSIVE (caching) DNS server, you need to enable
- 22 recursion.
- 23 - If your recursive DNS server has a public IP address, you MUST enable access
- 24 control to limit queries to your legitimate users. Failing to do so will
- 25 cause your server to become part of large scale DNS amplification
- 26 attacks. Implementing BCP38 within your network would greatly
- 27 reduce such attack surface
- 28 */
- 29 recursion yes;
- 30
- 31 dnssec-enable yes;
- 32 dnssec-validation yes;
- 33 dnssec-lookaside auto;
- 34
- 35 /* Path to ISC DLV key */
- 36 bindkeys-file "/etc/named.iscdlv.key";
- 37
- 38 managed-keys-directory "/var/named/dynamic";
- 39
- 40 pid-file "/run/named/named.pid";
- 41 session-keyfile "/run/named/session.key";
- 42 };
- 43 server 192.168.10.10
- 44 {
- 45 keys { master-slave; };
- 46 };
- 47 logging {
- 48 channel default_debug {
- 49 file "data/named.run";
- 50 severity dynamic;
- 51 };
- 52 };
- 53
- 54 zone "." IN {
- 55 type hint;
- 56 file "named.ca";
- 57 };
- 58
- 59 include "/etc/named.rfc1912.zones";
- 60 include "/etc/named.root.key";
- 61
第6步:DNS从服务器同步域名区域数据。现在,两台服务器的bind服务程序都已经配置妥当,并匹配到了相同的密钥认证文件。接下来在从服务器上重启bind服务程序,可以发现又能顺利地同步到数据配置文件了。
- [root@linuxprobe ~]# systemctl restart named
- [root@linuxprobe ~]# ls /var/named/slaves/
- 192.168.10.arpa linuxprobe.com.zone
出现问题?大胆提问!
因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~
Linux技术交流请加A群:560843(满),B群:340829(推荐),C群:463590(推荐),点此查看全国群。
*本群特色:通过口令验证确保每一个群员都是《Linux就该这么学》的读者,答疑更有针对性,不定期免费领取定制礼品。