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 中,使用类似下面的设置:
zone "internal.example.com" {
type forward;
forward only;
forwarders {
172.16.2.53;
};
};
在上面的配置中,当有用户请求 internal.example.com 下的域名,例如 www.internal.example.com 时,缓存服务器便会把请求直接转发给对应的 DNS 服务器, 172.16.2.53 (这个服务器应是 internal.example.com 的权威解析)了。