DNSSEC 第二部分:实施
本文是关于 DNSSEC 系列文章的第二篇。在第一篇中,我概述了 DNSSEC 的基本概念,为本文奠定基础。本文将讨论如何使用 BIND 为区域启用 DNSSEC。如果您想部署 DNSSEC,但不确定 KSK、ZSK、DLV 或 DS 记录是什么意思,您可能需要回到第一部分复习一下概念,因为在本文中,我将直接深入探讨实施。
使用 BIND 为区域添加 DNSSEC,除了通常将 BIND 配置为区域的主服务器之外,还需要一些额外的步骤。首先,您需要生成密钥签名密钥 (KSK) 和区域签名密钥 (ZSK),然后更新区域的配置并使用密钥对其进行签名。最后,您将重新配置 BIND 本身以支持 DNSSEC。完成这些操作后,您的区域应该就可以使用了。如果您的注册商支持 DNSSEC,您可以更新它,或者使用像 dlv.isc.org 这样的提供商提供的 DLV。现在,让我们以我的 greenfly.org 区域为例,更详细地了解这些步骤。
生成密钥第一步是为您的区域生成 KSK 和 ZSK。正如我在之前的文章中提到的,KSK 仅用于签署区域中的 ZSK,并为区域的父级签名提供签名,而 ZSK 则签署每个区域中的记录。拥有单独的密钥还允许您创建更强的 KSK,并拥有较弱的 ZSK,您可以每月轮换一次。因此,首先,让我们使用 dnssec-keygen
为 greenfly.org 创建一个 KSK
$ cd /etc/bind/
$ dnssec-keygen -a RSASHA1 -b 2048 -n ZONE -f KSK greenfly.org
默认情况下,dnssec-keygen
命令会将生成的密钥转储到当前目录中,因此请更改到您存储 BIND 配置的目录。-a
和 -b
参数设置算法 (RSASHA1) 和密钥大小 (2048 位),而 -n
选项告诉 dnssec-keygen
它正在创建的密钥类型(区域密钥)。您也可以使用 dnssec-keygen
为 DDNS 和其他 BIND 功能生成密钥,因此您需要确保指定这是用于区域的密钥。我还添加了 -f KSK
选项,该选项告诉 dnssec-keygen
设置一个位,将此密钥标记为 KSK 而不是 ZSK。最后,我指定了此密钥所属区域的名称:greenfly.org。此命令应创建两个文件:一个 .key 文件(它是区域中发布的公钥)和一个 .private 文件(它是私钥,应像秘密一样对待)。这些文件以 K 开头,然后是区域的名称,然后是一系列数字(后者是随机生成的),所以在我的例子中,它创建了两个文件:Kgreenfly.org.+005+10849.key 和 Kgreenfly.org.+005+10849.private。
接下来我需要创建 ZSK。该命令与创建 KSK 的命令非常相似,只是我将位大小降低到 1024 位,并删除了 -f KSK
参数
$ dnssec-keygen -a RSASHA1 -b 1024 -n ZONE greenfly.org
此命令创建了另外两个密钥文件:Kgreenfly.org.+005+58317.key 和 Kgreenfly.org.+005+58317.private。现在我准备更新并签署我的区域了。
更新区域文件现在每个密钥都已创建,我需要更新我的 greenfly.org 的区域文件(包含我的 SOA、NS、A 和其他记录的文件),以包含公钥 KSK 和 ZSK。在 BIND 中,您可以通过在区域末尾添加 $INCLUDE
行来实现这一点。在我的例子中,我添加了这两行
$INCLUDE Kgreenfly.org.+005+10849.key ; KSK
$INCLUDE Kgreenfly.org.+005+58317.key ; ZSK
签署区域
一旦密钥包含在区域文件中,您就可以签署区域本身了。您将使用 dnssec-signzone
命令来执行此操作
$ dnssec-signzone -o greenfly.org -k Kgreenfly.org.+005+10849 \
db.greenfly.org Kgreenfly.org.+005+58317.key
在此示例中,-o
选项指定区域源,实际上是要更新的区域的实际名称(在我的例子中是 greenfly.org)。-k
选项用于指向要用于签署区域的 KSK 的名称。最后两个参数是区域文件本身 (db.greenfly.org) 和要使用的 ZSK 文件的名称。
如果您正在使用 DLV,您将添加一个额外的 -l
选项来指定您正在使用的 DLV 服务器
$ dnssec-signzone -l dlv.isc.org -o greenfly.org -k \
Kgreenfly.org.+005+10849 db.greenfly.org \
Kgreenfly.org.+005+58317.key
在任何一种情况下,该命令都将创建一个新的 .signed 区域文件(在我的例子中是 db.greenfly.org.signed),其中包含您的所有区域信息以及许多新的 DNSSEC 相关记录,这些记录列出了您区域中每个 RRSET 的签名。如果您不使用 DLV,它还会创建一个 dsset-zonename 文件,其中包含一个 DS 记录,您将使用该记录来让您的区域由区域父级签名。如果您正在使用 DLV,您将获得一个 dlvset-zonename 文件。任何时候您对区域进行更改,只需像往常一样更新您的常规区域文件,然后运行 dnssec-signzone
命令来创建一个更新的 .signed 文件。一些管理员甚至建议将 dnssec-signzone
命令放入 cron 作业中以每天或每周运行,因为默认情况下,如果您在该时间内不运行 dnssec-signzone
,密钥签名将在一个月后过期。
现在您有了一个新的 .signed 区域文件,您需要更新 BIND 中区域的配置,以便它使用该文件而不是纯文本文件,这非常简单明了
zone "greenfly.org" {
type master;
file "/etc/bind/db.greenfly.org.signed";
allow-transfer { slaves; };
};
在 BIND 中启用 DNSSEC 支持
接下来,更新主 BIND 配置文件(通常位于 named.conf 或 named.conf.options 中)中启用的选项,以便启用 DNSSEC,服务器尝试验证任何递归查询的 DNSSEC,并支持 DLV(DNSSEC 外观验证)
options {
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
};
当您将 dnssec-lookaside
设置为 auto
时,BIND 将自动信任它为 dlv.isc.org 提供的 DLV 签名,因为它包含在 BIND 软件中。或者,如果您添加额外的 BIND 选项和受信任的密钥,您可以手动添加 DLV 密钥
options { dnssec-lookaside . trust-anchor dlv.isc.org.; };
trusted-keys {
dlv.isc.org. 257 3 5
"BEAAAAPHMu/5onzrEE7z1egmhg/WPO0+juoZrW3euWEn4MxDCE1+lLy2
brhQv5rN32RKtMzX6Mj70jdzeND4XknW58dnJNPCxn8+jAGl2FZLK8t+
1uq4W+nnA3qO2+DL+k6BD4mewMLbIYFwe0PG73Te9fZ2kJb56dhgMde5
ymX4BI/oQ+cAK50/xvJv00Frf8kw6ucMTwFlgPe+jnGxPPEmHAte/URk
Y62ZfkLoBAADLHQ9IrS2tryAe7mbBZVcOwIeU/Rw/mRx/vwwMCTgNboM
QKtUdvNXDrYJDSHZws3xiRXF1Rf+al9UmZfSav/4NWLKjHzpT59k/VSt TDN0YUuWrBNh";
};
完成更改 BIND 配置文件后,重新加载或重启 BIND,您的区域应该就可以回复 DNSSEC 查询了。
测试 DNSSEC要测试区域的 DNSSEC 支持,只需将 +dnssec
参数添加到 dig
。这是一个针对 www.greenfly.org 的示例查询
$ dig +dnssec www.greenfly.org
; <<>> DiG 9.8.1-P1 <<>> +dnssec www.greenfly.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13093
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 5
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;www.greenfly.org. IN A
;; ANSWER SECTION:
www.greenfly.org. 900 IN A 64.142.56.172
www.greenfly.org. 900 IN RRSIG A 5 3 900 20130523213855
20130423213855 58317 greenfly.org.
cZS1G2Jj3FNB0UrU4W+LbpCJlvVa+3yos1ni5V0pct4x4lWvXGQNoh1G
/uFFJ62YRYXskL/c17wiAEIqsJ0O/wzek5KFWAoiJ3zW051l9c/8KPGF
7LzmEumdAVM2MmrPVu+PKGfilPlfofjwJLbgVhyYqepbbD8xv3bmg0Np YnM=
;; AUTHORITY SECTION:
greenfly.org. 900 IN NS ns2.greenfly.org.
greenfly.org. 900 IN NS ns1.greenfly.org.
greenfly.org. 900 IN RRSIG NS 5 2 900 20130523213855
20130423213855 58317 greenfly.org.
d/7E3iCxzS/qBSOl/x7m/yMMqbl5mUGH7tVw/j7U/qyC7D9YZJIXNp3J
uU8vueo09cZf+yjwHusdWDWgdW8mkAVoGR5K/azoY4o2xRBvt8Z5pf3a
BqmNIHzROZkf6BOrx6Nqv65npSGoNLQBoEc90FvDFe/N5I27LBTIxCv4 3UQ=
;; ADDITIONAL SECTION:
ns1.greenfly.org. 900 IN A 64.142.56.172
ns2.greenfly.org. 900 IN A 75.101.46.232
ns1.greenfly.org. 900 IN RRSIG A 5 3 900 20130523213855
20130423213855 58317 greenfly.org.
VDeJSlfEYRwHkjRnCvmDXFHneG3Fhw15mCSALT8m8fOtQkMroI8t0qu3
K8Tdt4q8/t1JYucpwQbpjsR3f+rmJc0t4L7HSVA/1LHajOqA+Wn2XH8L
Rp01qVkeBIZ7g+K7LY2XRU3DGSzbeFUKrViqtakbTQxZ9o3Oj6ZqL0Pv 0nQ=
ns2.greenfly.org. 900 IN RRSIG A 5 3 900 20130523213855
20130423213855 58317 greenfly.org.
dUU/6bbc6sHoSl+e2uGwoEXLMGyr4Qaedk3E74ArnUOb4VViBd3CxvGF
SPG2QK3AggDv8z3+9Wm6NA11oTFcuIGnbBarxDQIrbERHFfcSQaekvSR
UcSSD7wft9YO7UTIiQrc8LkItXZAKd72Gy1ZP4mhhLxwwOIhlHshQ9d2 uTY=
;; Query time: 196 msec
;; SERVER: 64.142.56.172#53(64.142.56.172)
;; WHEN: Fri Apr 26 16:13:22 2013
;; MSG SIZE rcvd: 817
告知您的父级
一旦您确认 DNSSEC 正在为您的区域返回签名记录,最后的步骤是转到您区域的父级(通常是通过您最初购买域名的注册商),并向他们提供 DS 记录(在 dnssec-signzone 生成的 dsset-zonename 文件中),以便他们可以对其进行签名。不幸的是,今天只有少数注册商提供 DNSSEC 支持,有些还为这项服务额外收费。在任何一种情况下,您可能都想通过像 dlv.isc.org 这样的服务来使用 DLV。为此,只需访问 https://dlv.isc.org 并按照说明创建一个帐户并在他们那里注册您的区域。他们提供了一个简单的界面,可以验证您区域上的 DNSSEC,甚至会在您忘记在一个月后更新区域的签名时向您发送警报。
因此,虽然启用 DNSSEC 不像常规 BIND 配置那么简单(而且对许多人来说,即使是常规配置也很复杂),但一旦您了解了正确的步骤,它也并非那么困难。希望这篇文章鼓励您在您的区域上尝试 DNSSEC。