说明
签名插件用于对区域进行签名(参见 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>.key
和 K<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.org
或 dnssec-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.org
和 example.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 目录
未实施。