首页 -> 安全研究

安全研究

绿盟月刊
绿盟安全月刊->第15期->技术专题
期刊号: 类型: 关键词:
Internet上的域名服务器安全

作者:cjj < mailto: cjj7513@hotmail.com >
日期:2000-11-04

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标准协议中的某些不完善的地方,达到修改域名指向的目的。如下图所示:



图三 DNS地址欺骗攻击
    黑客控制着一个或多个在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
版权所有,未经许可,不得转载