自从揭露一项重大的域名解析系统(DNS)安全漏洞以来,网络上关于DNS爆安全漏洞,可以导致黑客控制整个网络话题不少,一篇《拿学校服务器开刀,最新DNS溢出漏洞利用工具》让人不寒而栗,更有甚者贴图教授攻击步骤,笔者实验后直冒冷汗,虽然管的网络不大,但是一旦被入侵,影响也不小,何况目前是维稳时期,不能出问题。
DNS(Domain name system)服务器处于网络服务的核心。没有DNS,你不能够解析访问互联网地址,客户就不能给你发邮件或者浏览你的网站。有了DNS,方便了用户上网获取信息,但是,DNS最初开发是一个开放的系统,安全考虑不够,因此,安全漏洞频频被发现,比如,攻击者通过Windows DNS溢出漏洞获得本地系统权限,进而窃取你的重要数据,尤其是近期,攻击者可以通过猜测DNS解析过程中的报文序列号来伪造DNS权威服务器的应答,从而达到“污染”高速缓存(Cache)中的记录的目的,即将错误的域名指向信息注入DNS服务器,最终导致受到污染的DNS服务器将对外提供错误的解析结果。该种攻击方式可造成域名劫持攻击,使得公众在不知情的情况下通过域名访问到黑客指定的网站,面临网络钓鱼和网页木马等一系列严重的安全威胁。
应对诸如安全威胁,正确部署DNS服务至关重要,其次,要定期访问安全公告,安装那些补丁应该成为您的工作内容和计划任务的一部分。不要事后才采取行动,网络管理员需要做出快速响应,要在黑客动手前完成你的修补工作。
通过几年的工作实践,我以为应着重做好以下工作才能打造一个较为稳固的DNS服务。
一、系统安全是基础
我使用的是Red Hat Enterprise liunx 4操作系统,DNS服务原先安装的是bind9.3.2, 互联网上绝大多数的域名解析服务器都使用“BIND DNS Server”,通过使用感觉比较稳定,虽然BIND也爆出不少漏洞,但是最新的V9较为安全,又基于 liunx操作系统,相对来说,研究使用的人较少,病毒和黑客攻击相对也少些,只要设置合理,稳定性、安全性比较高。
近年来单位陆续更新了服务器,旧服务器闲置,为此,我将原先DNS服务与其它服务分离,用旧服务器单独做DNS服务(我用的是Compaq PL1600 (PIII500/512M/36G)),对中小网络来说已经足够。其次,由于只做DNS服务,设置和维护也相对方便些。安装系统时要做好以下几项工作:
1. 精简系统
在安装操作系统时,自定义安装软件,将您的安装精简到不能再精简的程度。如X Windows组件由于占用资源较大,建议不要安装,BIND随后再安装新版的V9,现在只安装:
Server Configuration Tools
Network Servers
Legacy Network Servers
Development Tools
Kernel Development
Legacy Software Development
Administration Tools
System Tools等服务
2. 关闭默认启动的一些无用的服务。
希望Linux成为健壮的DNS服务器,可以取消系统内所有非必要的服务,只开启必要服务。这样做可以尽量减少后门,降低隐患,而且可以合理分配系统资源,提高整机性能。输入ntsysv命令打开ntsysv工具界面,关闭以下几个由xinetd管理的不常用的服务:
Fingerd、R服务(rshd、rlogin、rwhod、rexec)和其它服务,如amd、arpwatch、atd、dhcpd、innd、nntpd、talkd、lpd、routed、snmpd、xfs、wuftpd、tftpd、telnet、ypbind、yppasswd、ypserv,既然是DNS服务器,都可以取消或卸载掉。
3. 删除一些无关的服务帐号
禁止所有默认的被操作系统本身启动的且不需要的帐号,第一次装上系统时就应该做此检查,linux本身提供了各种帐号,有的可能不需要,如果不需要这些帐号,就删除它,系统拥有帐号越多,就越容易受到攻击。删除系统上的用户,用下面的命令:
 [root@qhdns]#userdel username
只做DNS服务,所以可以删除adm、lp、sync、shutdown、halt、mail 、news、 uucp operator、 games、gopher和 ftp 。
4. 取消ROOT的远程登陆
远程管理时尽量不用root帐号登入,取消ROOT的远程登陆方式,默认在/etc/default/login里加上 "CONSOLE"行,在/etc/ftpusers里加上root。另外创建一个用于管理的帐号。
5. 使用ssh远程管理服务器
作为系统管理员,需要经常对系统进行远程维护和上传、下载文件,这些通信过程必须要保证是安全的。因此,启用ssh进行远程维护是一个好方法,为了更安全起见,最好局限一、二台主机才能登录访问DNS服务器。即在/etc/host.deny加入禁止来自任何地方对所有服务的访问:ALL:ALL,然后在/etc/host.allow中添加要授权的机器IP及服务。
如:sshd:210.11.83.100
6. 禁止外来ping请求,防止被攻击。
IP地址在网络安全上是一个很重要的概念,如果攻击者知道了你的IP地址,等于为他的攻击准备好了目标,他可以向这个IP发动各种进攻,如DoS(拒绝服务)攻击、Floop溢出攻击等。没有人能ping通用户的机器并收到响应,就可以大大增强用户系统的安全性。添加下面一行命令到/etc/rc.d/rc.local,以后每次启动后自动运行该命令,就可以阻止用户的系统响应从本机以外的任何ping请求。
Echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
二、加固BIND是关键
针对域名系统存在的安全威胁,我们应该尽量使用新版本的BIND,随时关注BIND更新。而且BIND9 已经完整用DNS 安全扩展(DNSSEC)进行设计,DNSSEC是解决DNS欺骗spoofing 对目前网络应用影响的一个全新机制,它引入两个全新的资源记录类型:KEY和SIG,允许客户端和域名服务器对任何DNS数据的来源进行密码验证。不过真正问题的解决有赖封包认证机制的建立与推动,BIND9完全使用DNSSEC还需要约5个步骤的配置,而且还会产生额外开销。当前使用BIND 9是一个正确的选择。最近,ISC已发布9.3.5-P2版、9.4.2-P2版和9.5.0-P2版,修补了缓存中毒漏洞,从http://www.isc.org/下载bind-9.5.0-P2.tar.gz文件,安装步骤是:
1、解压:
[root@qhdns root]#tar -zxvf bind-9.5.0_P2.tar.gz
2、进入刚解压出来的目录,进行编译:
[root@qhdns root]# cd bind-9.5.0-P2
[root@qhdns bind-9.5.0-P2]#./configure
[root@qhdns bind-9.5.0-P2]#make
[root@qhdns bind-9.5.0-P2]#make install
3、检查安装是否成功:
  named -v
输出:BIND-9.5.0-P2  //表示安装成功
3、生成rndc控制命令的rndc.key配置文件
[root@qhdns bind-9.5.0-P2]# sbin/rndc-confgen > /etc/rndc.conf
4、建立配置文件named.conf,并从rndc.conf文件中提取named.conf用的key.
[root@qhdns etc]# tail -10 rndc.conf | head -9 | sed s/#\ //g > named.conf
[root@qhdns named]vi /etc/named.conf
# Use with the following in named.conf, adjusting the allow list as needed:
key "rndc-key" {
      algorithm hmac-md5;
       secret "jRisZW+xQblhuVoUdXQMfw==";
 };
 
 controls {
       inet 127.0.0.1 port 953
               allow { 127.0.0.1; } keys { "rndc-key"; };
 };

options {
directory "/var/namedb";
pid-file "/var/run/named.pid";
};

zone "." IN {
        type hint;
        file "named.root";
};

zone "localhost" IN {
        type master;
        file "localhost.zone";
        allow-update { none; };
};

zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "named.local";
        allow-update { none; };
};

zone "my.com" IN {
        type master;
        file "my.zone";
        allow-update { none; };
};

zone "83.11.210..in-addr.arpa" IN {
        type master;
        file "my.local";
        allow-update { none; };
};
# End of named.conf
一定要注意黑体字加粗部分是否与rndc.key中的内容相同。如果不想用命令生成,也可以从rndc.key文件中复制过来。
5、建立区文件目录,进入/var/namedb并建立相关区域文件
[root@qhdns etc]# mkdir /var/namedb
[root@qhdns etc]# cd /var/named
在/var/namedb目录下分别建立named.root, localhost.zone,named.local, my.zone , my.local 文件,可参照相关linux 域名服务的文章配置,在此不再赘述。
6、检查bind运行是否正常,如不正常,根据提示修改调整设置。
[root@qhdns etc]# /usr/local/sbin/named –g
加 –g 参数,可以显示出启动运行信息,以便出错排查。
7、设置开机自启动DNS server,只需在/etc/rc.d/rc.local中加入一行
   /usr/local/sbin/named
构建安全的域名系统,正确配置named.conf的内容很重要。
1、 限制对Bind软件的版本信息进行查询
黑客为了利用特定版本Bind软件的漏洞,首先需要确定其版本号。在缺省情况下,Bind软件不限制对自身版本号的查询,所以任何人可以很容易地获取Bind软件的版本号。在options { …}做version “hello1.2.3”声明,就限制了对Bind软件的版本信息的查询。
2、 限制请求DNS进行域名解析的IP地址
为了防止DNS被恶意利用,我们应该对请求DNS做域名解析的IP地址进行限制,只允许信任的IP地址进行查询,在options 中写入 allow-query 210.11.82.0/24,即只允许指定的此网络地址利用本DNS进行域名查询。
3、 限制区域传输
区域传输(zone transfer)主要用于主域名服务器与辅域名服务器之间的数据同步,使辅域名服务器可以从主域名服务器获得新的数据信息。一旦起用区域传输而不做任何限制,很可能会造成信息泄漏,黑客将可以获得整个授权区域内的所有主机的信息,判断主机功能及安全性,从中发现目标进行攻击。在options 中写入Allow-transfer  { 210.11.83.5; }, 即充许这个网址的主机同步自己的数据库,这个一般都是控制辅助域名服务器的,也能够单独放在一个域里,用来只控制一个域同步。
4、 建立DNS日志
DNS日志可以记录服务器CPU占用时间、查询的统计信息及配置中存在的问题,经常分析日志可以了解服务器的负载、性能、安全性,从而及时地采取措施。
logging{
      channel default_log {
      file “/var/adm/dns-default.log” versions 3 size 10m;
      severity info;
      print-severity yes;
       print-time yes;
       print-category yes;
       };
       :
       :
       channel security_log {
       file “/var/adm/dns-security.log” versions 3 size 10m;
       severity warning;
       print-severity yes;
       print-time yes;
       print-category yes;
       };
       category default {default_log;};
       :
       :
       category security {security_log;};
};  
第一个channel中的 default_log是自己定义的channel名称,/var/adm/dns-default.log是日志文件,可依次产生记录该类消息的4个文件(update_log、update_log0、update_log1、update_log2),依次更替,每个文件最大为10M。该日志记录的是除serverty信息以外的警告信息。消息记录格式包括时间、消息级别和种类。关于DNS日志的设置应根据自己需要来,多设置几个通道,将日志信息分类记录,本着多看多分析的原则,及时发现各种问题,以便及时解决。
5、 建立辅域名服务器
为了提高域名系统的可靠性,建立辅域名服务器。当主域名服务器不能正常工作的情况下,能够替代主域名服务器对外提供不间断的服务,并起到数据备份的作用。
6、 使用非root权限运行BIND
使用nobody身份运行能够降低缓冲区溢出攻击所带来的危险。 在Linux内核2.3.99以后的版本中,可以以-u选项以非root权限运行BIND。命令如下:
/usr/local/sbin/named –u nobody
以上是比较重要的安全措施,千万不要忽视,其它安全措施可以根据BIND的说明采取相应措施解决。其实BIND是一个很不错的DNS软件,它提供的Acl和View功能可以实现多ISP策略域名解析,很有用。ISC也为WINDOS操作系统的用户提供了BIND9软件,有兴趣的朋友不妨一试。
三、加强监控,是保证网络正常运行的前提
出色的安全性不可能一蹴而就。俗话说得好,三分技术七分管理,加强日常的监控工作,是保证网络平稳运行的一项有效措施。DNS是互联网的基础服务,是网络运维的核心,要十分重视DNS服务的安全。
1、 定期检查root用户的history列表,last列表,vipw用户列表是否正常;使用命令lsof -i ,netstat -a ,ps -e等命令,定期检查系统服务端口监听等情况,也可制作一个定期执行的脚本,将这些命令定期执行后发到邮箱中。
2、 日志系统承担着整个信息基础设施中感觉器官的作用,一个完善的、工作良好的体系需要正确的部署日志采集工具,这些日志信息被汇总之后可加固系统安全性。linux下有些很好的系统日志分析器,能直接提取日志中的特殊项目,省去了阅读日志的烦恼,比如Logcheck是Linux系统下常用日志分析工具,目前版本为Logcheck V1.2.42
3、 学习使用一些安全工具,从外部尝试去攻击它,尤其当重做系统和升级完Bind,应设法检测重要的已知漏洞攻击,确认是否会对本地网络运行造成影响。如近期缓存投毒漏洞发现者卡明斯基(Kaminsky)在互联网上放置了DNS测试页供互联网用户检查,见右图(http://www.doxpara.com/),你可以试一试。
还可以用Sam Spade免费工具软件等进行例行检查,它能方便地完成多种网络查询任务,如Ping、DNS、Whois、Tracet、Finger等,以此来评估你的网络服务。

文章如转载,请注明转载自:http://www.5iadmin.com/post/23.html