部署DNSsec权威域名服务

这是本文档旧的修订版!


部署DNSsec权威域名服务

初始条件

  1. 域名注册商必须支持DNSsec。(直接找他们问,或者看是否提供DS记录)
  2. 上级域名必须支持DNSsec,用 dig +short dnskey 上级域名来测试。(如果不支持,则只能用 DLV)。
  3. 主域名服务器必须支持DNSsec。(自己搞)
  4. 从域名服务器必须也支持DNSsec。

概念

每一个域需要两组用于签名的密钥对。一组称为密钥签名密钥(Key Signing Key,KSK),一般而言较长,需要到域名注册商处备案(以便通过上级域名发布)。由于密钥较长,因此其强度更高,因此也可以使用更久的时间。

用来签署本域的域签名密钥(Zone Signing Key,ZSK),后者通常较短,并且需要经常更换。(不推荐使用长 ZSK,因为长 ZSK 的签名尺寸较大,会导致 DNS 流量增加并降低可靠性;未来基于椭圆曲线的算法普及之后,这一情况将有所改观)。

ZSK 和 KSK 都是可以用来签名的密钥,因此 DNS 服务器理论上可以两者都用来签名。实践上,一般来说,为了减少不必要的 DNS 流量(因为查询DNS的时候不可能告诉对方一个key的ID再去问),通常的配置中 KSK 只用于签署用来签署域名的域签名密钥,而不用来签名普通地址记录。

BIND 的实现中,如果 KSK 与 ZSK 采用的加密算法不同,会出现以两个密钥同时签署域的情况。

用作从域名服务器的 DNS 服务器并不需要相关密钥。一般来说,为了分散风险,DNSsec 的配置应以 “hidden master” (隐藏主DNS:主DNS并不对公众直接提供服务)。

推荐的部署步骤

以下是个人推荐的部署步骤。

  1. 收集必要的相关信息,如 zone 文件等等。设计部署方案。
  2. 配置全部的从 DNS 服务器(启用其上的 DNSsec 配置)确认服务正常。
  3. 如果目前使用的不是 hidden master,将 DNS 集群改为 hidden master 方式。(非常简单,本文暂略)
  4. 生成相关密钥。
  5. 将 hidden master 配置为使用 DNSsec 签名,测试 (dig +dnssec soa 域名 @服务器)。
  6. 如果无问题,在域名注册商处发布 DS 记录。
  7. 进一步生产环境测试。

DNSsec需要持续维护。持续维护阶段,需要每隔一段时间生成并轮换密钥,在轮换 KSK 时需要在注册商那里发布。

生成相关密钥

假定在我们希望的配置中,KSK使用2048-bit RSA/SHA256,ZSK使用1024-bit RSA/SHA256并每季度轮转一次,且今天是2015年5月1日,那么:

dnssec-keygen -K keys -a RSASHA256 -3 -b 2048 -f KSK -I 20160501 -D 20160507 域名
dnssec-keygen -K keys -a RSASHA256 -3 -b 1024 -I 20150801 -D 20150807 域名

以上,第一个命令生成2048-bit的KSK,并将过期时间设置为2016年5月1日(这之后新的记录将不再使用这个key签名),并约定2016年5月7日从域中剔除(这之后查询该key将不再返回结果)。 XXX 此处重叠时间应继续查看文档了解。

注意,运行 BIND 的用户必须能够访问这些 key 文件(chown bind:bind keys/*)。

配置 DNSsec 域名

本质上,DNSsec 服务器提供的是一组经过签名的地址记录,这些签名以 RRSIG 记录的形式发给请求者。传统的 DNSsec 配置方法是静态的:从现有的 zone 文件,使用特定的key来签署它,并让BIND来将其服务出去。这种方法在安全上有一定的优势:key可以完全脱离DNS服务器保存在安全的地方,但由于签名有一定的有效期,因此维护比较麻烦。

新式的 BIND 服务器支持一种称作 inline signing 的技术。这种方法是告诉 DNS 服务器key在哪里去找,并且在key上设定过期时间等等,然后DNS服务器自己决定在合适的时间去做更新相关的操作。这种方式维护起来比较方便。

配置 hidden master 服务器全局配置

主要配置如下:

       key-directory "/usr/local/etc/namedb/keys";
       sig-validity-interval 21 16;

以上主要是配置密钥的位置,以及签名的有效时间 XXX 需查证这一做法是否最佳实践。

定义允许传输域的ACL:

acl trusted {
       1.2.3.0/25;
};

以上设置一名为 trusted 的 ACL,其中包含 1.2.3.0/25 网段。

配置 hidden master 服务器域 example.com 的配置

zone "example.com" {
       type master;
       file "/usr/local/etc/namedb/dynamic/example.com";
       auto-dnssec maintain;
       inline-signing yes;
       allow-transfer { trusted; };
       also-notify { 1.2.3.4; };
};

以上基本可原样照抄(改掉其中 example.com)。1.2.3.4是需要通知的首席辅DNS服务器(它可以进一步通知其他DNS服务器),如果需要也可以写上多个DNS服务器。

这里我们(误)用了 dynamic 目录,因为这个目录是 BIND 可写的,而 BIND 需要在其中写入一系列文件(修改日志、签名)。

启动 BIND 后,BIND 会自动对原有的 example.com 根据需要进行签名,并通知我们指定的辅 DNS 服务器,后者会到 hidden master 来拉,具体可以看 DNS 服务器的日志。

未完待续。

参考文献

  • NIST Publication SP-800-81 NIST SP
notes/d/dnssec-authorative.1430808884.txt.gz · 最后更改: 2015/05/05 06:54