DNS系统(服务器)的工作原理及攻击防护

转载:http://www.guanwei.org/post/applicationsecurity/06/DNS-Security.html


国际著名网络安全专家Roland Dobbins曾说过,域名系统就像是“空气”,平时我们感觉不到它的存在,但是一旦出现问题,其影响可能是“致命”的。近年来的“163.net域名劫持”事件、“adobe.com域名劫持”事件、“Google域名劫持”事件、“twitter域名劫持”事件、“百度域名劫持”事件以及“暴风影音断网门”都说明了域名系统安全性面临的巨大风险以及在安全性遭受到破坏时将会导致的巨大损失。那么,为什么长久以来DNS系统总是会遭受到类似域名劫持的攻击呢?本文尝试从技术角度对域名系统的安全性进行分析及建议


本文第一部分简要介绍了域名系统(DNS)的概念和基本原理,第二部分分析了DNS系统易遭受的各种攻击。第三部分综述了目前已有的安全解决方案,第四部分进行了总结。

一、 概述

DNS系统

DNS是英文Domain Name System(域名系统)的缩写,它是一种可以将域名和IP地址相互映射的以层次结构分布的数据库系统,为互联网的运行提供关键性的基础服务。各种基于域名的Web访问,email系统、文件共享系统等都依靠DNS服务得以正常实现。DNS系统采用备份技术和缓存技术保证了数据库运行的可靠性和服务速率。

DNS服务原理

DNS系统采用递归查询请求的方式来响应用户的查询。

下面引用老师的课件插图来进行说明:

 

1)用户向DNS 客户端发送DNS请求,客户端先查看本地缓存,如果缓存中有该域名,则直接返回给用户;客户端若没有域名的相关缓存,则向本地域名服务器提出解析请求。

2)本地域名服务器在收到请求后,先查看缓存,若缓存中有相关记录,则应答客户端的请求;否则,本地域名服务器直接向根域名服务器提出请求。

3)根域名服务器接到请求后,将包含有所需解释的域名的顶级域名服务器返回给本地域名服务器。

4)本地域名服务器根据根域名服务器的返回结果,向顶级域名服务器发送请求。

5)顶级域名服务器接到请求后,将包含所查询的域名的域名服务器返回给本地域名服务器。

6)本地域名服务器根据返回结果连接包含域名的域名服务器,得到查询结果,然后将查询结果缓存,并向客户端应答。

7)客户端接到应答后,将查询结果缓存,然后向用户应答。

二、 安全威胁

DNS的安全威胁主要可分为几种:DNS欺骗、分布式拒绝服务攻击、DNS软件漏洞攻击、管理缺陷等。下面分别对这几类攻击进行介绍。

DNS欺骗

DNS的查询请求是基于UDP的,DNS客户端会接受首先到达的DNS应答包,而将后到达的DNS应答包当作是冗余包简单丢弃掉。客户端对DNS应答包的验证仅通过随机发送的查询ID和UDP端口号,除此之外没有任何的验证。这就给DNS欺骗提供了机会。

1、DNS ID欺骗

DNS ID欺骗中的攻击者必须跟用户处于同一个局域网内。

攻击流程:

1)Arp欺骗。欺骗者向用户发送伪造的arp应答报文,更新用户本地的arp缓存,使用户认为欺骗者为网关。这样,在用户向本地DNS服务器发送请求时,数据的流向就改为用户—欺骗者—网关—本地DNS服务器。欺骗者通过sniffer软件,嗅探到DNS请求包的ID和端口号。

2)欺骗者利用得到的ID和端口号,优先向用户发送伪造DNS应答,用户在对ID和端口号进行核对后认为是正确的应答。此时用户访问的域名已经被替换为欺骗者伪造的IP。

3)本地DNS服务器发送的真的DNS应答包因为晚于伪造包,用户收到后丢弃。至此,DNS ID欺骗攻击完成。

2、DNS缓存中毒

当攻击者与用户不是处于同一个局域网时,攻击者无法得到DNS请求报文的ID与端口号,“生日攻击”就是在这种情况下的对DNS缓存的一种攻击方式。

攻击流程如下:

1、 攻击者向DNS服务器发送一定数量的DNS请求包,请求的DNS选择该DNS服务器解析不了的,这样的情况下,DNS服务器会向上层DNS服务器发出相同数量的请求。

2、 攻击者快速向DNS服务器发送一定数量的伪造的DNS应答包,其中ID和端口号为随机的,当ID和端口号与正确的相碰撞时,缓存攻击成功。DNS服务器将错误的DNS解析项缓存,这样,所有DNS请求都将导向攻击者伪造的IP地址。

“生日悖论”的数学模型可以证明,一次成功的攻击所需发送伪造包的数量并不多,即是说“生日攻击”是易于发动,也易于成功的。

分布式拒绝服务攻击

攻击者通过控制的“僵尸网络”(成百上千的被控主机群)向目标DNS服务器发送DNS查询请求,从而导致目标DNS服务器过载以及网络线路堵塞。从而形成分布式拒绝服务攻击。

著名的“暴风影音DNS攻击”事件就是分布式拒绝服务攻击的一个实例。

软件漏洞攻击

1、 DoS(Deny of Service)攻击

利用DNS软件的漏洞,如9.2.0版本以前的BIND,向正在运行的BIND设备发送特定的DNS数据包请求,BIND会自动关闭,用户的请求将无法得到DNS服务器的任何应答,用户也将无法访问互联网,从而形成DoS攻击。

2、 缓冲区溢出攻击

利用DNS软件对输入的请求字符串不做做严格的检查的安全漏洞,攻击者构造特殊的数据包攻击DNS服务器,以期造成DNS软件的缓冲区溢出,在溢出成功后,通过执行特殊的代码获得高级的权限,从而得到DNS服务器的控制权。

管理缺陷

DNS现有的管理、配置以及安全机制的规划都非常有限,甚至还很初级。例如目前全球DNS系统仍然主要依赖多点镜像、负载均衡等方法来应对流量突发访问以及遭受DDOS攻击时保持正常运转。另外对DNS的管理和配置以及安全防护也主要依赖管理者的实际经验。

三、解决方案

应对上述DNS安全威胁的主要办法可总结如下:

防范Arp攻击、采用UDP随机端口、建立静态IP映射、运行最新版本的BIND、限制查询、利用防火墙进行保护、利用交叉检验、使用TSIG机制、利用DNSSEC机制。

下面分别做出说明。

防范Arp攻击

主要是针对局域网的DNS ID欺骗攻击。如上所述,DNS ID欺骗是基于Arp欺骗的,防范了Arp欺骗攻击,DNS ID欺骗攻击是无法成功实施的。

采用UDP随机端口

不再使用默认的53端口查询,而是在UDP端口范围内随机选择,可使对ID与端口组合的猜解难度增加6万倍,从而降低使DNS缓存攻击的成功率。

建立静态IP映射

主要是指DNS服务器对少部分重要网站或经常访问的网站做静态映射表,使对这些网站的访问不再需要经过缓存或者向上一级的迭代查询,从而在机制上杜绝DNS欺骗攻击。

运行最新版本的BIND

使用最新版本的BIND,可以防止已知的针对DNS软件的攻击(如DoS攻击、缓冲区溢出漏洞攻击等)。应密切关注BIND安全公告,及时打好补丁。

限制查询

 在BIND8和BIND9之后,BIND的allow-query子句允许管理员对到来的查询请求使用基于IP地址的控制策略,访问控制列表可以对特定的区甚至是对该域名服务器受到的任何查询请求使用限制策略。如限制所有查询、限制特定区的查询、防止未授权的区的查询、以最少权限运行BIND等。

利用防火墙进行保护

 这种保护方式可以使受保护的DNS服务器不致遭受分布式拒绝服务攻击、软件漏洞攻击。原理是在DNS服务器主机上建立一个伪DNS服务器共外部查询,而在内部系统上建立一个真实的DNS服务器专供内部使用。配置用户的内部DNS客户机,用于对内部服务器的所有查询,当内部主机访问某个网站时,仅当内部DNS服务器上没有缓存记录时,内部DNS才将查询请求发送到外部DNS服务器上,以保护内部服务器免受攻击。

利用交叉检验

 这种保护方式可以从一定程度上防范DNS欺骗攻击。原理是反向查询已得到的IP地址对应的主机名,用该主机名查询DNS服务器对应于该主机名的IP地址,如果一致,则请求合法,否则非法。

使用TSIG机制

TSIF(事物签名)机制(RFC2845)通过使用共享密钥(Secret Key)及单向散列函数(One-way hash function)提供信息的验证以及数据的完整性。当配置了TSIG后,DNS消息会增加一个TSIF记录选项,该选项对DNS消息进行签名,为消息发送者和接受者提供共享密钥,从而保证了传输数据不被窃取和篡改。TSIP机制的部署步骤不做赘述,相关RFC文档有详细说明。

利用DNSSEC机制

为保证客户机发送的解析请求的完整性,保护DNS服务器及其中的信息,防止入侵者冒充合法用户向他人提供虚假DNS信息,IETF(网络工程任务组)提出了DNS安全扩展(DNSSEC)的安全防范思想。

1、 DNSSEC工作原理

为提高DNS访问数据包的安全性,DNSSEC在兼容现有协议的基础上引入加密和认证体系,在每个区域都有一对区域级的密钥对,密钥对中的公钥对域名记录信息进行数字签名,从而使支持DNSSEC的接收者可以校验应答信息的可靠性。

BIND9.0支持DNS的安全扩展功能⋯。DNSSEC引入两个全新的资源记录类型:KEY和SIG,允许客户端和域名服务器对任何DNS数据来源进行密钥验证。DNSSEC主要依靠公钥技术对于包含在DNS中的信息创建密钥签名,密钥签名通过计算出一个密钥Hash数来提供DNS中数据的完整性,并将该Hash数封装进行保护。私/公钥对中的私钥用来封装Hash数,然后可以用公钥把Hash数翻译出来。如果这个翻译出的Hash值匹配接收者计算出来的Hash数,那么表明数据是完整的、没有被篡改的。

2、 DNSSEC的实施

1)、创建一组密钥对

#cd/vat/named

#dnssec -keygen -a RSA -b 512 -n ZONE qfnu.edu.Kqfnu.edu+002+27782

2)、生成密钥记录

#dnssec –makekeyset -t 172802 I

3)、发送密钥文件到上一级域管理员,以供签名使用

#dnssec -signkey keyset -qfnu.edu Kedu.+002+65396.private

然后将返回qfnu.edu.signedkey文件

4)、在进行区域签名之前,必须先将密钥记录添加到区域数据文件之中

#cat“$include Kqfnn.edu.+002+27782.key”>>db.qfnu.edu

5)、对区域进行签名

#dnssec –signzone -O qfnu.edu db.qfnu.edu

6)、修改named.conf里的zone语句,系统将会载新的区域数据文件

3、 DNSSEC的不足

一方面,DNSSEC安全性虽然有所提高,但是标记和校验必然产生额外的开销,从而影响网络和服务器的性能,签名的数据量很大,家中了域名服务器对骨干网以及非骨干网连接的负担,同时简明校验也对CPU造成了很大的负担,同时签名和密钥也占用了占用的磁盘空间以及RAM容量。

另一方面,安全性能方面的考虑。绝大多数的DNS软件是美国出口的,它们为了通过美国政府的安全规定而被迫降低加密算法和过程的安全强度。

第三方面,RSA算法的使用。RSA拥有美国专利,与某些厂商和组织倡导的“免费/开放”目标有所冲突,但是同时又别无选择。在成本方面也是部署中的一个问题。

四、 总结

知名IT网站TechTarget近日发布的2010年五大安全主题的展望中,DNSSEC部署动向位列第三位,DNS服务的安全性已经受到人们越来越多的关注。然而DNS系统本身的复杂性以及全球性特点给DNS系统的安全部署又带来了很多的问题,而目前已有的安全方案仍然很不成熟,部署应用中也还有很多问题没有解决,如何面对这些挑战,仍然是一个尚未解决又急需解决的难题。


你可能感兴趣的:(技术-转载)