DNS安全:投毒攻击与缓存服务器的配置
DNS是目前互联网上使用最为普遍,同时也是漏洞很多的一个协议。DNS投毒攻击(Poisoning)是一种比较常见的攻击手法,具体而言,通常一台DNS缓存服务器能够影响大量的客户机,通过投毒攻击,能够使得大量用户访问某个具体域名时得到不正确的结果(例如,钓鱼网站,等等)。
为了减少DNS投毒攻击的威胁,有两项非常重要的安全实践,其一是将权威DNS服务器(这些服务器负责解析某些特定的域名)与缓存DNS服务器(这些服务器负责代替其他机器解析域名,并将结果在其本地缓存,以减少权威DNS服务器负载和不必要的网络间流量)分开部署,并启用DNSsec;其二,是限制DNS缓存服务器的可访问来源IP,并在边界路由器上过滤来自不受信路由器,但来源IP字段是本网络的数据包。
由于DNSsec目前还没有被广泛部署,限制能够访问DNS缓存服务器的来源IP是缓存服务器配置的一项非常重要的部分。我们知道,UDP协议中,来源IP字段是可以伪造的(这也是为什么TCP协议要比UDP安全的原因,因为它使用三次握手机制来提高伪造来源IP的难度),而DNS协议的普通查询建立在UDP之上(这是出于显而易见的性能考虑;在实际实现中,许多DNS服务器支持以TCP方式进行查询),而其事务ID只有16个bit,很容易伪造,因此,攻击者通过向DNS缓存服务器发出查询受害域名的请求包,并同时发送大量伪造的DNS回应,并在这些伪造回应中人为地设置较大的TTL,就很有机会"污染"缓存DNS服务器的本地缓存,并在其中长期滞留,从而达到影响更多客户机的目的。
针对DNS投毒攻击,目前并没有真正的遏制方法,所有采取的措施,包括DNS缓存服务器的查询端口随机化等等,都只是将攻击者成功的机会减少一些量级。真正解决这类攻击的方法只有DNSsec和IPsec。
对于企业网络管理员来说,通过在企业内部架设DNS缓存服务器并进行合理的配置,能够有效地减少DNS投毒攻击的风险。这类网络往往采用的是不被路由的 RFC 1918 内网IP地址,并通过DHCP来对客户机进行配置,因此可以通过后者来将客户机DNS指定为内部的DNS缓存服务器。具体来说,企业内部DNS应配置为只监听内网,同时在访问外网时,尽可能利用NAT机制对其访问源地址、源端口进行随机化处理。
有时,企业内部会希望有一些内部域名来方便员工访问一些内部的资源。习惯上,这些NS记录并不会对公网上的DNS服务器发布,因此,如果DNS缓存服务器没有设置上级forwarder,就可能会无法解析这类域名。想要解决这个问题,最简单的办法就是配置一组forward域,例如,在BIND 9.x中,使用类似下面的设置:
| |
在上面的配置中,当有用户请求internal.example.com下的域名,例如 www.internal.example.com 时,缓存服务器便会把请求直接转发给对应的DNS服务器,172.16.2.53(这个服务器应是internal.example.com的权威解析)了。