2. 区域签名 (Zone Signing)
DNSSEC 引入已签名区域 (signed zone) 的概念. 已签名区域分别按照第 2.1, 2.2, 2.3 和 2.4 节规定的规则包含 DNS 公钥 (DNSKEY), 资源记录签名 (RRSIG), 下一安全记录 (NSEC), 以及可选的委派签名者 (DS) 记录. 未按照本节规则包含这些记录的区域是未签名区域 (unsigned zone).
DNSSEC 要求修改 CNAME 资源记录的定义 ([RFC1035]). 第 2.5 节修改 CNAME RR, 允许 RRSIG 和 NSEC RR 与 CNAME RR 出现在同一个所有者名称处.
DNSSEC 规定了两个新 RR 类型 NSEC 和 DS 的放置位置, 它们可以位于区域切分 (zone cut) 的父侧, 即委派点. 这是对通常禁止在区域切分处把数据放入父区域这一规则的例外. 第 2.6 节描述此变更.
2.1. 在区域中包含 DNSKEY RR (Including DNSKEY RRs in a Zone)
为了对区域签名, 区域管理员生成一个或多个公钥/私钥对, 并使用私钥对区域中的权威 RRset 签名. 对于区域中用于创建 RRSIG RR 的每个私钥, 该区域 SHOULD 包含一个区域 DNSKEY RR, 其中保存对应的公钥. 区域密钥 DNSKEY RR 的 flags RDATA 字段中的 Zone Key 位 MUST 置位 (参见 [RFC4034] 第 2.1.1 节). 与其他 DNS 操作关联的公钥 MAY 存储在未标记为区域密钥的 DNSKEY RR 中, 但 MUST NOT 用于验证 RRSIG.
如果区域管理员希望已签名区域不只是作为安全孤岛使用, 则区域顶点 MUST 包含至少一个 DNSKEY RR, 作为进入该区域的安全入口点. 随后, 该安全入口点可以通过父区域中对应的 DS RR 用作安全委派的目标 (参见 [RFC4034]).
2.2. 在区域中包含 RRSIG RR (Including RRSIG RRs in a Zone)
对于已签名区域中的每个权威 RRset, MUST 至少存在一条满足以下要求的 RRSIG 记录:
- RRSIG 所有者名称等于 RRset 所有者名称.
- RRSIG 类等于 RRset 类.
- RRSIG Type Covered 字段等于 RRset 类型.
- RRSIG Original TTL 字段等于 RRset 的 TTL.
- RRSIG RR 的 TTL 等于 RRset 的 TTL.
- RRSIG Labels 字段等于 RRset 所有者名称中的标签数, 不计空根标签, 如果是通配符也不计最左侧标签.
- RRSIG Signer's Name 字段等于包含该 RRset 的区域名称.
- RRSIG Algorithm, Signer's Name 和 Key Tag 字段标识区域顶点处的一条区域密钥 DNSKEY 记录.
为给定 RRset 构造 RRSIG RR 的过程见 [RFC4034]. 一个 RRset MAY 关联多个 RRSIG RR. 注意, RRSIG RR 与其所包含签名对应的 RRset 紧密绑定, 因此与所有其他 DNS RR 类型不同, RRSIG RR 不形成 RRset. 特别是, 具有共同所有者名称的 RRSIG RR 之间的 TTL 值不遵循 [RFC2181] 中描述的 RRset 规则.
RRSIG RR 本身 MUST NOT 被签名, 因为对 RRSIG RR 签名不会增加价值, 还会在签名过程中产生无限循环.
出现在区域顶点名称处的 NS RRset MUST 被签名, 但出现在委派点的 NS RRset (即父区域中把名称委派给子区域名称服务器的 NS RRset) MUST NOT 被签名. 与委派关联的粘合地址 RRset MUST NOT 被签名.
对于每个 RRset, MUST 使用区域顶点 DNSKEY RRset 中每种算法的至少一个 DNSKEY 生成对应的 RRSIG. 顶点 DNSKEY RRset 本身 MUST 由委派父区域中的 DS RRset (如果存在) 所列的每种算法签名.
2.3. 在区域中包含 NSEC RR (Including NSEC RRs in a Zone)
区域中每个具有权威数据或委派点 NS RRset 的所有者名称 MUST 具有一条 NSEC 资源记录. NSEC RR 的格式以及为给定名称构造 NSEC RR 的过程见 [RFC4034].
任何 NSEC RR 的 TTL 值 SHOULD 与区域 SOA RR 中的 minimum TTL value 字段相同.
NSEC 记录 (及其关联的 RRSIG RRset) MUST NOT 是任何特定所有者名称处唯一的 RRset. 也就是说, 签名过程 MUST NOT 为区域签名前不是任何 RRset 所有者名称的所有者名称节点创建 NSEC 或 RRSIG RR. 这样做的主要原因是希望同一区域的已签名版本和未签名版本之间保持命名空间一致性, 并降低非安全感知递归名称服务器中响应不一致的风险.
已签名区域中每条 NSEC 资源记录的类型位图 MUST 表明 NSEC 记录本身及其对应的 RRSIG 记录均存在.
2.4. 在区域中包含 DS RR (Including DS RRs in a Zone)
DS 资源记录在 DNS 区域之间建立认证链. 当子区域已签名时, 委派点处 SHOULD 存在 DS RRset. DS RRset MAY 包含多条记录, 每条记录引用子区域中用于验证该区域 RRSIG 的一个公钥. 区域中的所有 DS RRset MUST 被签名, 并且 DS RRset MUST NOT 出现在区域顶点.
DS RR SHOULD 指向存在于子区域顶点 DNSKEY RRset 中的 DNSKEY RR, 并且子区域顶点 DNSKEY RRset SHOULD 由对应的私钥签名.
DS RRset 的 TTL SHOULD 与进行委派的 NS RRset 的 TTL 匹配.
2.5. 对 CNAME 资源记录的变更 (Changes to the CNAME Resource Record)
如果已签名区域中的某个名称处存在 CNAME RRset, 则该名称处 REQUIRED 存在适当的 RRSIG 和 NSEC RRset. 该名称处也允许存在用于安全动态更新的 KEY RRset ([RFC3007]). 其他类型 MUST NOT 出现在该名称处.
这是对 [RFC1034] 中原始 CNAME 定义的修改. CNAME RR 的原始定义不允许任何其他类型与 CNAME 记录共存, 但已签名区域要求每个权威名称都具有 NSEC 和 RRSIG RR.
2.6. 出现在区域切分处的 DNSSEC RR 类型 (DNSSEC RR Types Appearing at Zone Cuts)
DNSSEC 引入了两个新的 RR 类型, 其特殊之处在于它们可以出现在区域切分的父侧. 在区域切分的父侧 (即委派点), 所有者名称处 REQUIRED 存在 NSEC RR. 如果被委派区域已签名并希望建立到父区域的认证链, 也可以存在 DS RR.
本规范更新原始 DNS 规范, 允许 NSEC 和 DS RR 类型出现在区域切分的父侧. 当这些 RRset 出现在区域切分的父侧时, 它们对父区域而言是权威的.
2.7. 安全区域示例 (Example of a Secure Zone)
附录 A 展示了一个小型已签名区域的完整示例.