DNS服务器的安全策略

DNS域名解析服务是网络的基础服务,承担着将域名翻译为计算机可以识别的IP地址,以及寻找IP地址对应的逆向翻译工作。一旦DNS服务出现故障,用户就无法通过采用域名的方式进行互联网访问,相应的邮件服务器也会由于无法进行正常的域名解析而出现故障。
  由于DNS服务对于网络非常重要,所以它成为网络***的重要目标。

正视安全隐患
  DNS服务面临的安全隐患主要包括DNS欺骗(DNS Spoffing)、拒绝服务(Denial of service,DoS)***和缓冲区漏洞溢出***(Buffer Overflow)。
1.DNS欺骗
  DNS欺骗会使那些易受***的DNS服务器产生许多安全问题,例如:将用户引导到错误的互联网站点,或者发送一个电子邮件到一个未经授权的邮件服务器。


  DNS欺骗即域名信息欺骗,是最常见的DNS安全问题。当一个DNS服务器掉入陷阱,使用了来自一个恶意DNS服务器的错误信息,那么该DNS服务器就被欺骗了。
  网络***者通常通过两种方法进行DNS欺骗。
  缓存感染。***会熟练地使用DNS请求,将数据放入一个没有设防的DNS服务器的缓存当中。这些缓存信息会在客户进行DNS访问时返回给客户,从而将客户引导到***者所设置的运行***的Web服务器或邮件服务器上,然后***再从这些服务器上获取用户信息。
  DNS信息劫持。***者通过监听客户端和DNS服务器的对话,通过猜测服务器响应给客户端的DNS查询ID。每个DNS报文包括一个相关联的16位ID号,DNS服务器根据这个ID号获取请求源位置。***在DNS服务器之前将虚假的响应交给用户,从而欺骗客户端去访问恶意的网站。
2.拒绝服务***
  ***主要利用一些DNS软件的漏洞,如在BIND 9版本(版本9.2.0以前的 9系列)中,如果有人向运行BIND的设备发送特定的DNS数据包请求,BIND就会自动关闭。***者只能使BIND关闭,而无法在服务器上执行任意命令。
  如果得不到DNS服务,就会产生一场灾难:由于网址不能解析为IP地址,用户将无方访问互联网。这样,DNS产生的问题就好像是互联网本身所产生的问题,这将导致大量的混乱。
3.缓冲区漏洞溢出***
  ***利用DNS服务器软件存在漏洞,比如对特定的输入没有进行严格检查,那么有可能被***者利用,***者构造特殊的畸形数据包来对DNS服务器进行缓冲区溢出***。
  如果这一***成功,就会造成DNS服务停止,或者让***者可以在DNS服务器上执行其设定的任意代码。例如, 前一阵子针对Linux平台的BIND的***(e.g. Lion worm)程序,就是利用某些版本的BIND漏洞,取得root权限,一旦***完成之后,***者就可以完全控制整个相关的网络系统,影响非常严重。
  应对上述安全隐患的方法中有两个非常有效:
  ◆ 保持运行最新没有缺陷的DNS版本。大多数Linux和Unix、BSD操作系统运行的都是BIND(Berkeley Internet Name Domain)服务器。它的最新安全版本在其官方网站:http://www.isc.org/下载源代码安装即可。例如针对拒绝服务***,只要将Linux的BIND 9升级为版本9.2.1即可。
  ◆ 保持DNS服务器配置正确、可靠。这一点相对困难。Linux上的域名服务由named守护进程控制,该进程从主文件:/etc/named.conf中获取信息。它包括一组将主机名称映射为IP地址的各种文件,详细内容参  见“named配置文件族”。
  可以看到,DNS配置文件是一个复杂的系统。伴随DNS建立出现的许多问题都会引起相同的结果,但起因却不同。但大多数问题是由于配置文件中的语法错误而导致的。
  DNS是一组文件构成的,所以需要不同工具检查对应文件。

配置一个安全的BIND服务器
  下面以使用最为广泛的Unix类DNS软件BIND为例,介绍如何配置一个安全DNS服务器。本文以Redhat Linux 9.0为工作平台。
检查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/下载。它的功能如下:
  (1)首先检查配置文件的拼写错误。
  (2)有A(Address)记录的主机名称必须有PTR记录。如果有A记录的主机名称没有PTR,则配置文件不能通过。dlint可以在用户配置文件中为A记录查找丢失的PTR记录。
  (3)dlint会记录in-addr.arpa区带的每一条PTR记录是否有对应的A记录存在。
  (4)dlint会以递归的方式检查子区带,查找它们的配置问题。dlint软件可以分析任何DNS区带。
隐藏BIND的版本号
  通常软件的BUG信息是和特定版本相关的,因此版本号对***来说是非常有价值的信息。
  ***使用dig命令可以查询BIND的版本号,然后就可以知道这个软件有哪些漏洞。因此,随意公开版本号是不明智的。
  隐藏BIND版本号比较简单,修改配置文件:/etc/named.conf,在option部分添加version声明将BIND的版本号信息覆盖。例如使用下面的配置声明,当有人请求版本信息时,迫使nmaed显示:“Unsupported on this      platform”。
  options {
  version “Unsupported on this platform”;
  };
避免透露服务器信息
  和版本号一样,也不要轻易透露服务器的其他信息。为了让潜在的***更难得手,建议不要在DNS配置文件中使用HINFO和TXT这两个资源记录。
关闭glue fetching选项
  当DNS服务器返回一个域的域名服务器纪录,并且域名服务器纪录中没有A纪录时,DNS服务器会尝试获取一个纪录,称为glue fetching。***者可以利用它进行DNS欺骗。关闭glue fetching是一个好方法,修改配置文件/etc/named.conf,加入一行:
  options no-fetch-glue
使用非root权限运行BIND
  在Linux内核2.3.99以后的版本中,可以以-u选项以非root权限运行BIND。命令如下:
  /usr/local/sbin/named -u nobody
  说明:上面的命令表示以nobody用户身份运行BIND。使用nobody身份运行能够降低缓冲区溢出***所带来的危险。
控制区域(zone)传输
  默认情况下BIND的区域(zone)传输是全部开放的,如果没有限制,那么DNS服务器允许对任何人都进行区域传输的话,网络架构中的主机名、主机IP列表、路由器名和路由IP列表,甚至包括各主机所在的位置和硬件配置等情况都很容易被***者得到。因此,要对区域传输进行必要的限制。可以通过在/etc/named.conf文件当中添加以下语句来限制区域传输:
  acl “zero-transfer” {192.168.0.52;192.168.0.109;};
  zone “yourdomain.com”{
  type master;
  file “yourdomain.com”;
  allow-rtransfer {zero-transfer;};};
  这样只有IP地址为192.168.0.52到192.168.0.109之间的主机能够同DNS服务器进行区域传输。
请求限制
  如果任何人都可以对DNS服务器发出请求,这是不能接受的。限制DNS服务器的服务范围很重要,可以把许多***者拒之门外。
  修改BIND的配置文件/etc/named.conf,加入以下内容:
  options {
  allow-query {168.192.1.0/24;};
  };
  zone “yourdomain.com” {
  type master;
  file “yourdomain.com”;
  allow-query {any;};
  };
  zone “1.168.192.in-addr.arpa” {
  type master;
  file “db.192.168.1”;
  allow-query {any;};};
  这样,所有的用户都可以访问yourdomain.com的DNS服务器,但是只有168.192.1.0网段的主机用户可以请求DNS服务器的任意服务。
  另外,也不要允许其他网段的主机进行递归询问,在上面文件最后加入下面一行即可:
  allow-recursion {192.168.1.0/24;};
  为BIND创建chroot


  chroot是指更改某个进程所能看到的根目录,即将某进程限制在指定目录中,保证该进程只能对该目录及其子目录的文件有所动作,从而保证整个服务器的安全。
  BIND9.x系列版本简化了chroot的步骤,下面是创建chroot步骤:
  (1)为BIND端口监督程序创建一个用户。BIND端口监督程序将由用户dns 来运行。
  useradd dns -d /home/dns
  (2)建立目录:
  mkdir -p /home/dns/var/log;mkdir -p /home/dns/var/run
  mkdir -p /home/dns/var/named;mkdir -p /home/dns/etc
  (3)拷贝文件:
  cp /etc/named.conf /home/dns/etc/
  cp -r /var/named/* /home/dns/var/named/
  (4)设定相应权限:
  chown -R dns:dns /home/dns
  (5)用dns身份运行域名服务器:
  /usr/local/sbin/named -t /home/dns -u dns
使用DNSSEC
  DNS欺骗spoofing对目前网络应用的最大冲击在于冒名者借着提供假的网域名称与网址的对照信息,可以将不知情用户的网页联机,引导到错误的网站,原本属于用户的电子邮件也可能因而遗失,甚而进一步空开成为阻断服务的***。所幸,目前较新的BIND版本针对这一类问题已经加入了许多改进的方法。不过真正的解决方案则有赖封包认证机制的建立与推动。
  DNSSEC就是试图解决这一类问题的全新机制,BIND9 已经完整加以设计并完成。DNSSEC引入两个全新的资源记录类型KEY和SIG,允许客户端和域名服务器对任何DNS数据的来源进行密码验证。
  DNSSEC主要依靠公钥技术对于包含在DNS中的信息创建密码签名。密码签名通过计算出一个密码hash数来提供DNS中数据的完整性,并将该hash数封装进行保护。私/公钥对中的私钥用来封装hash数,然后可以用公钥把hash数译出来。如果这个译出的hash值匹配接收者刚刚计算出来的hash数,那么表明数据是完整的。
  不管译出来的hash数和计算出来的hash数是否匹配,对于密码签名这种认证方式都是绝对正确的,因为公钥仅仅用于解密合法的hash数,所以只有私钥的拥有者可以加密这些信息。
其他安全建议
  尽量采用最新版本的BIND,并定时注意任何相关的安全通报,采用适当的补丁(patch)。域名服务器只提供单一DNS服务器的服务,降低因为其他服务漏洞可能造成的威胁。随时察看日志文件(log),检查有无异状。早期发现早期治疗。

  编后语:DNS是网络服务的基础建设,要长期不断地保持其正常运作,每一个DNS服务器都应该定期检测。综合使用多种手段才能保障DNS服务器的安全。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章