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,可以使用 BIND 或
unbound
。两者都默认启用 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 (
UDP
和TCP
)可用,它将告知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 支持它。这意味着
unbound
、dnssec-trigger 和 NetworkManager 的组合可以正确支持 VPN 软件提供的域和名称服务器。VPN 隧道启动后,会为接收的域名的所有条目清除本地 unbound
缓存,以便从使用 VPN 访问的内部名称服务器获取对域名中的名称的查询。当 VPN 隧道终止时,不会再次清除 unbound
缓存,以确保对域的任何查询都将返回公共 IP 地址,而不是之前获取的专用 IP 地址。请参阅 第 4.5.11 节 “为连接分割域配置 DNSSEC 验证”。
4.5.5. 推荐的命名实践
红帽建议静态名称和临时名称与
DNS
中用于机器 的完全限定域名 (FQDN)匹配,如 host.example.com
。
分配名称和编号(ICANN)的互联网公司有时会将之前未注册的顶级域(如
.yourcompany
)添加到公共寄存器中。因此,红帽强烈建议您不要使用没有委托给您的域名,即使在专用网络上,这可能会导致根据网络配置的不同解析域名。因此,网络资源可能会不可用。使用未委托给您的域名也使得 DNSSEC 更难以部署和维护,因为域名冲突需要手动配置来启用 DNSSEC 验证。有关此问题的更多信息,请参阅有关域名冲突的 ICANN 常见问题解答。
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 区域提供帮助。NetworkManager、dhclient 和 VPN 应用程序通常会自动收集域列表(以及名称服务器列表),但不能自动收集 dnssec-trigger 或 unbound。
要安装
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 签名。
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 面板中的 时,这已更改。DNS
服务器从 NetworkManager 查询并放入 resolv.conf
中。现在,您可以在 Hotspot 的登录页面上进行身份验证。anchor 图标显示一个大的红色感叹号,警告您以不安全的方式进行 DNS
查询。经过身份验证后,dnssec-trigger 应该自动检测此模式并切回到安全模式,但在某些情况下,用户必须选择 Reprobe 来手动执行此操作。
DNSSEC-trigger 通常不需要任何用户交互。启动后,它在后台工作,如果遇到了一个问题,则通过弹出文本框中通知用户。它还告知
unbound
对 resolv.conf
文件的更改。
4.5.9. 使用带有 DNSSEC 的 dig
要查看 DNSSEC 是否正常工作,可以使用各种命令行工具。使用的最佳工具是 bind-utils 软件包中的 dig 命令。其他有用的工具可从 ldns 软件包和 unbound 软件包中的 unbound-host 深入了解。旧的
DNS
工具 nslookup 和 host 已被弃用,不应使用。
要使用 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 的已知内容,如下所示:
- 在某些计算机上设置 Web 服务器,可在 Internet 上公开访问。请参阅 Red Hat Enterprise Linux 7 系统管理员指南中的 Web 服务器 章节。
- 服务器运行后,使用已知内容发布静态页面。该页面不需要是有效的 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 指令。 - 将以下行添加到
/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 提供的域作为转发区启用到
未绑定
可能会导致安全影响,例如:
- Wi-Fi 接入点可以有意通过
DHCP
为您提供域,其没有授权,并将所有DNS
查询路由到其DNS
服务器。 - 如果您的转发区的 DNSSEC 验证 关闭了,Wi-Fi 提供的
DNS
服务器可能会欺骗来自提供的域的域名的IP
地址,而无需知道它。
4.5.12. 其它资源
以下是解释 DNSSEC 的更多资源。
4.5.12.1. 安装的文档
DNSSEC-trigger (8)
手册页 - 描述dnssec-triggerd
、dnssec-trigger-control 和 dnssec-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 的一般信息。