我正在使用 BIND 9.18.28-0ubuntu0.24.04.1-Ubuntu 来提供 DNSSEC 签名区域,但是当我更新区域时,签名区域的 SOA 序列与未签名的 SOA 无关。
上次更新后,我的未签名区域的区域文件具有 SOA 序列号 2024081200,但该区域的签名版本的序列号为 2024040710。
如果我对区域文件进行更改并将 SOA 序列更改为 2024081301 并重新加载,则将签名的序列更改绑定到 2024040711。
似乎无论我做什么更改,已签名区域的序列号都只会增加 1。我希望它使用未签名区域文件的序列号作为已签名序列号的新基础(在密钥轮换时将其增加 1)。
区域配置如下
zone "example.com" IN {
type primary;
file "/var/cache/bind/zones/example.com";
dnssec-policy default;
inline-signing yes;
};
我的 dnssec 策略如下所示
dnssec-policy standard {
dnskey-ttl 600;
keys {
ksk lifetime P365D algorithm ecdsap256sha256;
zsk lifetime P60D algorithm ecdsap256sha256;
};
max-zone-ttl P1D;
parent-ds-ttl PT1H;
parent-propagation-delay PT1H;
publish-safety PT1H;
retire-safety PT1H;
signatures-refresh P5D;
signatures-validity P14D;
signatures-validity-dnskey P14D;
zone-propagation-delay PT5M;
};
我错过了什么?
据我所知,这似乎是故意的,早在 BIND 9.7.x 中
lib/dns/zone.c
它就始终忽略不安全区域的 SOA ,其变更日志条目仅显示:(遗憾的是,引用的ISC RT 项目似乎不可公开查看。)
换句话说,它总是用 oldserial+1 覆盖 SOA 中的序列,并且似乎没有选项可以禁用此行为。
就我个人而言,我认为基于日期的序列号根本没有用。较小的整数更容易更新,也更容易进行视觉比较——要解释你问题中的整数,需要花上不止一眼的时间。Git/Hg/CVS 可以回答“区域上次更新时间是什么时候”的问题;加载区域失败在过程中已经检测到
rndc reload
(通常可以通过作为 Git 钩子运行来预先捕获named-checkzone
);从 很容易看到复制卡住了dig +nssearch
。请注意,DNSSEC签名的有效期相对较短,因此SOA序列号不仅在密钥轮换期间会增加,而且每次签名过期并需要重新签名时也会增加,在您的配置中似乎每5天左右就会增加一次。
(虽然您的区域定义不使用您定义的“标准”策略 - 但它使用“默认”策略......)
(关于到期时间的话题,你绝对不需要对 EC P-256 ZSK 进行 60 天的轮换——这是在 768 位 RSA 区域密钥时代所做的事情,是使用弱密钥来获得较小签名的折衷方案,但不适用于 EC。)