Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

4.5. 使用 DNSSEC 保护 DNS 流量

4.5.1. DNSSEC 简介

DNSSEC 是一组 域名系统安全扩展 (DNSSEC),它允许 DNS 客户端验证并检查来自 DNS 名称服务器的响应的完整性,以验证其原始卷,并确定它们是否在传输中被篡改。

4.5.2. 了解 DNSSEC

对于通过互联网连接,现在有更多 Web 站点可以使用 HTTPS 安全地连接。但是,在连接到 HTTPS webserver 之前,必须执行 DNS 查找,除非您直接输入 IP 地址。这些 DNS 查找是不安全的完成的 ,受因为缺少身份验证的中间人攻击。换句话说,DNS 客户端不能确信来自给定 DNS 名称服务器的回复是真实的,且未被篡改。更重要的是,递归名称服务器无法确定它从其他名称服务器获得的记录是个例。DNS 协议没有为客户端提供了一种机制来确保它不受中间人攻击。引入 DNSSEC 以解决使用 DNS 解析域名时缺少身份验证和完整性检查。它没有解决保密性的问题。
发布 DNSSEC 信息涉及数字签名 DNS 资源记录,以及以这样一种方式分发公钥,从而使 DNS 解析器能够构建分层信任链。所有 DNS 资源记录的数字签名都会生成并添加到区域,作为数字签名资源记录(RRSIG)。区域的公钥被添加为 DNSKEY 资源记录。要构建分层链,DNSKEY 的哈希值在父区域中发布,以 委派签名 (DS)资源记录。为便于验证非一致性,则使用 NextSECure (NSEC)和 NSEC3 资源记录。在 DNSSEC 签名区域中,每个资源记录集 (RRset)都有对应的 RRSIG 资源记录。请注意,用于委托到子区域(NS 和 glue 记录)的记录没有签名;这些记录会出现在子区域中,并在那里签名。
处理 DNSSEC 信息由配置了根区域公钥的解析器完成。使用这个密钥,解析器可以验证 root 区域中使用的签名。例如,root 区域已签署了 .com 的 DS 记录。root 区域还为 .com 名称服务器提供 NS 和 glue 记录。解析器遵循此委托并查询 .com 的 DNSKEY 记录,使用这些委派的名称服务器。获得的 DNSKEY 记录的哈希值应与 root 区域中的 DS 记录匹配。如果是,解析器将信任 .com 获取的 DNSKEY。在 .com 区域中,RSIG 记录由 .com DNSKEY 创建。对于 .com 中的委派,此过程的重复重复,如 redhat.com。使用此方法时,只需要配置一个 root 密钥来验证 DNS 解析器只需要配置一个 root 密钥,同时它在正常操作期间从全球收集多个 DNSKEY。如果加密检查失败,解析器会将 SERVFAIL 返回到应用程序。
DNSSEC 的设计方式对不支持 DNSSEC 的应用程序完全不可见。如果非 DNSSEC 应用程序查询 DNSSEC 功能解析器,它将在没有这些新的资源记录类型(如 RRSIG)的情况下收到回答。但是,DNSSEC 功能解析器仍将执行所有加密检查,如果检测到恶意 DNS 回答,仍会向应用程序返回 SERVFAIL 错误。DNSSEC 保护 DNS 服务器(权威和递归)之间数据的完整性,它不会在应用程序和解析器之间提供安全性。因此,务必要让应用程序为其解析器提供安全传输。完成的最简单方法是,在 localhost 上运行 DNSSEC 功能解析器,并在 /etc/resolv.conf 中使用 127.0.0.1。或者可以使用到远程 DNS 服务器的 VPN 连接。

了解 Hotspot 问题

Wi-Fi Hotspots 或 VPN 依赖 DNS 是:捕获门户倾向于劫持 DNS,以便将用户重定向到需要为其验证(或付费)进行 Wi-Fi 服务的页面。连接到 VPN 的用户通常需要使用 内部 DNS 服务器来查找公司网络外不存在的资源。这要求软件进行额外的处理。例如,dnssec-trigger 可用于检测 Hotspot 是否劫持 DNS 查询,unbound 可以充当代理名称服务器来处理 DNSSEC 查询。

选择 DNSSEC Capable Recursive Resolver

要部署支持递归解析器的 DNSSEC,可以使用 BINDunbound。两者都默认启用 DNSSEC,并使用 DNSSEC root 密钥进行配置。要在服务器上启用 DNSSEC,但其中一个操作都将在移动设备(如笔记本)上首选使用 unbound,因为它允许本地用户使用 dnssec-trigger 时动态重新配置 Hotspots 所需的 DNSSEC 覆盖,在使用 Libreswan 时,对于 VPN。unbound 守护进程进一步支持部署在 etc/unbound8:0:1::.d/ 目录中列出的 DNSSEC 异常,它们对服务器和移动设备都很有用。

4.5.3. 了解 Dnssec-trigger

/etc/resolv.conf 中安装和配置 unbound 后,所有来自应用程序的 DNS 查询都会被 unbound 处理。DNSSEC-trigger 仅在触发 unbound 解析器时重新配置 unbound 解析器。这主要适用于连接到不同 Wi-Fi 网络的 roaming 客户端机器,如笔记本电脑。此过程如下:
  • 当通过 DHCP 获取新的 DNS 服务器时,NetworkManager 会触发 dnssec-trigger
  • 然后 DNSSEC -trigger 对服务器执行多个测试,并确定它是否正确支持 DNSSEC。
  • 如果存在,则 dnssec-trigger 会重新配置 unbound,以使用该 DNS 服务器作为所有查询的转发器。
  • 如果测试失败,dnssec-trigger 将忽略新的 DNS 服务器,并尝试一些可用的回退方法。
  • 如果它确定有无限端口 53 (UDPTCP)可用,它将告知 unbound 成为完整的递归 DNS 服务器,而无需使用任何转发器。
  • 如果这不可能,例如,因为防火墙阻止了端口 53,除了到达网络的 DNS 服务器本身外,它将尝试使用 DNS 到端口 80,或者 TLS 封装 DNS 到端口 443。在端口 80 和 443 上运行的服务器可以在 /etc/dnssec-trigger/dnssec-trigger.conf 中配置。默认配置文件中应提供了注释的示例。
  • 如果这些回退方法也失败,dnssec-trigger 将提供不安全的操作,这将会完全绕过 DNSSEC,或者只在缓存中 运行,它不会尝试新的 DNS 查询,但会回答它在缓存中已有的所有内容。
Wi-Fi Hotspots 越来越多地将用户重定向到登录页,然后向互联网授予访问权限。在上面概述的序列中,如果检测到重定向,系统会提示您询问是否需要登录才能访问互联网。dnssec-trigger 守护进程每 10 秒继续探测 DNSSEC 解析器。有关使用 dnssec-trigger 图形化工具的详情,请查看 第 4.5.8 节 “使用 Dnssec-trigger”

4.5.4. VPN Supplied Domains 和 Name Servers

某些类型的 VPN 连接可以传递一个域和用于该域的名称服务器列表,作为 VPN 隧道设置的一部分。在 Red Hat Enterprise Linux 中,NetworkManager 支持它。这意味着 unbounddnssec-triggerNetworkManager 的组合可以正确支持 VPN 软件提供的域和名称服务器。VPN 隧道启动后,会为接收的域名的所有条目清除本地 unbound 缓存,以便从使用 VPN 访问的内部名称服务器获取对域名中的名称的查询。当 VPN 隧道终止时,不会再次清除 unbound 缓存,以确保对域的任何查询都将返回公共 IP 地址,而不是之前获取的专用 IP 地址。请参阅 第 4.5.11 节 “为连接分割域配置 DNSSEC 验证”

4.5.6. 了解信任 Anchors

在分层加密系统中,信任锚 是被假定为可信的权威实体。例如,在 X.509 架构中,根证书是从中派生信任链的信任锚。信任锚必须事先拥有信任方,然后才能进行路径验证。
在 DNSSEC 上下文中,信任锚由与该名称关联的 DNS 名称和公钥(或公钥的哈希)组成。它表示为 base 64 编码密钥。它与一个证书类似,它是一种交换信息(包括公钥)的方法,可用于验证和验证 DNS 记录。RFC 4033 将信任定位符定义为 DNSKEY RR 的已配置 DNSKEY RR 或 DS RR 哈希。验证安全感知解析器使用此公钥或哈希作为起点,用于将身份验证链构建到签名的 DNS 响应中。通常,验证解析器必须通过一些安全或可信的方法在 DNS 协议之外获取其信任定位符的初始值。存在信任定位符还意味着解析器应该预期信任锚指向的区域。

4.5.7. 安装 DNSSEC

4.5.7.1. 安装 unbound

要在机器上使用 DNSSEC 验证 DNS,需要安装 DNS 解析器 未绑定 (或 绑定 )。只需要在移动设备上安装 dnssec-trigger。对于服务器,unbound 应该足够了,但可能需要本地域的转发配置,具体取决于服务器所在的位置(LAN 或 Internet)。DNSSEC-trigger 目前只会对全局公共 DNS 区域提供帮助。NetworkManagerdhclient 和 VPN 应用程序通常会自动收集域列表(以及名称服务器列表),但不能自动收集 dnssec-triggerunbound
要安装 unbound,请以 root 用户身份输入以下命令:
~]# yum install unbound

4.5.7.2. 检查 unbound 是否正在运行

要确定 unbound 守护进程是否正在运行,请输入以下命令:
~]$ systemctl status unbound
 unbound.service - Unbound recursive Domain Name Server
	  Loaded: loaded (/usr/lib/systemd/system/unbound.service; disabled)
	  Active: active (running) since Wed 2013-03-13 01:19:30 CET; 6h ago
如果 unbound 服务没有运行,systemctl status 命令将会报告 unbound 作为 Active: inactive (dead)

4.5.7.3. 启动 unbound

要为当前会话启动 unbound 守护进程,请以 root 用户身份输入以下命令:
~]# systemctl start unbound
运行 systemctl enable 命令,以确保每次系统引导时都启动 unbound
~]# systemctl enable unbound
unbound 守护进程允许使用以下目录配置本地数据或覆盖:
  • /etc/unbound/conf.d 目录用于为特定域名添加配置。这用于将对域名的查询重定向到特定的 DNS 服务器。这通常用于只存在于企业 WAN 中的子域。
  • /etc/unbound/keys.d 目录用于为特定域名添加信任定位符。当仅限内部名称被 DNSSEC 签名时,这是必需的,但没有公开现有的 DS 记录来构建信任路径。另一个用例是使用与公司 WAN 外部公开名称不同的 DNSKEY 进行签名。
  • /etc/unbound/local.d 目录用于添加特定的 DNS 数据作为本地覆盖。这可用于构建黑名单或创建手动覆盖。此数据将由 unbound 返回到客户端,但不会标记为 DNSSEC 签名。
NetworkManager 以及一些 VPN 软件可能会动态更改配置。这些配置目录包含注释掉的示例条目。详情请查看 unbound.conf (5) 手册页。

4.5.7.4. 安装 Dnssec-trigger

dnssec-trigger 应用作为守护进程运行,dnssec-triggerd。要安装 dnssec-trigger,请以 root 用户身份输入以下命令:
~]# yum install dnssec-trigger

4.5.7.5. 检查 Dnssec-trigger 守护进程是否正在运行

要确定 dnssec-triggerd 是否正在运行,请输入以下命令:
~]$ systemctl status dnssec-triggerd
systemctl status dnssec-triggerd.service
dnssec-triggerd.service - Reconfigure local DNS(SEC) resolver on network change
	  Loaded: loaded (/usr/lib/systemd/system/dnssec-triggerd.service; enabled)
	  Active: active (running) since Wed 2013-03-13 06:10:44 CET; 1h 41min ago
如果 dnssec-triggerd 守护进程没有运行,systemctl status 命令将报告为 Active: inactive (dead)。要为当前会话启动它,请以 root 用户身份输入以下命令:
~]# systemctl start dnssec-triggerd
运行 systemctl enable 命令,以确保 dnssec-triggerd 每次系统引导时启动:
~]# systemctl enable dnssec-triggerd

4.5.8. 使用 Dnssec-trigger

dnssec-trigger 应用有一个 GNOME 面板实用程序,用于显示 DNSSEC 探测结果,以及按需执行 DNSSEC 探测请求。要启动该实用程序,请按 Super 键进入 Activities Overview,输入 DNSSEC,然后按 Enter。在屏幕底部的消息栏中添加了图标重新排序异常。按屏幕右下角的 round blue 通知图标显示它。右键单击 anchor 图标以显示弹出菜单。
在不正常操作 unbound 中,本地将 unbound 用作名称服务器,resolv.conf 则指向 127.0.0.1。当您单击 Hotspot Sign-On 面板中的 OK 时,这已更改。DNS 服务器从 NetworkManager 查询并放入 resolv.conf 中。现在,您可以在 Hotspot 的登录页面上进行身份验证。anchor 图标显示一个大的红色感叹号,警告您以不安全的方式进行 DNS 查询。经过身份验证后,dnssec-trigger 应该自动检测此模式并切回到安全模式,但在某些情况下,用户必须选择 Reprobe 来手动执行此操作。
DNSSEC-trigger 通常不需要任何用户交互。启动后,它在后台工作,如果遇到了一个问题,则通过弹出文本框中通知用户。它还告知 unboundresolv.conf 文件的更改。

4.5.9. 使用带有 DNSSEC 的 dig

要查看 DNSSEC 是否正常工作,可以使用各种命令行工具。使用的最佳工具是 bind-utils 软件包中的 dig 命令。其他有用的工具可从 ldns 软件包和 unbound 软件包中的 unbound-host 深入了解。旧的 DNS 工具 nslookuphost 已被弃用,不应使用。
要使用 dig 发送请求 DNSSEC 数据的查询,选项 +dnssec 会添加到命令中,例如:
~]$ dig +dnssec whitehouse.gov
; <<>> DiG 9.9.3-rl.13207.22-P2-RedHat-9.9.3-4.P2.el7 <<>> +dnssec whitehouse.gov
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21388
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;whitehouse.gov.			IN	A

;; ANSWER SECTION:
whitehouse.gov.		20	IN	A	72.246.36.110
whitehouse.gov.		20	IN	RRSIG	A 7 2 20 20130825124016 20130822114016 8399 whitehouse.gov. BB8VHWEkIaKpaLprt3hq1GkjDROvkmjYTBxiGhuki/BJn3PoIGyrftxR HH0377I0Lsybj/uZv5hL4UwWd/lw6Gn8GPikqhztAkgMxddMQ2IARP6p wbMOKbSUuV6NGUT1WWwpbi+LelFMqQcAq3Se66iyH0Jem7HtgPEUE1Zc 3oI=

;; Query time: 227 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Aug 22 22:01:52 EDT 2013
;; MSG SIZE  rcvd: 233
除了 A 记录外,还会返回包含 DNSSEC 签名的 RRSIG 记录,以及签名的时间和过期时间。unbound 服务器表示数据经过 DNSSEC 验证,方法是返回顶部的 flags: 部分中的 ad bit。
如果 DNSSEC 验证失败,则 dig 命令会返回 SERVFAIL 错误:
~]$ dig badsign-a.test.dnssec-tools.org
; <<>> DiG 9.9.3-rl.156.01-P1-RedHat-9.9.3-3.P1.el7 <<>> badsign-a.test.dnssec-tools.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 1010
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;badsign-a.test.dnssec-tools.org. IN	A

;; Query time: 1284 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Aug 22 22:04:52 EDT 2013
;; MSG SIZE  rcvd: 60]
要请求有关失败的更多信息,可以通过为 dig 命令指定 +cd 选项来禁用 DNSSEC 检查:
~]$ dig +cd +dnssec badsign-a.test.dnssec-tools.org
; <<>> DiG 9.9.3-rl.156.01-P1-RedHat-9.9.3-3.P1.el7 <<>> +cd +dnssec badsign-a.test.dnssec-tools.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26065
;; flags: qr rd ra cd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;badsign-a.test.dnssec-tools.org. IN	A

;; ANSWER SECTION:
badsign-a.test.dnssec-tools.org. 49 IN	A	75.119.216.33
badsign-a.test.dnssec-tools.org. 49 IN	RRSIG	A 5 4 86400 20130919183720 20130820173720 19442 test.dnssec-tools.org. E572dLKMvYB4cgTRyAHIKKEvdOP7tockQb7hXFNZKVbfXbZJOIDREJrr zCgAfJ2hykfY0yJHAlnuQvM0s6xOnNBSvc2xLIybJdfTaN6kSR0YFdYZ n2NpPctn2kUBn5UR1BJRin3Gqy20LZlZx2KD7cZBtieMsU/IunyhCSc0 kYw=

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Aug 22 22:06:31 EDT 2013
;; MSG SIZE  rcvd: 257
通常,DNSSEC 错误地错误地认为清单本身是不良的,但在本示例中 ,www.dnssec-tools.org 的人已强制使用这个 RRSIG 签名,但我们无法手动查看此输出来检测。这个错误将显示在 systemctl status unbound 的输出中,unbound 守护进程会将这些错误记录到 syslog 中,如下所示:
Aug 22 22:04:52 laptop unbound: [3065:0] info: validation failure badsign-a.test.dnssec-tools.org. A IN
使用 unbound-host 的示例:
~]$ unbound-host -C /etc/unbound/unbound.conf -v whitehouse.gov
whitehouse.gov has address 184.25.196.110 (secure)
whitehouse.gov has IPv6 address 2600:1417:11:2:8800::fc4 (secure)
whitehouse.gov has IPv6 address 2600:1417:11:2:8000::fc4 (secure)
whitehouse.gov mail is handled by 105 mail1.eop.gov. (secure)
whitehouse.gov mail is handled by 110 mail5.eop.gov. (secure)
whitehouse.gov mail is handled by 105 mail4.eop.gov. (secure)
whitehouse.gov mail is handled by 110 mail6.eop.gov. (secure)
whitehouse.gov mail is handled by 105 mail2.eop.gov. (secure)
whitehouse.gov mail is handled by 105 mail3.eop.gov. (secure)

4.5.10. 为 Dnssec-trigger 设置 Hotspot 检测基础架构

当连接到网络时,dnssec-trigger 会尝试检测 Hotspot。Hotspot 通常是一个设备,它会强制用户与网页进行交互,然后才能使用网络资源。检测是通过尝试下载带有已知内容的特定固定网页来完成的。如果存在 Hotspot,则收到的内容不会如预期一样。
要设置一个固定的网页,其中包含 dnssec-trigger 可以用来检测 Hotspot 的已知内容,如下所示:
  1. 在某些计算机上设置 Web 服务器,可在 Internet 上公开访问。请参阅 Red Hat Enterprise Linux 7 系统管理员指南中的 Web 服务器 章节。
  2. 服务器运行后,使用已知内容发布静态页面。该页面不需要是有效的 HTML 页面。例如,您可以使用名为 hotspot.txt 的纯文本文件,该文件仅包含字符串 OK。假设您的服务器位于 example.com,并且您在 Web 服务器 document_root/static/ 子目录中发布您的 hotspot.txt 文件,那么静态 Web 页面的地址将是 example.com/static/hotspot.txt。请参阅 Red Hat Enterprise Linux 7 系统管理员指南中的 Web 服务器 一章中的 DocumentRoot 指令。
  3. 将以下行添加到 /etc/dnssec-trigger/dnssec-trigger.conf 文件中:
    url: "http://example.com/static/hotspot.txt OK"
    此命令添加使用 HTTP (端口 80)探测到的 URL。第一部分是将要解析的 URL 以及将要下载的页面。命令的第二部分是下载的网页应包含的文本字符串。
有关配置选项的详情,请查看 man page dnssec-trigger.conf (8)

4.5.11. 为连接分割域配置 DNSSEC 验证

默认情况下,对于任何连接提供的每个域的 dnssec-trigger 会自动添加带有正确名称服务器的区域,但通过 NetworkManager 提供的 Wi-Fi 连接除外。默认情况下,添加到 unbound 的所有转发区域都是 DNSSEC 验证的。
可以更改验证转发区域的默认行为,以便在默认情况下,所有转发区域 都不会被 DNSSEC 验证。为此,请更改 dnssec-trigger 配置文件 /etc/dnssec.conf 中的 validate_connection_provided_zones 变量。以 root 用户身份,打开并编辑行,如下所示:
validate_connection_provided_zones=no
不会对任何现有转发区进行更改,但只适用于将来的转发区。因此,如果您要为当前提供的域禁用 DNSSEC,则需要重新连接。

4.5.11.1. 为 Wi-Fi Supplied 域配置 DNSSEC 验证

可以为 Wi-Fi 提供的区添加转发区域。为此,请更改 dnssec-trigger 配置文件 /etc/dnssec.conf 中的 add_wifi_provided_zones 变量。以 root 用户身份,打开并编辑行,如下所示:
add_wifi_provided_zones=yes
不会对任何现有转发区进行更改,但只适用于将来的转发区。因此,如果要为当前的 Wi-Fi 提供的域启用 DNSSEC,则需要重新连接(重新启动) Wi-Fi 连接。
警告
将 Wi-Fi 提供的域作为转发区启用到 未绑定 可能会导致安全影响,例如:
  1. Wi-Fi 接入点可以有意通过 DHCP 为您提供域,其没有授权,并将所有 DNS 查询路由到其 DNS 服务器。
  2. 如果您的转发区的 DNSSEC 验证 关闭了,Wi-Fi 提供的 DNS 服务器可能会欺骗来自提供的域的域名的 IP 地址,而无需知道它。

4.5.12. 其它资源

以下是解释 DNSSEC 的更多资源。

4.5.12.1. 安装的文档

  • DNSSEC-trigger (8) 手册页 - 描述 dnssec-triggerddnssec-trigger-controldnssec-trigger-panel 的命令选项。
  • DNSSEC-trigger.conf (8) 手册页 - 描述 dnssec-triggerd 的配置选项。
  • unbound (8) 手册页 - 描述 unbound 的命令选项( DNS 验证解析器)。
  • unbound.conf (5) 手册页 - 包含如何配置 unbound 的信息。
  • resolv.conf (5) 手册页 - 包含解析器例程读取的信息。

4.5.12.2. 在线文档

http://tools.ietf.org/html/rfc4033
RFC 4033 DNS 安全简介和要求.
http://www.dnssec.net/
包含指向许多 DNSSEC 资源的网站。
http://www.dnssec-deployment.org/
DNSSEC 部署计划由部为家庭安全赞助,包含很多 DNSSEC 信息,并有用于讨论 DNSSEC 部署问题的邮件列表。
http://www.internetsociety.org/deploy360/dnssec/community/
互联网 Society 的 Deploy 360 计划与协调 DNSSEC 部署是全球寻找社区和 DNSSEC 活动的良好资源。
http://www.unbound.net/
本文档包含有关 unbound DNS 服务的通用信息。
http://www.nlnetlabs.nl/projects/dnssec-trigger/
本文档包含有关 dnssec-trigger 的一般信息。