BINDNS服务器安全加固
2010-08-28 17:06:17 阿炯

互联网上DNS服务器的事实标准就是ISC的BIND,Bill Manning对in-addr域的调查发现,有95%的域名服务器(2的2000次方个服务器中)使用的是各种版本的“bind”。这其中包括了所有的 DNS根服务器,而这些根服务器对整个服务器的正常运转起着至关重要的作用。 DNS服务面临的安全隐患主要包括:DNS欺骗(DNS Spoffing)、拒绝服务(Denial of service,DoS)攻击、分布式拒绝服务攻击和缓冲区漏洞溢出攻击(Buffer Overflow)。

1.DNS欺骗
DNS欺骗即域名信息欺骗是最常见的DNS安全问题。当一个DNS服务器掉入陷阱,使用了来自一个恶意DNS服务器的错误信息,那么该DNS服务器就被欺 骗了。DNS欺骗会使那些易受攻击的DNS服务器产生许多安全问题,例如:将用户引导到错误的互联网站点,或者发送一个电子邮件到一个未经授权的邮件服务 器。网络攻击者通常通过两种方法进行DNS欺骗。
(1)缓存感染
黑客会熟练的使用DNS请求,将数据放入一个没有设防的DNS服务器的缓存当中。这些缓存信息会在客户进行DNS访问时返回给客户,从而将客户引导到入侵者所设置的运行木马的Web服务器或邮件服务器上,然后黑客从这些服务器上获取用户信息。
(2)DNS信息劫持
入侵者通过监听客户端和DNS服务器的对话,通过猜测服务器响应给客户端的DNS查询ID。每个DNS报文包括一个相关联的16位ID号,DNS服务器根据这个ID号获取请求源位置。黑客在DNS服务器之前将虚假的响应交给用户,从而欺骗客户端去访问恶意的网站。
(3)DNS重定向
攻击者能够将DNS名称查询重定向到恶意DNS服务器。这样攻击者可以获得DNS服务器的写权限。

2.拒绝服务攻击
黑客主要利用一些DNS软件的漏洞,如在 BIND 9版本(版本9.2.0以前的 9系列)如果有人向运行BIND的设备发送特定的DNS数据包请求,BIND就会自动关闭。攻击者只能使BIND关闭,而无法在服务器上执行任意命令。如 果得不到DNS服务,那么就会产生一场灾难:由于网址不能解析为IP地址,用户将无方访问互联网。这样,DNS产生的问题就好像是互联网本身所产生的问 题,这将导致大量的混乱。

3、分布式拒绝服务攻击
DDOS 攻击通过使用攻击者控制的几十台或几百台计算机攻击一台主机,使得服务拒绝攻击更难以防范:使服务拒绝攻击更难以通过阻塞单一攻击源主机的数据流,来防范 服务拒绝攻击。Syn Flood是针对DNS服务器最常见的分布式拒绝服务攻击。SYN Flood攻击利用的是IPv4中TCP协议的三次握手(Three-Way Handshake)过程进行的攻击。大家知道协议规定,如果一端想向另一端发起TCP连接,它需要首先发送TCP SYN 包到对方,对方收到后发送一个TCP SYN+ACK包回来,发起方再发送TCP ACK包回去,这样三次握手就结束了。我们把TCP连接的发起方叫作"TCP客户机(TCP Client)",TCP连接的接收方叫作"TCP服务器(TCP Server)"。
值得注意的是在TCP服务器收到TCP SYN request包时,在发送TCP SYN+ACK包回TCP客户机前,TCP服务器要先分配好一个数据区专门服务于这个即将形成的TCP连接。一般把收到SYN包而还未收到ACK包时的连 接状态成为半开连接(Half-open Connection)。在最常见的SYN Flood攻击中,攻击者在短时间内发送大量的TCP SYN包给受害者,这时攻击者是TCP客户机,受害者是TCP服务器。根据上面的描述,受害者会为每个TCP SYN包分配一个特定的数据区,只要这些SYN包具有不同的源地址(这一点对于攻击者来说是很容易伪造的)。这将给TCP服务器系统造成很大的系统负担, 最终导致系统不能正常工作。

4.缓冲区漏洞溢出攻击
黑客利用DNS服务器软件存在漏洞,比如对特定的输入没有进行严格检查,那幺有可能被攻击者利用,攻击者构造特殊的畸形数据包来对DNS服务器进行缓冲区 溢出攻击。如果这一攻击成功,就会造成DNS服务停止,或者攻击者能够在DNS服务器上执行其设定的任意代码。例如, 前一阵子针对 Linux 平台的 BIND的攻击(e.g. Lion worm)程序, 就是利用某些版本的 BIND 漏洞, 取得root 权限, 一旦入侵完成之后, 入侵者就可以完全控制整个相关的网络系统, 影响非常严重。主要包括:
(1)更改MX记录,造成邮件被截获、修改或删除。
(2)更改A记录,使您的WWW服务器的域名指向黑客的具有同样WWW内容的主机,诱使访问者登录,获取访问者的密码等相关信息。添加A记录,使黑客的主机拥有被相信的域名,以此来入侵通过启用域名信任机制的系统。
(3)利用这台主机作为攻击其他机器的“跳板”。
应对以上这些安全隐患方法有两个最有效的原则:
1. 选择安全没有缺陷的DNS版本:
BIND主要分为三个版本:
(1)v4,1998年多数UNIX捆绑的是BIND4,已经被多数厂商抛弃了,除了OpenBSD还在使用。OpenBSD核心人为BIND8过于复杂和不安全,所以继续使用BIND4。这样一来BIND8/9
的很多优点都不包括在v4中。
(2)v8,就是如今使用最多最广的版本,其详细内容可以参阅“BIND 8+ 域名服务器安
全增强”
(3)v9,最新版本的BIND,全部重新写过,免费(但是由商业公司资助),BIND9在2000年十月份推出,根据调查v9版本的BIND是最安全的,它的最新安全版本在其官方网站:http://www.isc.org/ 下载下载源代码安装即可。例如使用Linux系统针对拒绝服务攻击只要将BIND 9升级为版本9.6即可。

2.保持DNS服务器配置正确、可靠
这一点相对困难。Linux上的域名服务由named守护进程控制,该进程从主文件:/etc/named.conf中获取信息。它包括一组将主机名称映射为IP地址的各种文件。

可以看到DNS配置文件是一个复杂的系统。伴随DNS建立出现的许多问题都会引起相同的结果,但起因却不同。但大多数问题是由于配置文件中的语法错误而导 致的。DNS是一组文件构成的,所以需要不同工具检查对应文件。一个配置存在缺陷的DNS服务器会存在很大的安全漏洞。这里可以通过一些工具:nslookup、dig、named-checkzone、host、named-checkconf、dlint 等对DNS配置文件进行检查。其中安装BIND软件包时自动安装的工具包括:nslookup、dig、named-checkzone、host、 named-checkconf。dlint是一个专门检查DNS配置文件开放源代码软件。可以在
http://www.domtools.com/dns/dlint.shtml下载。

详细DNS服务器工作状态
在维护DNS服务器时,网管员希望知道到底是哪些用户在使用DNS服务器,同时也希望能对DNS状态查询做一个统计。这里我们可以使用dnstop查询DNS服务器状态:

软件下载和安装:
运行软件:
如果想查看通过eth0的DNS网络流量可以使用命令

在运行dnstop的过程中,可以敲入如下命令: s,d,t,1,2,3, ctrl+r,ctrl+x,以交互方式来显示不同的信息。
1-(TLD)记录查询的顶级域名,
2-(SLD)记录查询的二级域名,
3-(SLD)记录查询的三级域名,
s-(Source)记录发送dns查询的客户端ip地址表,
d-(Destinations)记录dns查询的目的服务器的ip地址表 ,
t-(Query Type)记录查询详细类型。
ctrl+r-重新纪录。
ctrl+x-退出。更详细信息可以查看man dnstop。

下面以使用最为广泛的Unix类DNS软件BIND为例,介绍如何配置一个安全DNS服务器。本文以RHEL 5.0为工作平台。
1.隔离DNS服务器
首先应该隔离BIND服务器,不应该在DNS服务器上跑其他服务,尽量允许普通用户登陆。减少其它的服务可以缩小被攻击的可能性,比如混合攻击。

2.隐藏BIND的版本号
通常软件的BUG信息是和特定版本相关的,因此版本号是黑客寻求最有价值的信 息。黑客使用dig命令可以查询BIND的版本号,然后黑客就知道这个软件有那些漏洞。因此随意公开版本号是不明智的。隐藏BIND版本号比较简单,修改 配置文件:/etc/named.conf,在option部分添加version声明将BIND的版本号信息覆盖。例如使用下面的配置声明,当有人请求 版本信息时,迫使nmaed显示:“Unsupported on this platform ”

3.避免透露服务器信息
和版本号一样,也不要轻易透露服务器其他信息。为了让潜在的黑客更难得手,建议不要在DNS配置文件中使用这HINFO 和 TXT两个资源记录。

4.关闭DNS服务器的glue fetching选项
当DNS服务器返回一个域的域名服务器纪录并且域名服务器纪录中没有A纪录,DNS服务器会尝试获取一个纪录。就称为glue fetching,攻击者可以利用它进行DNS欺骗。关闭glue fetching是一个好方法,修改配置文件:/etc/named.conf.加入一行:

5.使用非root权限运行BIND
在Linux内核2.3.99以后的版本中,可以以-u选项以非root权限运行BIND。命令如下:
上面的命令表示以nobody用户身份运行BIND。使用nobody身份运行能够降低缓冲区溢出攻击所带来的危险。

6.控制区域(zone)传输
默认情况下BIND的区域(zone)传输是全部开放的,如果没有限制那么 DNS服务器允许对任何人都进行区域传输的话,那么网络架构中的主机名、主机IP列表、路由器名和路由IP列表,甚至包括各主机所在的位置和硬件配置等情 况都很容易被入侵者得到。因此,要对区域传输进行必要的限制。可以通过在/etc/namedconf文件当中添加以下语句来限制区域传输:

这样只有IP地址为:从192.168.0.52到192.168.0.109的主机能够同DNS服务器进行区域传输。

7.请求限制
如果任何人都可以对DNS服务器发出请求,那么这是不能接受的。限制DNS服务器的服务范围很重要,可以把许多入侵者据之门外。修改BIND的配置文件:/etc/named.conf加入以下内容:
这样所有的用户都可以访问yourdomain.com的DNS服务器,但是只有168.192.1.0网段的主机用户可以请求DNS服务器的任意服务。 另外也不要允许其他网段的主机进行递归询问,在上面文件最后加入一行即可。

8. 其他強化措施:
(1)使用存取控制清单 (Access Control Lists),主要目的在于产生地址配对清单。
语法:acl “name” { address_match_list };
address_match_list:地址匹对清单。
例子:acl “mis”{192.168.200.15,192.168.143.192/26};
(2)使用Forwarders代询服务器机制,它将自己无法解析的查询转送到某特定的服务器。
语法:forwarders ip_address_liest
例子:以下是建议的 forwarders 设定(在/etc/named.conf中)
orwarders { // 指定提供查询的上层 DNS。
www.twnic.net.tw ; // 到上层 (twnic) 的 DNS 查询。
};
需注意的是通常我们指定的是到本身上一层 dns,但也可能因 dns 缓存有误而转送到错误的服务器上。
(3)使用allow-transfer:目的在于只允许授权的网域主机能更新、读取 DNS 辖区内的记录。
语法:allow-transfer { };
例子:address_match_list:允许进行 DNS 辖区数据传输主机的 IP 列表。
(4)allow-update:目的在于指定能向本 dns 服务器提交动态 dns 更新的主机
语法:allow-update { };
例子:address_match_list:允许能向本 DNS 服务器提交动态 DNS 更新的主机 IP 列表

9. 使用DNSSEC
DNS欺骗spoofing 对目前网络应用, 最大的冲击在于 冒名者借着提供假的网域名称与网址的对照信息, 可以将不知情用户的网页联机, 导引到错误的网站, 原本属于用户的电子邮件也可能因而遗失, 甚而进一步空开成为阻断服务的攻击。所幸, 目前较新的 BIND 版本, 针对这一类问题, 已经有加入许多改进的方法, 不过真正的解决方案, 则有赖封包认证机制的建立与推动。DNSSEC就是试图解决这一类问题的全新机制, BIND9 已经完整加以设计并完成。DNSSEC引入两个全新的资源记录类型:KEY和SIG,允许客户端和域名服务器对任何DNS数据的来源进行密码验证。
DNSSEC主要依靠公钥技术对于包含在DNS中的信息创建密码签名。密码签名通过计算出一个密码hash数来提供DNS中数据的完整性,并将该hash 数封装进行保护。私/公钥对中的私钥用来封装hash数,然后可以用公钥把hash数译出来。如果这个译出的hash值匹配接收者刚刚计算出来的hash 树,那么表明数据是完整的。不管译出来的hash数和计算出来的hash数是否匹配,对于密码签名这种认证方式都是绝对正确的,因为公钥仅仅用于解密合法 的hash数,所以只有拥有私钥的拥有者可以加密这些信息。

10. 为DNS服务器配置DNS Flood Detector
DNS Flood Detector是针对DNS服务器的Syn Flood攻击检测工具,用于侦测恶意的使用DNS查询功能。它利用libpcap  的网络数据包捕获函数功能检测网络流量来判断是否受到Syn Flood攻击, DNS Flood Detctor运行方式分成:守护进程(daemon)模式 和后台( bindsnap) 模式。以守护进程模式运行时它 会通过syslog 发出警示(/var/log/messages),以后台模式运行时可以得到实时的查询状态。
下载安装:
命令格式:
dns_flood_detector [选项]
主要选项:
-i IFNAME  监听某一特定接口。
-t N       当每秒查询数量超过N值时发出警示.
-a N       经过 N 秒后重置警示。
-w N       每隔 N 秒显示状态。
-x N       创建 N个 buckets。
-m N       每隔N秒显示所有状态。
-b         以后台模式执行(bindsnap)。
-d         以守护进程模式执行(daemon)。
-v         显示较多的输出信息。
-h         显示使用方式。

应用实例:
dns_flood_detector -b -v -v –t3

dns_flood_detector工作界面
messages的纪录:以守护进程模式执行,纪录每秒超过3次查询的纪录,显示最多信息,包含A PTR MX 纪录等。

11.建立完整的域名服务器
Linux下的DNS服务器用来存储主机的域名信息。包括三种:
(1)惟高速存域名服务器(Cache-only server)
惟高速存域名服务器(Cache-only server)不包含域名数据库。它从某个远程服务器取得 每次域名服务器查询的回答,一旦取得一个回答,就将它放入高速缓存中。
(2)主域名服务器(Primary Name server)
主域名服务器是特定域所有信息的权威来源。它从域管理员构造的本地文件中加载域信息,该“区文件”包含着服务器具有管理权的部分域结构的最精确的信息。主 域名服务器需要配置包括一组完整的文件:主配置文件(named.conf)、正向域的区文件(named.hosts)、反向域的区文件 (named.rev)、高速缓存初始化文件(named.ca)和回送文件(named.local)。
(3)辅助域名服务器(Second Name Server)
辅助域名服务器用来从主服务器中转移一整套域信息。辅助域名服务器是可选的配置选项。区文件是从主服务器转移出的,作为磁盘文件保存在辅助域名服务器中。辅助域名服务器不需配置本地区文件。
说明:多数域名服务器要根据网络实际情况将以上三种服务器组合,进行合理配置。所有的域名服务器都需要一个设置惟高速缓存服务器提供名字解析。一个域只 能建立一个主域名服务器,另外至少要创建一个辅助域名服务器作为主域名服务器的备份。一个域的主服务器可以是其他域的辅助域名服务器。 为了提高域名系统的可靠性,应建立辅域名服务器。当主域名服务器不能正常工作的情况下,能够替代主域名服务器对外提供不间断的服务。

12.增强DNS服务器的防范Dos/DDoS功能
1).使用SYN cookie
SYN Cookie是对TCP服务器端的三次握手协议作一些修改,专门用来防范SYN Flood攻击的一种手段。它的原理是,在TCP服务器收到TCP SYN包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCP ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。在linux下以root权限执行:

2).增大backlog
通过增加backlog的数值,可以一定程度减缓大量SYN请求导致TCP连接阻塞的状况,一般这个数值系统默认是1024,可以增加到1280至2048:这样在强度不是很高的攻击下,系统响应能力提高了一点。
3).缩短retries次数
Linux系统默认的tcp_synack_retries是5次,将这个数值减少可以提高系统响应能力,为2次:修改后,SYN_RECV的数量有了少量减少,系统响应也快了一些。
4).限制SYN频率
目前比较有效的是对SYN的频率和次数进行限制,这样最大限度的控制了单个IP地址发动攻击的能力。例如将SYN请求的次数限制在30次每分钟,系统默认是5次/秒可以将burst从默认的5个降低到2个。进行此操作后正常的用户无任何感觉上的差异,而并发的SYN请求量下降了不少,服务响应基本正常了。
5). 防范SYN Attack攻击
SYN Attack"是一种拒绝服务(DoS)的攻击方式,会消耗掉系统中的所有资源,迫使服务器重新启动。使用下面的命令:
# echo 1 > /proc/sys/net/ipv4/tcp_syncookies
把这个命令加入"/etc/rc.d/rc.local"文件中,等下次系统重新启动的时候就可以自动生效。

13. 使用分布式DNS负载均衡
在众多的负载均衡架构中,基于DNS解析 的负载均衡本身就拥有对DDOS(SYN Flood)的免疫力,基于DNS解析的负载均衡能将用户的请求分配到不同IP的服务器主机上,攻击者攻击的永远只是其中一台服务器,一来这样增加了攻击 者的成本,二来过多的DNS请求可以帮助我们追查攻击者的真正踪迹(DNS请求不同于SYN攻击,是需要返回数据的,所以很难进行IP伪装)。但是基于 DNS解析的负载均衡成本很高。很多中小公司没有部署这个技术。

14.防范对于DNS服务器网络
嗅探器技术被广泛应用于网络维护和管理方 面,它工作的时候就像一部被动声纳,默默的接收看来自网络的各种信息,通过对这些数据的分析,网络管理员可以深入了解网络当前的运行状况,以便找出网络中 的漏洞。在网络安全日益被注意的今天.我们不但要正确使用嗅探器。还要合理防范嗅探器的危害.嗅探器能够造成很大的安全危害,主要是因为它们不容易被发 现。对于一个安全性能要求很严格的企业,同时使用安全的拓扑结构、会话加密、使用静态的ARP地址是有必要的。

15.及时更新系统补丁
你应该经常到你所安装的系统发行商的主页 上去找最新的补丁。目前操作系统维护主要分两种模式:对于私有操作系统(Windows/Solaris等)由于个人用户不能直接接触其源代码,其代码由 公司内部开发人员维护,其安全性由同样的团队保证,内核的修正与其他应用程序一样,以patch/SP包的方式发布。对于Linux这样的开放式系统,是 一种开放的结构。应该说,开放的模式是双刃剑。从机制上讲,全世界的开发人员都能获得源代码,从而找出其中的纰漏,似乎安全性应该更好;但是同时,如果网 络管理人员不能及时更新内核,也会留下安全隐患。如果你是一个Linux网管员,你经常需要上相应的网站看,是否有补丁,是否有了bug fix,是否需要升级。Linux服务器运行的软件主要包括:Bind, Apache等软件大都是开源软件,而且都在不停升级,稳定版和测试版交替出现。在www.apache.org 上,最新的changeLog中都写着:bug fix, security bug fix的字样。所以Linux网管员要经常的关注相关网站及时升级或添加补丁。

总结:
DNS是网络服务的基础建设,要长期不断地保持其正常运作,每一个DNS服务器都应该定期检测。域名系统的配置和管理是一项比较复杂和繁琐的系统管理任 务,它对整个网络的运行影响极大。为了保证DNS服务器的安全运行,不仅要使用可靠的服务器软件版本,而且要对DNS服务器进行安全配置,同时还要跟踪服 务器软件和操作系统的各种漏洞。
-------------------------
Internet上的域名服务器安全小结
1 前言
域名服务器在internet上具有举足轻重的作用,它负责在域名和IP地址进行转换。我们通常在互联网上使用的都是域名,比如首都在线的主页为 www.263.net,而计算机在通信时使用的是其对应的IP地址:202.96.44.130。因此我们可以想象,如果负责域名转换的域名服务器出来 问题,那么将直接导致互联网用户无法使用域名来访问互联网,除非用户能够记住大量的IP地址。由于域名服务器的重要作用,这些服务器往往具有较高的系统配 置,且一般位于高速的骨干网络上,以便快速响应大负荷的查询请求;另外,由于域名服务系统的分布性和开放性,其往往裸露在防火墙的外面。域名服务器的这些 特征使其成为黑客进行攻击的优选目标。
随着我国互联网的快速发展,越来越多的政府部门、企业、公司、教育机构接入internet,他们要么建立自己的DNS服务器,要么使用ISP提供的DNS服务器,保证这些DNS服务器的安全运行成为一个突出的课题。

2 DNS基本原理
域名服务系统的发展和internet的发展和演变密切相关,在早期的internet前身—ARPAnet时,由于网络规模较小,只有几百台主 机,所以用单一的文件hosts.txt来表示主机名和地址之间的映射,这个文件由斯坦福研究院(SRI)的网络信息中心(NIC)维护,通过ftp对外 发布。随着TCP/IP协议的引入,Internet飞速发展,这种表示域名的方式出现了严重不足:主机名容易冲突、hosts.txt文件经常不一致、 不宜扩展、NIC的网络流量日益增大,经常出现网络瓶颈等。为了解决这些问题,必须使用一个新型的域名服务系统,它必须满足以下要求:分布式数据管理、全 球一致性、消除网络瓶颈、分层结构。根据这些要求,Paul Mochapetris担负起新系统的研究和规划,于1984年发布了阐述域名服务系统的RFC882和RRC883,这两个RFC经过修正后,其版本为 RFC1034、RFC1035,成为新域名服务系统的标准,当前DNS服务器软件的实现都是基于这两个RFC标准。随着internet的发展,一些新 的RFC扩展标准不断提出,并被加入到这些服务器软件中,比如关于DNS安全扩展标准的RFC2535。
新域名服务系统是一个关于互连网上主机信息的分布式数据库,它将数据按照区域分段,并通过授权委托进行本地管理,使用客户机-服务器模式检索数 据,并且通过复制和缓存机制提供迸发和冗余性能。域名服务系统包含域名服务器和解析器两个部分:域名服务器存储和管理授权区域内的域名数据,提供接口供客 户机检索数据;解析器即客户机,向域名服务器递交查询请求,翻译域名服务器返回的结果并递交给高层应用程序,通常为操作系统提供的库函数之一。为了理解域 名服务系统,必须理解以下的概念:
域名空间结构是一个反向生长的树,类似UNIX的文件系统:根由“.”表示,域名由“.”分隔,从底到顶。
区域是域名空间的子树,是域内所有主机信息资源的集合,区域可以简称为域。域的表现形式通常为硬盘上的一个文件,域名服务器在启动时将此文件中的 数据读入自己的内存供外部的解析器查询。如果域名服务器负责解析某个域,则这个域称为域名服务器的授权域,域名服务器可同时管理多个授权域。
上级域可以将子域的管理权委托给子域的管理员,比如域263.net可以将子域game.263.net的管理权委托给子域game.263.net。
域名服务器分为主域名服务器和辅域名服务器:主域名服务器存贮和管理授权域的数据,辅域名服务器做为主域名服务器的冗余备份,在主域名服务器失效 时替代主域名服务器,以便对外提供不间断的服务,它使用区域传输从主域名服务器同步数据。辅域名服务器作为冗余,可以有多个。
域名查询采用UDP协议,而区域传输采用TCP协议。域名解析过程分为两种方式:递归模式和交互模式。
解析器通常向域名服务器发送递归查询请求,如果域名服务器支持递归查询,则域名服务器收到此查询请求后,如果查询对象位于域名服务器的授权域或缓 存中,则域名服务器返回查找成功结果,否则域名服务器向外部的域名服务器发送此查询请求,最终要么返回给解析器查找成功的结果,要么返回查找失败。解析 器也能向域名服务器发送非递归查询请求,同递归查询一样,如果查询对象位于域名服务器的授权域或缓存中,则域名服务器返回查找成功结果;和递归查询不同的是,如果查询对象不在域名服务器的授权域或缓存中,但是域名服务器知道其他的域名服务器能够解析这个查询对象,则域名服务器将这个线索返回给解析器,否则 返回查找失败。域名服务器作为解析器向外部的域名服务器发送非递归查询请求,得到的结果中包含指向其它域名服务器的线索信息。

3 对DNS服务器的威胁
目前,黑客对DNS服务器的攻击主要有三种方法:地址欺骗、远程漏洞入侵和拒绝服务。
(1)地址欺骗
地址欺骗攻击利用了RFC标准协议中的某些不完善的地方,达到修改域名指向的目的。黑客控制着一个或多个在internet上正式运行的DNS服务器,黑客可以指定这些服务器负责解析某个区域,比如hacker.net,黑客在 这个区域内加入大量伪造的数据(A记录、NS记录等),然后黑客使用nslookup等DNS查询工具向受害者的DNS服务器发送一个递归查询请求,要求 解析www.hacker.net这个域名信息,因而引诱受害者的DNS服务器去查询黑客的DNS服务器,黑客的DNS服务器在返回的查询结果中包含了那 些事先伪造的数据(这些伪造信息位于DNS的UDP响应包中的附加段部分,即前面所述的线索信息),受害者的DNS服务器在收到查询结果后,把此结果送回 黑客的查询工具,同时将查询结果中的伪造数据进行缓存。假如缓存的伪造数据中含有www.yahoo.comà 1.1.1.1这样的地址映射,那么当其它 主机向被攻击的DNS服务器请求www.yahoo.com的地址时,被攻击的DNS服务器查询自己的缓存,然后将1.1.1.1这个错误的地址以非授权 形式返回。同理,黑客通过修改自己的DNS服务器上的数据,可以使被攻击的DNS服务器返回任何错误的地址指向。解决方法参见下一节中的(3)和(4)。
(2)拒绝服务
针对DNS服务器的拒绝服务攻击有两种,一种攻击针对DNS服务器软件本身,通常利用BIND软件程序中的漏洞,导致DNS服务器崩溃或拒绝服 务,这种攻击很容易对付,我们只要为BIND软件安装相应的补丁程序或更新软件即可;另一种攻击的目标不是DNS服务器,而是利用DNS服务器作为中间的 “攻击放大器”,去攻击其它intetnet上的主机,导致被攻击主机拒绝服务,这种攻击的原理为:黑客向多个DNS服务器发送大量的查询请求,这些查询 请求数据包中的源IP地址为被攻击主机的IP地址,DNS服务器将大量的查询结果发送给被攻击主机,使被攻击主机所在的网络拥塞或不再对外提供服务。通过 限制查询主机的IP地址可以减轻这种攻击的影响,目前不可能从根本上解决这个问题。
(3)远程漏洞入侵
BIND服务器软件的许多版本存在缓冲区溢出漏洞,黑客可以利用这些漏洞远程入侵BIND服务器所在的主机,并以root身份执行任意命令。这种 攻击的危害性比较严重,黑客不仅获得了DNS服务器上所有授权区域内的数据信息,甚至可以直接修改授权区域内的任意数据,同时可以利用这台主机作为攻击其 它机器的“跳板”。关于这些漏洞的详细信息可以查看参考文献中所列的CERT安全建议,解决方法很简单,参考下一节中的(1),更新BIND服务器软件。

4 保护DNS服务器的措施
(1)使用最新版本的DNS服务器软件
当前,internet上最广泛使用的DNS服务器软件为BIND (Berkeley Internet Name Domain),它可以运行在各种UNIX平台上,某些版本也支持Windows NT平台。本文以BIND软件为例进行说明,其它DNS服务器软件的设置可能有所不同,但其原理都是一样的,故不一一详述。
BIND软件是一个免费软件,由互联网软件协会(ISC:Internet Software Consortium)开发和维护。BIND软件分为两个系列:版本4系列和版本8系列。版本4系列是较早的版本,其功能不够强大,含有许多著名的漏洞,其最后一个版本是4.9.7,互联网软件协会已经宣布不再开发4系列的BIND,以后的开发仅针对于8系列或更高版本的BIND。8系列的BIND相对于 4系列有了很大改进,修正了很多已知的安全漏洞,优化了软件运行效率,提供更加灵活和强大的配置命令,增加了许多RFC建议的安全功能,能够有效的抵抗大 部分的已知攻击手段。因此,互联网软件协会强烈建议使用BIND 8系列中的版本8.2.2+P5,如果无法使用这个版本,那么可以考虑使用BIND 4系列中的版本4.9.7。
使用最新版本的DNS服务器软件虽然可以解决大部分目前已知的漏洞,但并不意味着DNS服务器的彻底安全,因为随着新漏洞的发现,“最新版本”将成为不安全的旧版本,这时必须使用更新的软件版本或安装相应的补丁程序。互联网软件协会的正式网站为 http://www.isc.org ,最新的BIND软件可以从它的ftp服务器上下载:
4.9.7: ftp://ftp.isc.org/isc/bind/src/cur/bind-4/bind-4.9.7-REL.tar.gz
8.2.2+P5: ftp://ftp.isc.org/isc/bind/src/cur/bind-8/bind-src.tar.gz
(2)关闭递归查询和线索查找功能
如果可能,关闭BIND服务器的递归查询功能,这将使DNS服务器进入被动模式,即它决不会向外部的DNS发送查询请求,只会回答对自己的授权域 的查询请求,因此不会缓存任何外部的数据,所以不可能遭受地址欺骗攻击。当有合法的解析器使用DNS服务器,或其它合法的DNS服务器将这个DNS服务器 作为传递服务器(forwarder)时,不应关闭递归查询,如果不能关闭递归查询,使用后面所讲的其它方法。
通常,DNS服务器在返回查询结果时,如果结果中包含NS记录而没有NS记录对应的A记录,那么DNS服务器会去查找这个A记录,这种情况叫线索查找。使用这个功能可能导致欺骗攻击,所以建议关闭这个功能。
在BIND 8版中,在named.conf中使用如下命令关闭这两个功能:
options {
recursion no;
fetch-glue no;
};
在BIND 4版中,在named.boot中使用如下命令关闭这两个功能:
options no-recursion
options no-fetch-glue
(3)限制对DNS进行查询的IP地址
对DNS服务器进行的查询请求可以按照来源分为两类:来自外部其它DNS服务器的查询和来自本地网络的主机的查询。DNS服务器之间的查询使用交 互方式(非递归方式),当外部DNS服务器进行查询时,其查询对象为被查询DNS服务器所负责管理的授权区域内的数据;而本地网络主机的查询一般都使用递 归方式,其查询对象既可以是被查询DNS服务器所负责的授权区域内的数据,也可以是外部的非授权区域的数据,如果查询对象是授权区域内的数据,则DNS服 务器直接将内存或缓存中的结果返回给进行查询的主机;如果查询对象是外部的非授权区域的数据,则DNS首先在缓存中进行查询,如果找到匹配的结果则返回给 进行查询的主机,否则将查询请求发送给外部的DNS服务器。
早期的BIND软件没有限制进行查询的IP地址的功能,internet上的任何主机都可以向你的DNS服务器发送递归或非递归查询请求,而你的 DNS服务器一律都进行回答。这不仅让他人可能滥用你的DNS服务器,而且恶意的黑客可能利用这个功能欺骗你的DNS服务器,比如上一节中所述的地址欺 骗。BIND 8系列的软件加入了限制查询IP这个非常有用的功能,通过在其配置文件named.conf中使用命令allow-query来实现这个功能,例如:
options    {
directory    “/var/named”;
allow-query    202.96.44.0/24;
};
zone  “263.net”  In {
type master;
file “db.263.net”;
allow-query { any;};
};                           
zone  “capital-online.com.cn”  In {
type master;
file “db.capital-online”;
allow-query { any;};
};       
在这个例子中,多次使用了allow-query命令,因为位于zone命令中的allow-query优先级别高于options命令中的 allow-query,所以,此配置允许任何主机查询授权域263.net和capital-online.com.cn,只允许指定网络 202.96.44.0/24上的主机查询外部的非授权域。
(4)限制对DNS进行递归查询的IP地址
BIND 8.2.1或更高版本允许对进行递归查询的IP地址作出限制,如果递归查询请求来自不允许的IP地址,则BIND服务器软件将此查询以非递归查询对待。
在配置文件中使用allow-recursion命令实现此功能,例如:
options     {
allow-recursion { 206.168.119.176/29; };
};
(5)限制区域传输
区域传输一般用于主DNS服务器和辅DNS服务器之间的数据同步,当主DNS服务器对其所管理的授权区域内的数据进行改动后,辅DNS服务器按照 规定的时间间隔使用区域传输从主DNS服务器获取改动后的信息,然后刷新自己相应区域内的数据。利用区域传输功能,还可以获得整个授权区域内的所有主机信 息,而这些正是恶意的黑客所感兴趣的信息,根据这些信息,黑客可以轻松地推测你的网络结构,并从主机的域名信息判断其功能或发现那些防范措施较弱的机器 (比如测试用的机器)。例如:nslookup的ls命令或dig的axfr参数,就是使用区域传输来进行查询,另外还有一些黑客工具,专门使用区域传输 来搜集区域内的主机信息。正常情况下,应该只允许我们信任的辅DNS服务器和主机进行区域传输。不幸的是,BIND软件的缺省设置允许任何人进行区域传 输。因此,必须在配置文件中加以限制。
对于BIND 8版的软件,在配置文件named.conf中使用命令allow-transfer来限制允许区域传输的主机,例如:   
options    {
allow-transfer    {
192.168.100.1;
202.96.44.0/24;
};
};
以上的设置只允许地址为192.168.100.1和位于网段202.96.44.0/24内的主机进行区域传输。对于BIND 4版的软件,在配置文件named.boot中使用命令xfernet来限制允许区域传输的主机,例如:
xfrnets    192.168.100.1&255.255.255.255    202.96.44.0&255.255.255.0
注意两种版本之间的命令区别。另外要注意的是,必须同时在主DNS服务器和辅DNS服务器进行限制。
(6)限制对BIND软件的版本信息进行查询
黑客为了利用特定版本BIND软件的漏洞,首先需要确定BIND软件的版本号,缺省情况下,BIND服务器软件不限制对自身版本号的查询,所以任何人可以很容易的获取BIND软件的版本号。例如,使用dig工具的如下命令即可得到BIND的版本号:
dig @dns.example.com version.bind chaos txt
在nslookup的交互窗口中,依次输入set type=txt;set class=chaos;version.bind同样可以得到BIND的版本号。
在BIND 8版本中,有两种方法解决这个问题,一种是在named.conf中使用version命令修改版本号,例如:
options{
version  “hello1.1.1”;
};
另外一种方法是在named.conf中加入以下的语句,只允许信任的主机查询版本号:
zone "bind" chaos {
type master;
file " bind";
allow-query {
信任主机的IP地址;
};
};
然后,建立一个如下的授权区域文件:
$ORIGIN bind.
@        1D CHAOS SOA    localhost. root.localhost. (
1            ; serial
3H            ; refresh
1H            ; retry
1W            ; expiry
1D )        ; minimum
CHAOS NS        localhost.
; EOF
需要注意的是,以上使用IP地址进行访问控制时,必须能够有效地防止IP地址欺骗。为了防止IP欺骗,至少应该在边界路由器上进行如下设置:如果从外部进入网络的IP包的源地址是我们内部网络的IP地址,那么必须丢弃这些数据包。

5 结束语
总之,为了保证DNS服务器的安全运行,不仅要使用可靠的服务器软件版本,而且要对DNS服务器进行正确的的配置,同时还要跟踪服务器软件和操作系统的各种漏洞,及时为发现的漏洞打补丁或进行升级。

参考文献:
1. Mockapetris, P.,“Domain Names - Concepts and Facilities”, STD 13, RFC 1034, November 1987.
2. Mockapetris,P.,“Domain names - implementation and specification”, STD 13, RFC1035, November 1987。
3. Eastlake, D. and C. Kaufman,“Domain Name System Security Extensions”, RFC 2535, March 1999.
4. Cricket Liu & Paul Albitz,“DNS and BIND(Third Edition)”,O'Reilly & Associates, September 1998.
5. Cricket Liu ,“Securing an Internet Name Server”,Acme Byte & Wire LLC,1999.
6. CERT Advisory CA-97.22,“BIND - the Berkeley Internet Name Daemon”, May 26, 1998
7. CERT Advisory CA-98.05,“Multiple Vulnerabilities in BIND”, November 16, 1998.
8. CERT Advisory CA-99-14,“Multiple Vulnerabilities in BIND”,November 10, 1999
9. AL-1999.004-AUSCERT ALERT,“Denial of Service (DoS) attacks using the Domain Name System (DNS)”,13 August 1999