DNS服务面临的安全
DNS 服务面临的安全隐患主要包括:DNS 欺骗(DNS Spoffing)、拒绝服务(Denial of service,DoS )攻击、分布式拒绝服务攻击和缓冲区漏洞溢出攻击(Buffer Ove
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 域名服务器安
全增强”
(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 配置文件开放源代码软件。可以在
详细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:允许进行 DNS 辖区数据传输主机的 IP 列表。
(4)allow-update :目的在于指定能向本 dns 服务器提交动态 dns 更新的主机
语法:allow-update { };
例子: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 服务器用来存储主机的域名信息。包括三种:
,