Linux下的DNS安全保障十大技巧

日期: 2010-05-23 来源:TechTarget中国

  (1)限制名字服务器递归查询功能

  关闭递归查询可以使名字服务器进入被动模式,它再向外部的DNS发送查询请求时,只会回答自己授权域的查询请求,而不会缓存任何外部的数据,所以不可能遭受缓存中毒攻击,但是这样做也有负面的效果,降低了DNS的域名解析速度和效率。

  以下语句仅允许172.168.10网段的主机进行递归查询: 

  allow-recusion {172.168.10.3/24; } 

  (2)限制区传送(zone transfer)

  如果没有限制区传送,那么DNS服务器允许对任何人都进行区域传输,因此网络架构中的主机名、主机IP列表、路由器名和路由IP列表,甚至包括各主机所在的位置和硬件配置等情况都很容易被入侵者得到在DNS配置文件中通过设置来限制允许区传送的主机,从一定程度上能减轻信息泄漏。但是,需要提醒用户注意的是:即使封锁整个区传送也不能从根本上解决问题,因为攻击者可以利用DNS工具自动查询域名空间中的每一个IP地址,从而得知哪些IP地址还没有分配出去,利用这些闲置的IP地址,攻击者可以通过IP欺骗伪装成系统信任网络中的一台主机来请求区传送。

  以下语句仅允许IP地址为172.168.10.1和172.168.10.2的主机能够同DNS服务器进行区域传输:

  acl list {  221.3.131.5;   221.3.131.6; 
  zone “test.com” {   type master;   file “test.com “;
  allow-transfer { list; };
  };
  };

  (3)限制查询(query)

  如果任何人都可以对DNS服务器发出请求,那么这是不能接受的。限制DNS服务器的服务范围很重要,可以把许多入侵者据之门外。修改BIND的配置文件:/etc/named.conf加入以下内容即可限制只有210.10.0.0/8和211.10.0.0/8网段的查询本地服务器的所有区信息,可以在options语句里使用如下的allow-query子句:

  options { 
  allow-query { 210.10.0.0/8; 211.10.0.0/8;};
  };

  (4)分离DNS(split DNS)

  采用split DNS(分离DNS)技术把DNS系统划分为内部和外部两部分,外部DNS系统位于公共服务区,负责正常对外解析工作;内部DNS系统则专门负责解析内部网络的主机,当内部要查询Internet上的域名时,就把查询任务转发到外部DNS服务器上,然后由外部DNS服务器完成查询任务。把DNS系统分成内外两个部分的好处在于Internet上其它用户只能看到外部DNS系统中的服务器,而看不见内部的服务器,而且只有内外DNS服务器之间才交换DNS查询信息,从而保证了系统的安全性。并且,采用这种技术可以有效地防止信息泄漏。

  在BIND 9中可以使用view语句进行配置分离DNS。view语句的语法为:

  view view_name { 
  match-clients { address_match_list };
  [ view_option; …]
  zone_statement; …
  };

  其中:?

  • match-clients:该子句非常重要,它用于指定谁能看到本view。可以在view语句中使用一些选项;?
  • zone_statement:该子句指定在当前view中可见的区声明。如果在配置文件中使用了view语句,则所有的zone语句都必须在view中出现。对同一个zone而言,配置内网的view应该置于外网的view之前。

  下面是一个使用view语句的例子,它来自于BIND9的标准说明文档:

  view  “internal” {   match-clients { our-nets; }; 
  // 匹配内网客户的访问
  recursion yes;
  // 对内网客户允许执行递归查询   zone “example.com” {
  // 定义内网客户可见的区声明
  type master;     file “example.com.hosts.internal”;
  };
  };
  view  “external” {   match-clients { any; };
  // 匹配 Internet 客户的访问
  recursion no;
  // 对 Internet 客户不允许执行递归查询   zone “example.com” {
  // 定义 Internet 客户可见的区声明      type master;
  file “example.com.hosts.external”;   };
  };

  接下来,需要在example.com.hosts.internal中创建内网客户可见的区文件,并在example.com.hosts.external中创建Internet客户可见的区文件。该区文件的编写可以根据用户的实际情况,可以参看上面介绍的内容,此处不再赘述。

  (5)隐藏BIND的版本信息

  通常软件的漏洞和风险信息是和特定版本相关的,因此版本号是黑客进行攻击所需要搜集的最有价值的信息之一。黑客使用dig命令可以查询BIND的版本号,然后黑客就能够通过版本号查询知道这个软件有那些漏洞,并寻求相应的工具来针对该漏洞进行攻击。因此,随意公开BIND版本号是不明智的,具有很大的风险。其实,隐藏BIND版本号比较简单,只需要修改配置文件/etc/named.conf,在option部分添加version声明将BIND的版本号信息进行覆盖即可。使用下面的配置声明将BIND版本号覆盖,当有人请求版本信息时,将无法得到有用的版本信息:

  options { 
  version “Unkown”
  };

  (6)使用非root权限运行BIND

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

  #/usr/local/sbin/named –u nobody 

  (7)删除DNS上不必要的其他服务

  删除DNS机器上不必要的其他服务。网络服务是造成系统安全的重要原因,常见的DoS攻击、弱脚本攻击以及缓冲区溢出攻击都是由于系统存在网络服务所引起的。在安装DNS运行所依赖的操作系统前,就应该确定在系统中运行的服务的最小集合,创建一个DNS服务器系统就不应该安装Web、POP、gopher、NNTP News等服务。建议不安装以下软件包:(1)X-Windows及相关的软件包;(2)多媒体应用软件包;(3)任何不需要的编译程序和脚本解释语言;(4)任何不用的文本编辑器;(5)不需要的客户程序;(6)不需要的其他网络服务。

  (8)合理配置DNS的查询方式

  DNS的查询方式有两种,递归查询和迭代查询。合理配置这两种查询方式,能够在实践中取得较好的效果。

  其中,递归查询是最常见的查询方式,工作方式是:域名服务器将代替提出请求的客户机(下级DNS服务器)进行域名查询,若域名服务器不能直接回答,则域名服务器会在域各树中的各分支的上下进行递归查询,最终将返回查询结果给客户机,在域名服务器查询期间,客户机将完全处于等待状态。具体流程示意请见图1:

  图1  DNS递归查询模式示意

  迭代查询又称重指引查询。其工作方式为:当服务器使用迭代查询时能够使其他服务器返回一个最佳的查询点提示或主机地址,若此最佳的查询点中包含需要查询的主机地址,则返回主机地址信息,若此时服务器不能够直接查询到主机地址,则是按照提示的指引依次查询,直到服务器给出的提示中包含所需要查询的主机地址为止,一般的,每次指引都会更靠近根服务器(向上),查寻到根域名服务器后,则会再次根据提示向下查找。具体流程示意如图2所示:

  图2  DNS迭代查询模式示意

  综合上面两点,我们可以看出来,递归查询就是客户机会等待最后结果的查询,而迭代查询是客户机等到的不一定是最终的结果,而可能是一个查询提示。因而存在如下两个问题:?

  • 二级DNS向一级DNS发起递归查询,会对一级DNS造成性能压力,所有跨域查询都要经过一级DNS响应给对应二级DNS;?
  • 二级DNS向一级DNS发起递归查询,再由一级向归属DNS发起递归的模式查询响应会有一定延时;

  因此,有很多流量很大的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)解压缩源代码安装包

  #tar vxfz ddnstop-20090128.tar.gz 

  (2)切换到解压目录,并使用configure命令生成Makefile文件

  #cd dnstop-20040309 
  #./configure

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

  #make

  安装成功后,可以查看通过相应的网络接口来监控DNS网络流量,如下所示:

  #./dnstop -s eth0 
  0 new queries, 6 total queries Tue Mar 26 19:35:23 2008
  Sources count %
  —————- ——— ——
  172.96.0.13 4 66.7
  172.96.0.14 1 16.7
  172.96.0.15 1 16.7

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐