You need to enable JavaScript to run this app.
导航

开启 DNSSEC

最近更新时间2024.04.09 16:13:53

首次发布时间2024.03.14 21:08:15

本文档介绍如何为您的域名开启 DNSSEC(DNS Security Extension)。
作为 DNS 的扩展协议,DNSSEC 为 DNS 数据的来源和完整性提供了鉴权机制,可以验证 DNS 响应是否来自权威 DNS 服务器,从而避免 DNS 缓存投毒(DNS cache poisoning)等攻击。参见 DNSSEC 了解更多信息。

DNSSEC 如何对 DNS 响应鉴权

DNSSEC 引入了以下记录类型:

  • RRSIG:包含一个数字签名,可以是 ZSK(Zone Signing Keys)私钥对 Zone 中的 RRSet 生成的数字签名,也可以是 KSK(Key Signing Keys) 私钥对 DNSKEY 记录的 RRSet 生成的数字签名。
  • DNSKEY:包含一个公钥,可以是 ZSK 公钥或 KSK 公钥。
  • DS(Delegation Signer):包含 DNSKEY 记录中的 KSK 公钥的哈希值。
  • NSEC and NSEC3: 用于证明所请求的解析记录不存在(Explicit Denial of Existence)。
  • CDNSKEY and CDS:用于当前 Zone 向父 Zone 请求更新 DS 记录。

递归 DNS 服务器发送 DNS 查询请求时,DNNSEC 验证过程如下:

  1. 递归 DNS 服务器获取当前 Zone 的权威 DNS 服务器地址时,也会从父 Zone 处获取 DS 记录。该 DS 记录证明当前 Zone 开启了 DNSSEC。递归 DNS 服务器会计算当前 Zone 的 KSK 公钥的哈希值,并与 DS 记录所包含的哈希值比较。如果两个哈希值相同,那么递归 DNS 服务器可以认为 KSK 公钥是有效的。
  2. 递归 DNS 服务器向权威 DNS 服务器请求解析记录(例如 A 记录),DNS 服务器会在返回解析记录的同时,返回由解析记录的 RRSet 生成的 RRSIG 记录。同时,递归 DNS 服务器向权威 DNS 服务器请求包含 ZSK 公钥的 DNSKEY 记录、包含 KSK 公钥的 DNSKEY 记录,及由 DNSKEY 记录的 RRSet 生成的 RRSIG 记录。
  3. 递归 DNS 服务器使用 ZSK 公钥验证由所请求的解析记录的 RRSet 生成的 RRSIG 记录;使用 KSK 公钥验证由 DNSKEY 记录的 RRSet 生成的 RRSIG 记录。

前提条件

您的域名必须同时满足以下条件才能开启 DNSSEC。

  • 您的域名的功能版本是企业版、旗舰版或尊享版。

    警告

    如果您的域名开启了 DNSSEC,且该域名的付费版本实例到期时没有及时续费,您的域名解析会失败。如果你计划不再为您的域名的付费版本实例续费,您需要在域名注册服务商处删除 DS 记录,然后在云解析 DNS 中关闭 DNSSEC。

  • 您的域名注册服务商必须支持 DNSSEC。

说明

如果您的域名开启了 DNSSEC,但用户的 Local DNS 服务器不支持 DNSSEC,域名可能无法被正常解析。

操作步骤

步骤一:在云解析 DNS 中开启 DNSSEC

说明

如果您的域名下有域名前缀为 @ 的 CNAME 解析记录,则您的域名无法开启 DNSSEC。如果您的域名开启了 DNSSEC,您也无法添加域名前缀为 @ 的 CNAME 解析记录。

参见以下步骤在云解析 DNS 中为您的域名开启 DNSSEC。

  1. 打开 云解析 DNS 控制台
  2. 公网域名管理 页面的 域名 列,点击您的域名。
  3. 选择 DNS安全 标签页,在 DNSSEC 部分点击 开启DNSSEC
  4. 开启后,云解析 DNS 会对该域的 DNS 数据进行签名,并在 DNSSEC 部分显示在域名注册服务商处添加 DS 记录所需的信息。

参数

描述

DS记录 DS Record

DS(Delegation Signer)记录。该记录包含 DNSKEY 记录中的 KSK 公钥的哈希值。

密钥标签 Key Tag

Key Tag 是一个 16 bit 的数字,用于从 DNSKEY 记录的 RRSet 中标识一条 DNSKEY 记录。该参数标识了包含 KSK 公钥的 DNSKEY 记录。

加密算法 Algorithm

计算 KSK 公钥的哈希值所使用的算法。

摘要类型 Digest Type

KSK 公钥的哈希值的类型。

摘要 Digest

KSK 公钥的哈希值。

公钥 Public Key

KSK 公钥。

公钥类型 Flags

公钥的类型。该参数为 257(KSK)。

步骤二:在您的域名注册服务商处添加 DS 记录

参见域名注册服务商的产品文档,使用从步骤一获得的信息为您的域名添加 DS 记录。

步骤三:验证 DNSSEC

添加 DS 记录后,您可以验证 DNSSEC 是否生效。

使用 DNSViz 验证 DNSSEC

DNSViz 是一个在线、开源的 DNS 分析工具。下面的步骤以 DNSViz 为例,介绍如何验证 DNSSEC 是否已经对您的域名生效。

  1. 打开 DNSViz
  2. 输入您需要验证的域名,例如 example.com,然后点击 Go>>
  3. 如果该域名没有被分析过,点击 Analyze 分析域名。分析完成后,点击 Continue
  4. 您会被跳转到验证页面。等待一段时间,您可以看到域名的 DNSSEC 信任链。
  5. 检查 DNSSEC 信任链是否有错误或警告标志:
    • 如果每级域都有 DNSKEY,箭头均为蓝色,且没有错误或警告标志,即 RRset status、DNSKEY/DS/NSEC status、Delegation status 都是 SECURE,则说明 DNSSEC 已经对您的域名生效。下图以 example.com 为例展示了有效的 DNSSEC。
      图片
    • 如果出现了黑色箭头、红色箭头或错误标志,则说明 DNSSEC 未生效。您可以把鼠标移动到相应位置上查看错误或警告信息。并根据错误或警告信息排查问题。下图以 brokendnssec.net 为例展示了因权威 DNS 服务器缺少 DNSKEY 记录导致其无法匹配顶级域 DNS 服务器的 DS 记录,从而造成信任链中断。
      图片

使用 dig 验证 DNSSEC

您可以使用 dig +dnssec 命令验证 DNSSEC。

$ dig +dnssec www.example.com

;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59330
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 512
;; QUESTION SECTION:
;www.example.com.      IN   A

;; ANSWER SECTION:
www.example.com.   19439   IN   A   93.184.216.34
www.example.com.   19439   IN   RRSIG   A 13 3 86400 20240207154702 20240117103421 60960 example.com. nZz4JmYshN2qjQtcgt5Lfh9AXE04X7jp3p/ORq5j7m8JWEqtuqlEOzr7 W4DOBmrPg7NFiP7Ij+t3+YxtgW89iQ==

如果 DNS 响应中包含 RRSIG 记录,则说明 DNS 响应经过 DNSSEC 验证。另外,返回信息中的 ad flag 也说明 DNS 响应是经过 DNSSEC 验证的。

说明

如果 dig +dnssec 命令没有返回 RRSIG 记录,也可能是因为您使用的递归 DNS 服务器(公共 DNS 服务器或 Local DNS 服务器)不支持 DNSSEC。你可以使用一个支持 DNSSEC 的公共 DNS 服务器进行验证,例如 1.1.1.18.8.8.8

$ dig +dnssec www.example.com @1.1.1.1

您可以使用 dig DNSKEY 命令获取 example.com 的 DNSKEY 记录:

$ dig DNSKEY example.com +short

256 3 13 joM9sPIlr483WIEP5ra1SdYGDRemvZgXUZ3HSZs9EK8GTYti4eTuGkrT L/4NBJOW/9TxpJ9MfrBA0H21hkxvlg==
257 3 13 kXKkvWU3vGYfTJGl3qBd4qhiWp5aRs7YtkCJxD2d+t7KXqwahww5IgJt xJT2yFItlggazyfXqJEVOmMJ3qT0tQ==
256 3 13 PSaUY8snD++LwIab0JNMP9zyx2whZOhc3kciM2XOR4gk09wr4uDxWwr3 Zzq84rk30l8fwxI/94QWRIgwZFNaFw==

其中,256 代表公钥类型是 ZSK;257 代表公钥类型是 KSK。
您可以通过 dig DS 命令获取 example.com 在域名注册服务商处添加的 DS 记录。

$ dig DS example.com

;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19632
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;example.com.         IN   DS

;; ANSWER SECTION:
example.com.      86400   IN   DS   370 13 2 BE74359954660069D5C63D200C39F5603827D7DD02B56F120EE9F3A8 6764247C

;; Query time: 459 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Thu Jan 18 16:28:57 CST 2024
;; MSG SIZE  rcvd: 88