签名

签名向区域文件添加 DNSSEC 记录。

说明

签名插件用于对区域进行签名(参见 RFC 6781)。在此过程中会添加 DNSSEC 资源记录。对资源记录集进行签名的签名具有过期日期,这意味着必须在达到此过期数据之前重复签名过程。否则,区域的数据将变为 BAD(RFC 4035 第 5.5 节)。签名插件负责执行此操作。

仅支持 NSEC,签名不支持 NSEC3。

签名文件自动插件结合使用;此插件区域文件签名自动文件服务区域数据

此插件的正常运行至少需要一个常用签名密钥(参见 coredns-keygen(1))。此密钥(或密钥)将用于对整个区域进行签名。签名不支持 ZSK/KSK 分割,也不会进行密钥或算法切换 - 它只是进行签名。

签名

  • 在以下情况下使用 CSK(s)(重新)对区域进行签名:

    • 上次签名时间在 6 天前。将对每个区域的起始日期应用一些抖动。

    • 签名在到期前仅剩 14 天。

    这两个日期仅在 SOA 的签名中进行检查。

  • 为每个给定的 DNSKEY 创建起始时间为 -3 小时(减去 0 到 18 小时之间的抖动)且到期时间为 +32(加上 0 到 5 天之间的抖动)的 RRSIG。

  • 为区域中的所有名称添加 NSEC 记录。NSEC 记录的 TTL 是 SOA 记录的负向缓存 TTL。

  • 用从给定密钥派生的 apex CDS/CDNSKEY 记录添加或替换所有 apex CDS/CDNSKEY 记录。为每个密钥创建两个 CDS,一个使用 SHA1,另一个使用 SHA256。

  • 将 SOA 的序列号更新为执行签名时的Unix 时间戳。这将覆盖任何以前的序列号。

有两种方式来限定签名区域的时间。正常情况下,每 6 天(加上抖动)将重新签名。如果由于某种原因我们这样做时遇到问题,则在到期前 14 天时会重新签名。

密钥的命名(遵循 BIND9):K<name>+<alg>+<id>.keyK<name>+<alg>+<id>.private。密钥不能包含在区域中;它们将通过签名添加。这些密钥可以通过 coredns-keygen 或 BIND9 的 dnssec-keygen 生成。你无需遵循此命名方案,但需要为密钥显式命名,请参阅 密钥文件指令。

生成的区域将写入名为 db.<name>.signed 的文件中,该文件位于由 directory 指示符命名的目录中(默认为 /var/lib/coredns)。

语法

sign DBFILE [ZONES...] {
    key file|directory KEY...|DIR...
    directory DIR
}
  • DBFILE 要读取和解析的区域数据库文件。如果路径是相对路径,则会将 *root* 插件中的路径前置到该路径。
  • ZONES 应为其签名区域。如果为空,则使用来自配置块的区域。
  • key 指定用于对区域进行签名的密钥(可以是多个)。如果使用 file,则按原样使用 KEY 的文件名。如果使用 directory,则 *sign* 会在 DIR 中查找 K<name>+<alg>+<id> 文件。这些文件中的任何元数据(激活、发布等)都将被 *忽略*。这些密钥还必须是密钥签名密钥 (KSK)。
  • directory 指定 CoreDNS 应将已签名区域保存到的 DIR。如果未给定,这将默认为 /var/lib/coredns。这些区域以 db.<name>.signed 名称保存。如果路径是相对路径,则会将 *root* 插件中的路径前置到该路径。

可以使用 coredns-keygen 生成密钥,要为 sign 插件使用密钥,请使用:coredns-keygen example.orgdnssec-keygen -a ECDSAP256SHA256 -f KSK example.org

示例

对文件 db.example.org 中包含的 example.org 区域进行签名,并将结果写入 ./db.example.org.signed,以供 file 插件选择并提供该区域。使用的密钥从 /etc/coredns/keys/Kexample.org.key/etc/coredns/keys/Kexample.org.private 中读取。

example.org {
    file db.example.org.signed

    sign db.example.org {
        key file /etc/coredns/keys/Kexample.org
        directory .
    }
}

运行此命令将导致以下日志输出(请注意,此示例中的计时器已设置为较短的间隔)。

[WARNING] plugin/file: Failed to open "open /tmp/db.example.org.signed: no such file or directory": trying again in 1m0s
[INFO] plugin/sign: Signing "example.org." because open /tmp/db.example.org.signed: no such file or directory
[INFO] plugin/sign: Successfully signed zone "example.org." in "/tmp/db.example.org.signed" with key tags "59725" and 1564766865 SOA serial, elapsed 9.357933ms, next: 2019-08-02T22:27:45.270Z
[INFO] plugin/file: Successfully reloaded zone "example.org." in "/tmp/db.example.org.signed" with serial 1564766865

或者为 *多个* 区域使用单个区域文件,请注意,ZONES 对这两个插件重复。请注意,这会输出 *多个* 已签名的输出文件。此处,我们使用默认输出目录 /var/lib/coredns

. {
    file /var/lib/coredns/db.example.org.signed example.org
    file /var/lib/coredns/db.example.net.signed example.net
    sign db.example.org example.org example.net {
        key directory /etc/coredns/keys
    }
}

这是相同的配置,但区域放入服务器块,但请注意,您仍需要在 *file* 插件中指定哪个文件为哪个区域提供服务

example.org example.net {
    file var/lib/coredns/db.example.org.signed example.org
    file var/lib/coredns/db.example.net.signed example.net
    sign db.example.org {
        key directory /etc/coredns/keys
    }
}

小心地完整列出您要签名的源,如果不这样做

example.org example.net {
    sign plugin/sign/testdata/db.example.org miek.org {
        key file /etc/coredns/keys/Kexample.org
    }
}

这将导致 db.example.org 被签名 *两次*,因为整个部分被解析了两次,因为您在服务器块中指定了源 example.orgexample.net

可以通过移除已签名的区域文件(CoreDNS 会继续从内存中提供该区域)和向该进程发送 SIGUSR1 以使其重新加载和重新签名的区域文件,来强制重新签名一个区域。

另请参阅

DNSSEC RFC:RFC 4033、RFC 4034 和 RFC 4035。以及 DNSSEC 的 BCP,RFC 6781。此外还有手册页 coredns-keygen(1) 和 dnssec-keygen(8)。以及 *file* 插件文档。

可以在 https://github.com/coredns/coredns-utils 中找到 Coredns-keygen,位于 coredns-keygen 目录中。

可在 ldns 中找到其他有用的 DNSSEC 工具,例如用于从 DNSKEY 创建 DS 记录的 ldns-key2ds

缺陷

keys 目录 未实施。

此文件的 原始出处