首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

企业开源域名服务安全防护策略及实战-5

企业开源域名服务安全防护策略及实战-5

合理配置 DNS 的查询方式提高效率DNS 的查询方式有两种,递归查询和迭代查询。合理配置这两种查询方式,能够在实践中取得较好的效果。
其中,递归查询是最常见的查询方式,工作方式是:域名服务器将代替提出请求的客户机(下级 DNS 服务器)进行域名查询,若域名服务器不能直接回答,则域名服务器会在域各树中的各分支的上下进行递归查询,最终将返回查询结果给客户机,在域名服务器查询期间,客户机将完全处于等待状态。具体流程示意请见图 2:
图 2.DNS 递归查询流程示意迭代查询又称重指引查询。其工作方式为:当服务器使用迭代查询时能够使其他服务器返回一个最佳的查询点提示或主机地址,若此最佳的查询点中包含需要查询的主机地址,则返回主机地址信息,若此时服务器不能够直接查询到主机地址,则是按照提示的指引依次查询,直到服务器给出的提示中包含所需要查询的主机地址为止,一般的,每次指引都会更靠近根服务器(向上),查寻到根域名服务器后,则会再次根据提示向下查找。具体流程示意如图 3 所示:
图 3.DNS 迭代查询流程示意综合上面两点,我们可以看出来,递归查询就是客户机会等待最后结果的查询,而迭代查询是客户机等到的不一定是最终的结果,而可能是一个查询提示。因而存在如下两个问题:
  • 二级 DNS 向一级 DNS 发起递归查询,会对一级 DNS 造成性能压力,所有跨域查询都要经过一级 DNS 响应给对应二级 DNS;
  • 二级 DNS 向一级 DNS 发起递归查询,再由一级向归属 DNS 发起递归的模式查询响应会有一定延时;
因此,有很多流量很大的 DNS 服务器是禁止客户机使用递归查询,用这种方式来减轻服务器的流量。
使用 dnstop 监控 DNS 流量在维护 DNS 服务器时,用户往往希望知道到底是哪些用户在使用 DNS 服务器,同时也希望能对 DNS 状态查询做一个统计,以及时地知道 DNS 的工作情况和状态。在传统的方式下,用户通常使用的是 tcpdump 等开源工具来进行抓包并通过查看 53 端口的流量来查看 DNS 数据包。由于 tcpdump 并没有针对 DNS 流量进行特殊定制,因此使用起来可能不是非常方便。因此,用户可以使用专用于 DNS 的 dnstop 工具查询 DNS 服务器状态。
dnstop 是一种非常优秀的开源软件,用户可以到网站 http://dns.measurement-factory.com/tools/dnstop/src/ 上进行下载使用,目前该软件的最新版本为:dnstop-20090128.tar.gz
由于该软件依赖 tcpdump 和 pcap 抓包库(libpcap)对网络上传输的数据包进行截获和过滤,所以用户需要确保系统安装相应软件后才能正常安装和使用 dnstop。通常情况下,这两种必须的库都已经在系统中预装好了,使用下面的命令安装 dnstop 即可:
(1)解压缩源代码安装包
1
#tar vxfz ddnstop-20090128.tar.gz




(2)切换到解压目录,并使用 configure 命令生成 Makefile 文件
1
2
#cd dnstop-20090128
#./configure




(3)使用 make 命令进行安装
1
#make




安装成功后,可以查看通过相应的网络接口来监控 DNS 网络流量,如下所示:
1
2
3
4
5
6
7
#./dnstop -s eth0
0 new queries, 6 total queries Fri Mar 26 20:18:12 2010
Sources count %
---------------- --------- ------
198.35.0.13 4 66.7
198.35.0.14 1 16.7
198.35.0.15 1 16.7




在运行 dnstop 的过程中,可以键入 <S>、<D>、<T>、<1>、<2>、<Ctr+R>、<Ctr+X> 等方式以交互方式来显示不同的信息:
  • S:记录发送 DNS 查询的客户端 IP 地址列表
  • D:记录 DNS 查询的目的服务器的 IP 地址表
  • T:记录查询详细类型
  • 1:记录查询的顶级域名
  • 2:记录查询的二级域名
  • Ctr+R:重新纪录
  • Ctr+X:退出
更详细信息可以使用 dnstop –help 命令进行查看。
使用 DNSSEC 技术保护 DNS 安全DNSSEC 主要依靠公钥技术对于包含在 DNS 中的信息创建密码签名。密码签名通过计算出一个密码 hash 数来提供 DNS 中数据的完整性,并将该 hash 数封装进行保护。私/公钥对中的私钥用来封装 hash 数,然后可以用公钥把 hash 数译出来。如果这个译出的 hash 值匹配接收者刚刚计算出来的 hash 树,那么表明数据是完整的。不管译出来的 hash 数和计算出来的 hash 数是否匹配,对于密码签名这种认证方式都是绝对正确的,因为公钥仅仅用于解密合法的 hash 数,所以只有拥有私钥的拥有者可以加密这些信息。
DNSSEC 的功能主要有三个方面:
  • 为 DNS 数据提供来源验证,即保证数据来自正确的名称服务器。
  • 为数据提供完整性验证,即保证数据在传输的过程中没有任何的更改。
  • 否定存在验证,即对否定应答报文提供验证信息,确认授权名称服务器上不存在所查询的资源记录。DNSSEC 为了实现签名和签名的验证功能,引入了四个新的资源记录类型:
    • DNSKEY:用于存储验证 DNS 数据的公钥;
    • RRSIG:用于存储 DNS 资源记录的签名信息;
    • NSEC:存储和对应的所有者相邻的下一个资源记录,主要用于否定存在验证;
    • DS(Delegation Signer,授权签名者):用于 DNSKEY 验证过程,存储密钥标签,加密算法和对应的 DNSKEY 的摘要信息。
DNSSEC 的工作机制主要体现在 DNS 工作过程中的以下 2 个方面:
(1)DNS 查询 / 应答:这一步因为使用了未加密和未验证的 UDP 数据包,存在严重的安全漏洞。DNSSEC 在这一步中加入了对数据源的验证和对数据完整性的校验。DNSSEC 要对某个域的数据进行验证,客户端就必须信任这个域的公钥。由于 DNS 中没有第三方的公钥验证体系,要建立对公钥的信任,就必须从一个已经被信任的名称服务器(如根服务器)开始,由此服务器验证其子域的公钥。然后再由这个子域的公钥验证其子域的公钥,一直到所请求的域的公钥得到验证,这个过程称为建立信任链。起始受信任的名称服务器的公钥就被称为信任锚点。验证数据源以后,下一步验证应答信息本身,它要求应答不仅包括请求的资源记录,还包括验证这些资源记录的所需的信息,即一个资源记录集的数字签名,它包含 RRSIG 中。使用信任锚点的 DNS 客户端就可以通过验证此数字签名来检查应答报文是否真实。为了保证和查询相应的资源记录的确不存在,而不是在传输过程中被删除,DNSSEC 生成一个特殊的资源类型记录(NSEC)来检测域名是否存在。
(2)DNS 域区传输:一个域区中一般有主域名服务器和备份域名服务器,域区传输就是域区文件从主域名服务器 copy 到备份域名服务器上的过程。在这个过程中面临着数据包拦截和更改的危险。DNSSEC 用 TSIG(Transaction Signature,事务签名)来验证请求方的真实身份和保证传输内容在传输过程中被篡改。
因此,DNSSEC 的部署主要有三个步骤:
  • 生成公 / 私密钥对
  • 公钥的发布及私钥的存储
  • 域区的签署
DNSSEC 也是一种非常优秀的开源工具,用户可以到 http://sourceforge.net/projects/ ... 1.5.tar.gz/download 网站上进行下载和安装,目前其最新版本为 dnssec-tools-1.5.tar.gz。安装的具体步骤如下所示:
(1)解压缩源代码安装包
1
#tar vxfz dnssec-tools-1.5.tar.gz




(2)切换到解压目录,并使用 configure 命令生成 Makefile 文件
1
2
#cd dnssec-tools-1.5
#./configure




(3)使用 make 命令进行安装
1
#make




下面我们通过一个实际的例子来说明如何为名称是 feixiang.com 的域建立 DNSSEC 配置。使用 DNSSEC 保护 DNS 的步骤如下所示:
(1)为 feixiang.com 域建立一对密钥。在 /var/named 目录下,使用如下命令:
1
#/usr/sbin/dnssec-keygen -a DSA -b 768 -n ZONE feixiang.com




这个命令产生一对长度 768 位 DSA 算法的私有密钥和公共密钥。
(2)使用如下命令
1
#/usr/sbin/dnssec-makekeyset -t 1800 -e now+21 Kfeixiang.com.+003+29462




建立一个密钥集合。该命令以 1800 秒的生存时间(time-to-live)建立密钥集合,有效期限 21 天,并且创建一个文件:feixiang.com.keyset。
(3)使用命令
1
#/usr/sbin/dnssec-signkey feixiang.com.keyset Kfeixiang.com.+003+29462




为密钥集合签名。然后建立一个签名文件:feixiang.com.signedkey。
(4)使用命令
1
#/usr/sbin/dnssec-signzone -o feixiang.com feixiang.com.signed




为区带文件签名。然后建立一个签名文件:feixiang.com.signed。
(5)替换配置文件 /etc/named.conf 中 feixiang.com 的区文件部分。如下所示:
1
2
3
4
zone “feixiang.com” IN {
type master;
file “feixiang.com.signed”;
allow-update { none; }; };




总结本文详细介绍了企业如何保证开源域名服务的安全防护策略和实战,包括开源 DNS 面临的主要安全威胁、DNS 服务安全配置、使用 DNS 服务器的高级安全技巧,希望能为开源系统爱好者和系统工程师在实际工作中提供参考。
返回列表