我们知道,互联网上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+  域名服务器安
全增强”<http://security.nsfocus.com/showQueryL.asp?libID=530>

    (3)v9,最新版本的BIND,全部重新写过,免费(但是由商业公司资助),BIND9在2000年十月份推出, 根据调查v9版本的BIND是最安全的,它的最新安全版本在其官方网站:http://www.isc.org/ 下载下载源代码安装即可。例如使用Linux系统针对拒绝服务攻击只要将BIND 9升级为版本9.2.1即可。
 
 
    2.保持DNS服务器配置正确、可靠

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

表-1 DNS主要配置文件 点击看大图
 
表-2 named配置文件族 点击看大图
    named.conf时DNS中的核心它的配置 见表三:
    
表-3 named.conf文件的配置 点击看大图

    可以看到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 4.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/named.conf文件当中添加以下语句来限制区域传输:
 


   这样只有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> };
    例子:address_match_list:允许进行 DNS 辖区数据传输主机的 IP 列表。
 
    (4)allow-update:目的在于指定能向本 dns 服务器提交动态 dns 更新的主机
    语法:allow-update { <address_match_list> };
    例子: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服务器进行安全配置,同时还要跟踪服务器软件和操作系统的各种漏洞。