什么是 DNSSEC?
DNSSEC(域名系统安全扩展)是一组针对 DNS 的加密扩展,通过为记录添加数字签名来验证 DNS 响应,防止攻击者伪造或篡改 DNS 数据。DNSSEC 如何工作
Chain of Trust:
Root Zone (.)
├── Signs: .com zone key
│ └── KSK (Key Signing Key)
│ └── ZSK (Zone Signing Key)
│
TLD Zone (.com)
├── Signs: example.com zone key
│ └── DS Record points to child KSK
│
Domain Zone (example.com)
├── Signs: All DNS records
│ └── RRSIG (Record Signature)
│ └── DNSKEY (Public keys)
│
Resolver validates entire chain from root
DNSSEC 记录类型
| 记录 | 用途 | 说明 |
|---|---|---|
| RRSIG | 签名 | 每组记录的加密签名 |
| DNSKEY | 公钥 | 区域的公共签名密钥(KSK 和 ZSK) |
| DS | 委派签名者 | 父区域中子区域 KSK 的哈希值 |
| NSEC/NSEC3 | 经验证的否定证明 | 证明某条记录不存在 |
密钥类型
| 密钥 | 用途 | 轮换频率 |
|---|---|---|
| KSK(密钥签名密钥) | 签署 DNSKEY 记录 | 每年一次或更少 |
| ZSK(区域签名密钥) | 签署其他所有记录 | 每月到每季度 |
DNSSEC 验证流程
1. 客户端向 DNS 解析器查询 example.com 的 A 记录
2. 解析器获取 A 记录和 RRSIG 签名
3. 解析器获取 DNSKEY 以验证 RRSIG
4. 解析器根据 DNSKEY 验证 DS 记录
5. 链条继续向上到根区域,逐级完成验证
6. 如果所有签名都有效,响应即通过身份验证
DNSSEC 可防范的威胁
| 攻击 | 说明 | DNSSEC 防护 |
|---|---|---|
| 缓存投毒 | 向缓存注入虚假记录 | 签名可以检测篡改 |
| 中间人攻击 | 拦截并修改响应 | 加密验证会失败 |
| DNS 欺骗 | 返回伪造的 IP 地址 | 伪造记录没有有效签名 |
实施注意事项
- 性能:签名会使响应变大(约 1000 至 4000 字节,而普通响应约 100 字节)
- 密钥管理:需要安全地生成、存储和轮换密钥
- 区域签名:记录变更后必须重新签署区域
- 解析器支持:客户端需要使用支持 DNSSEC 验证的解析器
最佳实践
1. 使用算法 13 或 14:ECDSA 的签名比 RSA 更小
2. 自动轮换密钥:使用 OpenDNSSEC 等工具管理密钥生命周期
3. 监控过期时间:RRSIG 签名具有有效期
4. 部署前测试:使用 dnsviz.net 等工具验证区域
5. 准备应急方案:记录密钥轮换流程
DNSSEC 为 DNS 完整性提供重要保护,确保用户访问合法目标,而不是攻击者控制的服务器。