你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
DNSSEC 概述(预览版)
本文概述了域名系统安全扩展 (DNSSEC),并介绍了 DNSSEC 术语。 文中介绍了 DNSSEC 区域签名的优势,并提供了用于查看 DNSSEC 相关资源记录的示例。 准备好对 Azure 公共 DNS 区域进行签名时,请参阅以下操作说明指南:
注意
DNSSEC 区域签名功能目前处于预览阶段。
有关 beta 版本、预览版或尚未正式发布的版本的 Azure 功能所适用的法律条款,请参阅 Microsoft Azure 预览版的补充使用条款。
什么是 DNSSEC?
DNSSEC 是一套扩展,通过允许验证 DNS 响应的真实性来增加域名系统 (DNS) 协议的安全性。 DNSSEC 提供源颁发机构、数据完整性以及已验证的否认存在。 借助 DNSSEC,可以大大减少 DNS 协议受到的特定类型的攻击,尤其是 DNS 欺骗攻击。
核心 DNSSEC 扩展在以下征求意见文档 (RFC) 中指定:
有关 DNSSEC RFC 的摘要,请参阅 RFC9364:DNS 安全扩展 (DNSSEC)。
DNSSEC 的工作原理
DNS 区域使用称为区域签名的进程,通过 DNSSEC 进行保护。 使用 DNSSEC 对区域进行签名可增强验证支持,而不会更改 DNS 查询和响应的基本机制。 若要使用 DNSSEC 对区域进行签名,该区域的主要权威 DNS 服务器必须支持 DNSSEC。
资源记录签名 (RRSIG) 和其他加密记录在为区域签名时添加到该区域。 下图显示进行区域签名之前和之后的区域 contoso.com 中的 DNS 资源记录。
对 DNS 响应的 DNSSEC 验证是通过使用这些数字签名和完整的信任链进行的。
注意
与 DNSSEC 相关的资源记录不会显示在 Azure 门户中。 有关详细信息,请参阅查看 DNSSEC 相关资源的记录。
为什么要使用 DNSSEC 对区域进行签名?
使用 DNSSEC 对区域进行签名是遵守某些安全准则(例如 SC-20:安全名称/地址解析服务)的必要条件。
对 DNS 响应的 DNSSEC 验证可以防止常见类型的 DNS 劫持攻击(也称为 DNS 重定向)。 当客户端设备使用不正确(仿冒)的 DNS 响应重定向到恶意服务器时,就会发生 DNS 劫持。 DNS 缓存中毒是一种用于仿冒 DNS 响应的常用方法。
下图显示了 DNS 劫持工作原理的示例。
常规 DNS 解析:
- 客户端设备向 DNS 服务器发送针对 contoso.com 的 DNS 查询。
- DNS 服务器使用针对 contoso.com 的 DNS 资源记录进行响应。
- 客户端设备请求来自 contoso.com 的响应。
- contoso.com 应用或 Web 服务器向客户端返回响应。
DNS 劫持
- 客户端设备向被劫持的 DNS 服务器发送针对 contoso.com 的 DNS 查询。
- DNS 服务器以无效(仿冒)的 contoso.com DNS 资源记录进行响应。
- 客户端设备从恶意服务器请求针对 contoso.com 的响应。
- 恶意服务器向客户端返回仿冒响应。
被仿冒的 DNS 资源记录类型取决于 DNS 劫持攻击的类型。 MX 记录可能被仿冒以重定向客户端电子邮件,或者,仿冒的 A 记录可能将客户端发送到恶意 Web 服务器。
DNSSEC 通过对 DNS 响应执行验证来防止 DNS 劫持。 在此处所示的 DNS 劫持场景中,如果 contoso.com 域使用 DNSSEC 签名,则客户端设备可以拒绝未经验证的 DNS 响应。 若要拒绝未经验证的 DNS 响应,客户端设备必须对 contoso.com 强制执行 DNSSEC 验证。
DNSSEC 还包括 Next Secure 3 (NSEC3) 以防止区域枚举。 区域枚举(也称为区域行走)是一种攻击,攻击者通过该攻击建立区域中所有名称的列表,包括子区域。
在使用 DNSSEC 签署区域之前,请务必了解 DNSSEC 的工作原理。 准备好签署区域时,请参阅如何使用 DNSSEC 签署 Azure 公共 DNS 区域。
DNSSEC 验证
如果 DNS 服务器支持 DNSSEC,它可以将 DNS 查询中的 DNSSEC OK (DO) 标志设置为值 1
。 此值将告知响应 DNS 服务器,响应中包含与 DNSSEC 相关的资源记录。 这些 DNSSEC 记录是资源记录签名 (RRSIG) 记录,用于验证 DNS 响应是否真实。
递归(非权威)DNS 服务器使用信任锚 (DNSKEY) 对 RRSIG 记录执行 DNSSEC 验证。 服务器使用 DNSKEY 解密 RRSIG 记录(以及其他与 DNSSEC 相关的记录)中的数字签名,然后计算并比较哈希值。 如果哈希值相同,它会向 DNS 客户端提供回复,其中包含其请求的 DNS 数据,例如主机地址 (A) 记录。 参阅下图:
如果哈希值不相同,则递归 DNS 服务器将回复 SERVFAIL 消息。 这样,安装了有效信任锚点且支持 DNSSEC 的解析(或转发)DNS 服务器可以防止递归服务器和权威服务器之间的路径中发生 DNS 劫持。 此保护不需要 DNS 客户端设备支持 DNSSEC 或强制执行 DNS 响应验证,前提是本地(最后一跳)递归 DNS 服务器本身可以防止劫持。
Windows 10 和 Windows 11 客户端设备是非验证安全感知存根解析程序。 这些客户端设备不执行验证,但可以使用组策略强制执行 DNSSEC 验证。 NRPT 可用于创建和强制执行基于命名空间的 DNSSEC 验证策略。
信任锚和 DNSSEC 验证
注意
DNSSEC 响应验证不是由默认的 Azure 提供的解析程序执行的。 如果你要设置自己的递归 DNS 服务器以进行 DNSSEC 验证或解决验证问题,本节中的信息将很有帮助。
信任锚基于 DNS 命名空间层次结构运行。 递归 DNS 服务器可以有任意数量的信任锚,也可以没有信任锚。 可以为单个子 DNS 区域或任何父区域添加信任锚。 如果递归 DNS 服务器具有根 (.) 信任锚,则可以对任何 DNS 区域执行 DNSSEC 验证。 有关更多信息,请参阅根区域运营商信息。
使用信任锚进行 DNSSEC 验证的过程如下:
- 如果递归 DNS 服务器没有区域或区域的父分层命名空间的 DNSSEC 信任锚,则不会对该区域执行 DNSSEC 验证。
- 如果递归 DNS 服务器具有区域父命名空间的 DNSSEC 信任锚,并且收到子区域的查询,则会检查父区域中是否存在子区域的 DS 记录。
- 如果找到 DS 记录,则递归 DNS 服务器将执行 DNSSEC 验证。
- 如果递归 DNS 服务器确定父区域没有子区域的 DS 记录,它会假定子区域不安全并且不会执行 DNSSEC 验证。
- 如果 DNS 响应涉及多个递归 DNS 服务器(包括转发器),则每个服务器都必须能够对响应执行 DNSSEC 验证,以便有一个完整的信任链。
- 已禁用 DNSSEC 验证或不支持 DNSSEC 的递归服务器不会执行验证。
信任链
当所有参与发送 DNS 查询响应的 DNS 服务器都能够验证响应在传输过程中未被修改时,就会出现信任链。 为了使 DNSSEC 验证能够端到端地工作,信任链必须是完整的。 此信任链适用于权威和非权威(递归)服务器。
权威服务器
权威 DNS 服务器通过使用委派签名者 (DS) 记录来维护信任链。 DS 记录用于验证 DNS 层次结构中子区域的真实性。
- 若要在已签名区域上进行 DNSSEC 验证,还必须对已签名区域的父区域进行签名。 父区域还必须具有子区域的 DS 记录。
- 在验证过程中,将查询区域的父区域以获取 DS 记录。 如果 DS 记录不存在,或者父区域中的 DS 记录数据与子区域中的 DNSKEY 数据不匹配,则信任链会中断,验证会失败。
递归服务器
递归 DNS 服务器(也称为解析或高速缓存 DNS 服务器)通过使用 DNSSEC 信任锚来维护信任链。
- 信任锚是 DNSKEY 记录或包含 DNSKEY 记录哈希的 DS 记录。 如果区域已签名时,则会在会在权威服务器上创建 DNSKEY 记录,如果区域未签名,则会从区域中删除该记录。
- 必须在递归 DNS 服务器上手动安装信任锚。
- 如果存在父区域的信任锚,则递归服务器可以验证分层命名空间中的所有子区域。 这包括转发的查询。 若要支持对所有 DNSSEC 签名的 DNS 区域的 DNSSEC 验证,可以为根 (.) 区域安装信任锚。
密钥滚动更新
Azure 会定期自动轮换(替换)DNSSEC 签名区域中的区域签名密钥 (ZSK)。 无需替换密钥签名密钥 (KSK),但可以通过联系 Microsoft 支持来选择此选项。 替换 KSK 需要同时更新父区域中的 DS 记录。
区域签名算法
区域使用椭圆曲线数字签名算法 (ECDSAP256SHA256) 进行 DNSSEC 签名。
DNSSEC 相关资源记录
下表简要介绍了 DNSSEC 相关记录。 有关更多详细信息,请参阅 RFC 4034:DNS 安全扩展的资源记录和 RFC 7344:自动执行 DNSSEC 委派信任维护。
记录 | 说明 |
---|---|
资源记录签名 (RRSIG) | 用于保存签名的 DNSSEC 资源记录类型,该签名涵盖特定名称和类型的一组 DNS 记录。 |
DNSKEY | 用于存储公钥的 DNSSEC 资源记录类型。 |
委派签名者 (DS) | 用于保护委派的 DNSSEC 资源记录类型。 |
下一代安全 (NSEC) | 用于证明 DNS 名称不存在的 DNSSEC 资源记录类型。 |
下一代安全 3 (NSEC3) | 为 DNS 资源记录集提供经过哈希处理的、已验证的否认存在的 NSEC3 资源记录。 |
下一代安全 3 参数 (NSEC3PARAM) | 指定 NSEC3 记录的参数。 |
子委派签名者 (CDS) | 此记录是可选的。 如果存在 CDS 记录,则子区域可以使用它来指定父区域中 DS 记录的所需内容。 |
子 DNSKEY (CDNSKEY) | 此记录是可选的。 如果子区域中存在 CDNSKEY 记录,则可以使用它从 DNSKEY 记录生成 DS 记录。 |
查看 DNSSEC 相关资源记录
DNSSEC 相关记录不会显示在 Azure 门户中。 若要查看 DNSSEC 相关记录,请使用 Resolve-DnsName 或 dig.exe 等命令行工具。 这些工具可通过 Cloud Shell 获得,如果已将其安装在设备上,也可以在本地获得。 请务必使用 Resolve-DnsName 中的 -dnssecok
选项或 dig.exe 中的 +dnssec
选项在查询中设置 DO 标志。
重要
不要使用 nslookup.exe 命令行工具来查询与 DNSSEC 相关的记录。 nslookup.exe 工具使用不支持 DNSSEC 的内部 DNS 客户端。
请看以下示例:
PS C:\> resolve-dnsname server1.contoso.com -dnssecok
Name Type TTL Section IPAddress
---- ---- --- ------- ---------
server1.contoso.com A 3600 Answer 203.0.113.1
Name : server1.contoso.com
QueryType : RRSIG
TTL : 3600
Section : Answer
TypeCovered : A
Algorithm : 13
LabelCount : 3
OriginalTtl : 3600
Expiration : 9/20/2024 11:25:54 PM
Signed : 9/18/2024 9:25:54 PM
Signer : contoso.com
Signature : {193, 20, 122, 196…}
C:\>dig server1.contoso.com +dnssec
; <<>> DiG 9.9.2-P1 <<>> server1.contoso.com +dnssec
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61065
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 512
;; QUESTION SECTION:
;server1.contoso.com. IN A
;; ANSWER SECTION:
server1.contoso.com. 3600 IN A 203.0.113.1
server1.contoso.com. 3600 IN RRSIG A 13 3 3600 20240920232359 20240918212359 11530 contoso.com. GmxeQhNk1nJZiep7nuCS2qmOQ+Ffs78Z2eoOgIYP3j417yqwS1DasfA5 e1UZ4HuujDk2G6GIbs0ji3RiM9ZpGQ==
;; Query time: 153 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Thu Sep 19 15:23:45 2024
;; MSG SIZE rcvd: 179
PS C:\> resolve-dnsname contoso.com -Type dnskey -dnssecok
Name Type TTL Section Flags Protocol Algorithm Key
---- ---- --- ------- ----- -------- --------- ---
contoso.com DNSKEY 3600 Answer 256 DNSSEC 13 {115, 117, 214,
165…}
contoso.com DNSKEY 3600 Answer 256 DNSSEC 13 {149, 166, 55, 78…}
contoso.com DNSKEY 3600 Answer 257 DNSSEC 13 {45, 176, 217, 2…}
Name : contoso.com
QueryType : RRSIG
TTL : 3600
Section : Answer
TypeCovered : DNSKEY
Algorithm : 13
LabelCount : 2
OriginalTtl : 3600
Expiration : 11/17/2024 9:00:15 PM
Signed : 9/18/2024 9:00:15 PM
Signer : contoso.com
Signature : {241, 147, 134, 121…}
C:\>dig contoso.com dnskey
; <<>> DiG 9.9.2-P1 <<>> contoso.com dnskey
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46254
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;contoso.com. IN DNSKEY
;; ANSWER SECTION:
contoso.com. 3600 IN DNSKEY 256 3 13 laY3Toc/VTyjupgp/+WgD05N+euB6Qe1iaM/253k7bkaA0Dx+gSDhbH2 5wXTt+uLQgPljL9OusKTneLdhU+1iA==
contoso.com. 3600 IN DNSKEY 257 3 13 LbDZAtjG8E9Ftih+LC8CqQrSZIJFFJMtP6hmN3qBRqLbtAj4JWtr2cVE ufXM5Pd/yW+Ca36augQDucd5n4SgTg==
contoso.com. 3600 IN DNSKEY 256 3 13 c3XWpTqZ0q9IO+YqMEtOBHZSzGGeyFKq0+3xzs6tifvD1rey1Obhrkz4 DJlEIxy2m84VsG1Ij9VYdtGxxeVHIQ==
;; Query time: 182 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Thu Sep 19 16:35:10 2024
;; MSG SIZE rcvd: 284
DNSSEC 术语
此列表旨在帮助你理解讨论 DNSSEC 时使用的一些常用术语。 另请参阅:DNSSEC 相关资源记录
术语 | 说明 |
---|---|
经过身份验证的数据 (AD) 位 | 在响应中表示响应的答案和授权部分中包含的所有数据已根据该服务器的策略由 DNS 服务器进行身份验证的数据位。 |
身份验证链 | 经过签名和验证的 DNS 记录链,从预配置的信任锚延伸到 DNS 树中的某个子区域。 |
DNS 扩展 (EDNS0) | 包含扩展 DNS 标头信息的 DNS 记录,例如 DO 位和最大 UDP 数据包大小。 |
DNS 安全扩展 (DNSSEC) | DNS 服务的扩展,提供签名和安全解析 DNS 数据的机制。 |
DNSSEC OK (DO) 位 | DNS 请求的 EDNS0 部分中的一个位,表示客户端支持 DNSSEC。 |
DNSSEC 验证 | DNSSEC 验证是使用公共加密密钥验证 DNS 数据的来源和完整性的过程。 |
安全岛 | 没有来自其委派父区域的身份验证链的签名区域。 |
密钥签名密钥 (KSK) | 与用于为给定区域签名一个或多个其他签名密钥的私钥相对应的身份验证密钥。 通常,与 KSK 相对应的私钥会为区域签名密钥 (ZSK) 签名,而区域签名密钥又具有为其他区域数据签名的对应私钥。 本地策略可能要求频繁更改 ZSK,而 KSK 可以具有更长的有效期,以便提供更稳定、更安全的区域入口点。 将身份验证密钥指定为 KSK 纯粹是操作问题:DNSSEC 验证不会区分 KSK 和其他 DNSSEC 身份验证密钥。 可以将单个密钥同时用作 KSK 和 ZSK。 |
非验证安全感知存根解析程序 | 一个安全感知存根解析程序,信任一个或多个安全感知 DNS 服务器代表其执行 DNSSEC 验证。 |
安全入口点 (SEP) 密钥 | DNSKEY RRSet 中的公钥子集。 SEP 密钥用于生成 DS RR,或分发给使用该密钥作为信任锚的解析程序。 |
安全感知 DNS 服务器 | 实现 RFC 4033 [5]、4034 [6] 和 4035 [7] 中定义的 DNS 安全扩展的 DNS 服务器。 具体而言,安全感知 DNS 服务器是接收 DNS 查询、发送 DNS 响应、支持 EDNS0 [3] 消息大小扩展和 DO 位以及支持 DNSSEC 记录类型和消息头位的实体。 |
已签名区域 | 按照 RFC 4035 [7] 第 2 节的定义,对记录进行签名的区域。 已签名区域可以包含 DNSKEY、NSEC、NSEC3、NSEC3PARAM、RRSIG 和 DS 资源记录。 这些资源记录使解析程序能够验证 DNS 数据。 |
信任锚 | 与特定区域关联的预配置公钥。 信任锚使 DNS 解析器能够验证该区域的已签名 DNSSEC 资源记录并构建到子区域的身份验证链。 |
未签名区域 | 未按照 RFC 4035 [7] 第 2 节的定义签名的任何 DNS 区域。 |
区域签名 | 区域签名是创建 DNSSEC 相关资源记录并向区域添加该记录,使其与 DNSSEC 验证兼容的过程。 |
为区域取消签名 | 取消区域签名是从区域中移除 DNSSEC 相关的资源记录,从而将其恢复为未签名状态的过程。 |
区域签名密钥 (ZSK) | 与用于对区域进行签名的私钥相对应的身份验证密钥。 通常,区域签名密钥与密钥签名密钥(其对应的私钥签名此 DNSKEY RRSet)属于同一 DNSKEY RRSet,但区域签名密钥的用途略有不同,并且可能在其他方面与密钥签名密钥不同,例如有效期。 将身份验证密钥指定为区域签名密钥纯粹是一个操作问题;DNSSEC 验证不会区分区域签名密钥和其他 DNSSEC 身份验证密钥。 可以将单个密钥同时用作密钥签名密钥和区域签名密钥。 |
后续步骤
- 了解如何使用 DNSSEC 对 DNS 区域进行签名。
- 了解如何为 DNS 区域取消签名。
- 了解如何在 Azure DNS 中为 ISP 分配的 IP 范围托管反向查找区域。
- 了解如何管理 Azure 服务的反向 DNS 记录。