保护 UNIX 上的域名服务器

作者:Nalneesh Gaur

域名系统 (DNS) 对于互联网的运作至关重要。DNS 将互联网组织成分布式的分层域。这种分层域结构提供了易于管理和可扩展性。必须保持其安全。

1996 年 7 月,Eugene Kashpureff 成功地将 www.internic.net (Internic) 网站劫持到 www.alternic.net (Alternic)。结果,访问 Internic 网站的访问者被定向到 Alternic 网站。这是在未经 Internic 授权的情况下完成的。1997 年末,Kashpureff 在加拿大被捕。他于 1998 年 3 月承认犯有计算机欺诈罪。这一事件证明了 DNS 的重要性以及对 DNS 的安全攻击可能对在互联网上提供服务的组织产生的影响。在当今电子商务和“万物网络化”的时代,DNS 安全势在必行。

BIND (Berkeley Internet Name Domain) 是 DNS 的一种实现。我将在此描述 BIND 中发现的漏洞以及您可以采取的保护措施。我假设您熟悉互联网的运作和 DNS 架构。

BIND 版本

目前有两种主要的 BIND 版本可用:BIND 4.9 版和 BIND 8 系列。BIND 的大多数新开发工作仍在 8 系列上进行。最新的 BIND 版本 8.2.1 于 1999 年 6 月 21 日发布,可从 http://www.isc.org/ 获取。在 4.9 BIND 系列中,最新的 BIND 版本是 4.9.7。

BIND 通常作为大多数基于 UNIX 的操作系统的一部分提供。但是,供应商往往在适应最新的 BIND 版本方面落后。您可以通过检查系统日志文件来确定您的操作系统供应商提供的 BIND 版本。

互联网软件联盟 (ISC) 赞助 BIND 的开发。最新版本的 BIND 提供了许多新功能和安全增强功能。其中最主要的是完全支持负缓存、运行多个虚拟 DNS 服务器的能力、先前版本的错误修复和性能增强。表 1 比较了 BIND 8 和 BIND 4.9.7 之间的一些主要差异。ISC 对 BIND 的两个不同分支进行了如下说明

BIND 4 版已正式弃用,转而支持 BIND 8 版,并且除了与安全相关的补丁外,BIND 4 版不再进行其他开发。

表 1

BIND 漏洞和问题

BIND 服务器的风险可能来自对功能的需求,这些功能可能使 BIND 服务器容易受到攻击、BIND 的错误配置以及 BIND 中的漏洞。BIND 中的以下漏洞/问题可能会被利用。

缓存中毒

在 4.9.6 版和 8.1.1 版之前的所有 BIND 版本中都存在此漏洞。它允许入侵者使受害者域名服务器查询由入侵者控制的远程域名服务器。远程域名服务器会将虚假信息返回给受害者域名服务器。虚假信息将被缓存在受害者域名服务器上,缓存时间由远程域名服务器返回的记录的 TTL 字段指定。简而言之,这种攻击允许入侵者将受害者域名服务器的主机名 IP 地址映射指向入侵者选择的备用 IP 地址。Eugene Kaspureff 使用缓存中毒将流量从 www.internic.net 转移到 www.alternic.net。

反向查询缓冲区溢出

BIND 4.9.7 和 BIND 8.1.2 之前的 BIND 版本容易受到此漏洞的影响。此漏洞允许入侵者获得受害者域名服务器上的 root 级别访问权限,或者只是导致服务器崩溃。早期版本的 BIND 允许反向查询功能(请参阅词汇表)。实际上,根据 DNS 规范,反向查询是可选的。默认情况下,服务器未配置为响应虚假查询。但是,BIND 8 可以配置为对反向查询提供虚假响应。正是那些配置为响应虚假查询的服务器容易受到攻击。反向查询功能代码在 BIND 4.9.7 及更高版本中被禁用(在源代码中注释掉)。

拒绝服务

BIND 4.9.7 和 8.1.2 版本比以前的版本执行更好的边界检查。以前的 BIND 版本可能被利用来访问无效的内存位置,从而导致服务器崩溃。崩溃使域名服务器无法响应查询,这是一种拒绝服务。

区域传送

辅助域名服务器从主域名服务器执行区域传送,以更新其区域数据库。默认情况下,主域名服务器将允许任何主机进行区域传送请求。这并不严格属于漏洞类别。但是,域名服务器包含有关网络资源的宝贵信息。诸如主机名、主机数量、主机上的文本信息 (HINFO, TXT) 和邮件服务器名称等信息在区域传送中可用。因此,它为入侵者提供了情报信息,可用于对企业发起其他类型的攻击。

未经授权的动态更新

动态更新仅与 BIND 8 及更高版本相关联。动态更新不适用于 BIND 4 系列。动态更新功能允许授权主机更新域名服务器的区域记录。如果配置不当,入侵者可能能够添加/删除/替换区域的记录。

允许递归查询

这更属于组织外部个人误用或滥用域名服务器的范畴。简单来说,互联网上的任何人都可以使用您的域名服务器来执行递归查询。这可能会导致您的域名服务器非常繁忙,以响应其他所有人的查询。此外,互联网上的每个人都将使用您的带宽来执行此操作。此外,这与缓存中毒漏洞有关。

保护 DNS

Securing Name Servers on UNIX

图 1

本节重点介绍域名服务器管理员可以采取的措施,以保护其在 UNIX 上的 DNS 环境。图 1 显示了基于流程图的方法来保护 BIND。正确实施以下措施将有助于保护 BIND。

使用最新版本的 BIND

系统 syslog 文件包含有关系统正在运行的当前 BIND 版本的信息。BIND 8 系列在定义 ACL(访问控制列表)和配置域名服务器方面提供了更高的粒度。更具体地说,BIND 8 系列优于 BIND 4。使用最新版本的 BIND 8 系列将防止缓存中毒、反向查询缓冲区溢出和拒绝服务漏洞。

限制区域传送

BIND 提供了配置选项来限制区域传送。默认情况下,区域传送已启用,任何人都可以对域名服务器数据库执行区域传送。 nslookup 中的 ls {domain_name} 命令有助于实现这一点。要限制区域传送,请分别在 BIND 8 版和 4.9 版中使用 allow-transferxfernets 配置语句。

建立查询的访问控制

这是限制可以查询域名服务器的主机所必需的。特别是,这对于组织内部的区域非常有用。此外,限制查询可以最大限度地减少暴露于缓存中毒漏洞的风险。默认情况下,BIND 允许任何人查询,即使对于域名服务器不是权威的区域也是如此。只有 BIND 8 为查询提供 ACL。BIND 8 配置语句 allow-query 用于定义基于 IP 地址的查询 ACL。

限制递归查询

如果不需要递归,最好禁用它。此类非递归服务器负责回答对其权威区域的查询。此外,这些服务器很难被欺骗,因为服务器不缓存任何数据。大多数情况下,内部客户端向域名服务器发送递归查询。在这种情况下,可能需要递归,并且必须启用递归。此类服务器必须允许递归并在查询(allow-query)上建立 ACL。

限制动态更新

动态更新是 BIND 8 的一项功能。默认情况下,BIND 8 禁用动态更新。如果需要动态更新,则应将此类更新限制为单个 IP 地址,而不是网络地址。 allow-update 配置语句定义服务器将接受更新的地址。

防止 IP 欺骗

BIND 语句(例如 xfernetsallow-transferallow-queryallow-update 语句)定义了通过 IP 地址限制许多功能的方法。如果 IP 地址被欺骗,则此类配置不提供任何保护。为了防止 IP 欺骗,网络管理员必须在防火墙、堡垒主机和入侵检测系统 (IDS) 上建立适当的 IP 欺骗控制。

架构和其他注意事项

可用于保护域名服务器的其他一些措施包括使用脑裂域名服务器和从 DNS 数据库中删除不必要的信息。

脑裂域名服务器

脑裂域名服务器由两个独立的域名服务器组成。这些在防火墙环境中非常常见。通常,一个域名服务器(有时称为外部域名服务器,在防火墙外部)提供有关 Web 服务器、MX 记录、其他域名服务器以及与某个位置提供的任何其他服务相关的名称的信息。防火墙内部的另一个域名服务器包含有关企业中其他域名服务器的信息。如您所见,外部域名服务器是与外部世界的接口,因此仅提供最少的信息。为了提供进一步的保护,可以将外部域名服务器配置为关闭递归。

具有定义角色的域名服务器

其思想是区分允许递归的域名服务器和不允许递归的域名服务器。有必要在某些域名服务器上允许递归,以便发出递归查询的客户端继续运行。在这种情况下,可以将一个域名服务器配置为关闭递归。此类域名服务器对其区域具有权威性,并将拒绝递归查询。通常,这是在网络域注册机构注册的服务器类型。另一个域名服务器允许递归;但是,它仅允许来自少数授权主机/网络的此类查询。这仅允许授权解析器查询递归域名服务器。

删除数据库中不必要的信息

域名服务器中不必要的数据使从域名服务器收集情报变得更容易。诸如用户名和管理员姓名、电话号码以及有关主机制造商和型号的详细信息等信息(如果不需要)可以从域名服务器数据库中省略。

以非 root 用户身份运行 BIND

BIND 通常以 root 身份运行。以 root 身份运行 BIND 可能会使入侵者能够利用漏洞,从而允许他们以 root 身份运行命令和读/写文件。BIND 服务器 8.1.2 及更高版本为您提供了以 root 以外的用户身份运行 BIND 的选项。此外,BIND 8 还提供了 chroot 域名服务器的选项。域名服务器守护程序的 ut 选项可以完成此操作。

结论

DNS 的 BIND 实现中已经进行了重大的安全增强和改进。至少,安装最新版本的 BIND,以防止常见的 BIND 漏洞。为了进一步保护您的环境,请使用最新版本 BIND 中的安全配置选项。当您将 BIND 更新应用于您的环境时,请务必小心,特别是当您从 ISC 网站而不是您的操作系统供应商处获取更新时。应用供应商补丁时必须小心谨慎。通常,供应商补丁会覆盖 BIND 可执行文件和其他相关文件。结果可能是域名服务器损坏或容易受到攻击。

要及时了解 BIND 的最新动态,请阅读 BIND 新闻组,定期查看 ISC 网站,并查看您的操作系统供应商发布的所有与 DNS 相关的公告。BIND 8.2 包含 RFC 2065(DNSSEC,DNS 安全扩展)中指定的 DNS 安全功能。DNS 安全功能使用公钥密码术来提供数据来源身份验证和数据完整性。每个区域都有自己的私钥/公钥,并使用其私钥对资源记录进行签名。DNSSEC 扩展目前尚未广泛部署。在 DNSSEC 下,区域的公钥需要由其父区域签名。在撰写本文时,Internic 尚未签署子区域密钥。

最后,最重要的是要说 DNS 只是一个服务,这意味着如果您有资源的 IP 地址,您将能够访问该资源。您的域名服务器的安全程度仅取决于网络和网络上其他服务器的安全程度。因此,至关重要的是,在尝试保护您的域名服务器之前,您必须采取适当的网络和服务器安全措施。

资源

词汇表

Nalneesh Gaur (Nalneesh.Gaur@gte.net) 是 Ernst & Young LLP 在德克萨斯州达拉斯市的 eRisk Solutions 部门的经理。多年来,他专门从事 UNIX 和 Windows NT 系统、集成以及互联网/内联网安全问题。

加载 Disqus 评论