2. Zone Signing (区域签名)
2. Zone Signing (区域签名)
DNSSEC 引入了签名区域 (signed zone) 的概念.签名区域包括 DNS Public Key (DNS 公钥, DNSKEY), Resource Record Signature (资源记录签名, RRSIG), Next Secure (下一个安全, NSEC) 以及 (可选的) Delegation Signer (委托签名者, DS) 记录, 这些记录应分别按照第 2.1, 2.2, 2.3 和 2.4 节中指定的规则包含.不包含这些记录或不符合本节规则的区域是未签名区域 (unsigned zone).
DNSSEC 要求对 CNAME 资源记录 ([RFC1035]) 的定义进行修改.第 2.5 节修改了 CNAME RR, 允许 RRSIG 和 NSEC RR 出现在与 CNAME RR 相同的所有者名称 (owner name) 处.
DNSSEC 指定了两种新 RR 类型 NSEC 和 DS 的放置位置, 它们可以放置在区域切割 (zone cut) 的父区域侧 (即在委托点, delegation point).这是对在区域切割的父区域中放置数据的一般禁止的例外.第 2.6 节描述了这一变化.
2.1. Including DNSKEY RRs in a Zone (在区域中包含 DNSKEY RR)
要签名一个区域, 区域管理员生成一个或多个公钥/私钥对, 并使用私钥对区域中的权威 RRset 进行签名.对于用于在区域中创建 RRSIG RR 的每个私钥, 区域应该 (SHOULD) 包含一个包含相应公钥的区域 DNSKEY RR.区域密钥 (zone key) DNSKEY RR 必须 (MUST) 设置 flags RDATA 字段的 Zone Key 位 (参见 [RFC4034] 第 2.1.1 节).与其他 DNS 操作关联的公钥可以 (MAY) 存储在未标记为区域密钥的 DNSKEY RR 中, 但绝对不能 (MUST NOT) 用于验证 RRSIG.
如果区域管理员希望签名区域可用而不仅仅是作为安全岛 (island of security), 区域顶点 (zone apex) 必须 (MUST) 包含至少一个 DNSKEY RR 作为进入区域的安全入口点 (secure entry point).然后, 该安全入口点可以通过父区域中的相应 DS RR 用作安全委托 (secure delegation) 的目标 (参见 [RFC4034]).
2.2. Including RRSIG RRs in a Zone (在区域中包含 RRSIG RR)
对于签名区域中的每个权威 RRset, 必须 (MUST) 至少有一个满足以下要求的 RRSIG 记录:
- RRSIG 所有者名称等于 RRset 所有者名称.
- RRSIG 类 (class) 等于 RRset 类.
- RRSIG Type Covered 字段等于 RRset 类型.
- RRSIG Original TTL 字段等于 RRset 的 TTL.
- RRSIG RR 的 TTL 等于 RRset 的 TTL.
- RRSIG Labels 字段等于 RRset 所有者名称中的标签数量, 不计算空根标签 (null root label), 如果最左边的标签是通配符 (wildcard) 则不计算该标签.
- RRSIG Signer's Name 字段等于包含该 RRset 的区域的名称.
- RRSIG Algorithm, Signer's Name 和 Key Tag 字段标识区域顶点的一个区域密钥 DNSKEY 记录.
为给定 RRset 构建 RRSIG RR 的过程在 [RFC4034] 中描述.一个 RRset 可以 (MAY) 有多个与之关联的 RRSIG RR.请注意, 由于 RRSIG RR 与其包含签名的 RRset 紧密相关, RRSIG RR 与所有其他 DNS RR 类型不同, 不构成 RRset.特别是, 具有共同所有者名称的 RRSIG RR 之间的 TTL 值不遵循 [RFC2181] 中描述的 RRset 规则.
RRSIG RR 本身绝对不能 (MUST NOT) 被签名, 因为签名 RRSIG RR 不会增加任何价值, 并且会在签名过程中创建无限循环.
出现在区域顶点名称的 NS RRset 必须 (MUST) 被签名, 但出现在委托点的 NS RRset (即父区域中将名称委托给子区域名称服务器的 NS RRset) 绝对不能 (MUST NOT) 被签名.与委托关联的胶水地址 (glue address) RRset 绝对不能 (MUST NOT) 被签名.
对于区域顶点 DNSKEY RRset 中的每个算法, 必须 (MUST) 至少使用一个该算法的 DNSKEY 为每个 RRset 提供 RRSIG.顶点 DNSKEY RRset 本身必须 (MUST) 由出现在委托父区域 (delegating parent) 的 DS RRset 中的每个算法进行签名 (如果有).
2.3. Including NSEC RRs in a Zone (在区域中包含 NSEC RR)
区域中具有权威数据或委托点 NS RRset 的每个所有者名称必须 (MUST) 有一个 NSEC 资源记录.NSEC RR 的格式和为给定名称构建 NSEC RR 的过程在 [RFC4034] 中描述.
任何 NSEC RR 的 TTL 值应该 (SHOULD) 与区域 SOA RR 中的最小 TTL 值字段相同.
NSEC 记录 (及其关联的 RRSIG RRset) 绝对不能 (MUST NOT) 是任何特定所有者名称的唯一 RRset.也就是说, 签名过程绝对不能 (MUST NOT) 为在区域签名之前不是任何 RRset 的所有者名称的所有者名称节点创建 NSEC 或 RRSIG RR.这样做的主要原因是希望在同一区域的签名版本和未签名版本之间保持命名空间一致性 (namespace consistency), 以及希望降低在安全无感知递归名称服务器 (security oblivious recursive name server) 中响应不一致的风险.
签名区域中每个 NSEC 资源记录的类型位图 (type bitmap) 必须 (MUST) 指示 NSEC 记录本身及其相应 RRSIG 记录的存在.
2.4. Including DS RRs in a Zone (在区域中包含 DS RR)
DS 资源记录在 DNS 区域之间建立认证链 (authentication chain).当子区域被签名时, 应该 (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. Changes to the CNAME Resource Record (对 CNAME 资源记录的修改)
如果在签名区域的名称处存在 CNAME RRset, 则该名称处需要 (REQUIRED) 相应的 RRSIG 和 NSEC RRset.该名称处也允许用于安全动态更新目的的 KEY RRset ([RFC3007]).其他类型绝对不能 (MUST NOT) 出现在该名称处.
这是对 [RFC1034] 中给出的原始 CNAME 定义的修改.CNAME RR 的原始定义不允许任何其他类型与 CNAME 记录共存, 但签名区域需要为每个权威名称提供 NSEC 和 RRSIG RR.
2.6. DNSSEC RR Types Appearing at Zone Cuts (出现在区域切割处的 DNSSEC RR 类型)
DNSSEC 引入了两种新的 RR 类型, 它们的不寻常之处在于可以出现在区域切割的父区域侧.在区域切割的父区域侧 (即在委托点), 所有者名称处需要 (REQUIRED) NSEC RR.如果被委托的区域已签名并寻求与父区域建立认证链, 则也可能存在 DS RR.
本规范更新了原始 DNS 规范, 允许 NSEC 和 DS RR 类型出现在区域切割的父区域侧.当这些 RRset 出现在区域切割的父区域侧时, 它们对父区域是权威的 (authoritative).
2.7. Example of a Secure Zone (安全区域示例)
附录 A 显示了一个完整的小型签名区域示例.