我受命研究如何在我们的名称服务器上实施 DNSSEC。虽然这方面的技术方面(生成密钥、签署区域、准备轮换)相对简单,但我遇到了一个后勤问题。
从我读过的文档来看,1024 位对于区域签名密钥来说是一个合适的大小,正确的程序是每个区域一个 ZSK,大约一个月的滚动更新
但是,在速度相当快且熵值相当高的计算机上,生成 1024 位密钥最多需要 10 分钟……而我工作的 ISP 托管着三千多个区域。除非我以某种方式从头到尾自动化该过程,否则这是不可能的——即使我这样做了,等到该过程完成时,也快到下一次轮换开始的时候了。
简而言之,这是不可行的。目前,我限制 DNSSEC 仅供明确要求的客户使用,但这充其量只是权宜之计。
我的问题:
- 我设置的密钥长度是不是太长了?
- 我如何才能加快密钥生成过程?
- 我是否应该为每个区域以及 ZSK 创建单独的密钥签名密钥?
编辑:添加了我用来生成密钥的确切命令:
caleburn: ~/Projects/Systemec/DNS-magic/DNSSEC/keys/ >time dnssec-keygen -r/dev/random -a RSASHA256 -f KSK -b 1280 -n ZONE example.com
Generating key pair.............................+++++ ...+++++
Kexample.com.+008+10282
real 9m46.094s
user 0m0.092s
sys 0m0.140s
caleburn: ~/Projects/Systemec/DNS-magic/DNSSEC/keys/ >time dnssec-keygen -r/dev/random -a RSASHA256 -b 1280 -n ZONE example.com
Generating key pair.........................+++++ .........+++++
Kexample.com.+008+22173
real 12m47.739s
user 0m0.124s
sys 0m0.076s
答案1
dnssec-keygen
默认情况下从中读取/dev/random
。如果系统的熵较低,您将无法获得足够的随机数据来及时生成密钥。strace 可能会显示很多内容,例如:
select(4, [3], [], NULL, NULL) = 1 (in [3])
read(3, "5%\5\32\316\337\241\323", 46) = 8
read(3, 0x7fff5b6c3df0, 38) = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], [], NULL, NULL) = 1 (in [3])
read(3, "\305\35\201c\31\343\251\21", 38) = 8
read(3, 0x7fff5b6c3df0, 30) = -1 EAGAIN (Resource temporarily unavailable)
/dev/random
如果熵不够,就会阻塞,所以可能需要一段时间。
-r /dev/random
您可以使用一些选项来加快这一过程。最简单的方法是-r /dev/urandom
使用非阻塞(但不那么安全)的随机数生成器。对于您预计会使用几年的 GPG 或 SSH 密钥,这可能不安全,但对于您每 30 天更改一次的密钥,这可能是安全的。
另一种选择是使用类似胃镜检查或者哈格德作为 的替代/dev/random
。
如果您想要更安全的 RNG,最好使用专用硬件 RNG。除非您管理 TLD 或银行域名,否则这些对于 DNSSEC 来说可能有点过头了。
您可能希望坚持使用 /dev/random 作为 KSK,但 /dev/urandom 应该适合 ZSK。
答案2
我认为普遍的共识是,您的 ZSK 应该是 1024 位并且每季度轮换一次,而您的 KSK 应该是 2048 位并且每隔几年轮换一次。