DNS安全
讲述了DNS面临的安全威胁以及常见的攻击手段,还有如何使用密码学进行DNS防护
DNS安全
1. DNS简介
2. DNS面临的安全威胁
- 协议脆弱性:设计未考虑安全需求
- 域名欺骗
- 拒绝服务攻击
- 实现脆弱性:软件代码漏洞
- 算法实现缺陷
- 软件安全漏洞
- 操作脆弱性:管理、配置环节
- 域名配置攻击
- 域名注册攻击
- 信息泄露
3. 针对DNS的攻击手段
3.1 域名欺骗
- DNS不保护通信过程,可以伪造查询应答,篡改解析结果
- 条件:解析器和递归服务器只接收对发出查询请求的应答
- 目的端口与源IP地址
- 查询三元组(NAME、TYPE、CLASS)& 查询ID
- 应答内容合理
- 不同攻击者的能力:控制服务器>在通信路径上>路径外
- 控制服务器:最为简单,直接响应查询请求(DNS劫持)
- 在通信路径上:发动中间人攻击,伪造应答十分容易
- 在通信路径外:难度最大,需要更先进、复杂的手段
- 缓存投毒:递归服务器具有缓存,向缓存中注入恶意信息,能影响更多用户
DNS劫持(可信服务器背叛)
DNS hijacking
中间人攻击
man in the middle(MITM)
ID猜测与查询预测
- 攻击者不能窃听到客户端发送请求,尝试猜测ID和客户端UDP端口,共有$2^{32}$种可能
- 一些实现的UDP端口固定,可进一步减小到 $2^{16}$
- NAT可能降低端口的随机性
- 攻击者需要预测QNAME和QTYPE,可以通过影响受害者的行为来实现
- 0x20编码方案
- 目标:增加DNS查询的熵
- 思路:增加域名的大小写设置
- DNS对大小写不敏感,不干扰解析过程
- 要求:服务器的应答必须保持大小写设置
- 所有DNS服务器软件的行为都满足
- 效果:每个字符都增加了一位的熵,从而增加了猜测的难度
缓存投毒
cache poisoning
- DNS缓存:递归解析服务器会缓存近期的迭代查询结果,并用于应答查询请求,对于提升DNS系统工作效率至关重要
- 定义:将恶意域名数据写入递归服务器缓存
- 攻击范围:递归服务器的所有用户
- 攻击时效:至少一个TTL,用户无法基于DNS协议提供反馈,来触发缓存条目刷新
- 胶水记录注入
- 名字链攻击
- 简单攻击
- Kaminsky攻击
3.2. DDoS攻击
- 反射攻击
- 攻击者伪造源IP地址为受害者
- 放大攻击
- 发送一个60B的UDP查询,服务器产生4KB的应答,流量放大了67倍
4. 密码学DNS防护手段
4.1 DNSSEC
概述
- 将DNS层次化命名与公钥密码学结合
- 用密码学来保护名字到地址映射
- 利用DNS命名层次来形成PKI,形成从根到域名的信任链
- 目标:保护递归服务器和权威服务器间通信的真实性,不保护整个DNS系统
密码学
- 加盐哈希函数
- 盐:一个非保密的随机串,用于增加消息的随机性
- 在消息中加入盐,可以对抗普通的字典攻击,攻击者需要重新根据salt计算整个字典
- 数字签名(Digital Signature)
- 签名者用私钥加密消息,接收者用公钥验证签名
- 一般bob会将消息进行散列,然后再进行签名,最后把原始消息和数字签名一起发送给alice
- 而alice也会将消息进行散列$x_1$,然后用公钥对证书解密$x_2$,比对$x_1$与$x_2$是否一致
- 签名者用私钥加密消息,接收者用公钥验证签名
- 数字证书(Digital Certificate)
- 证书权威CA:可信的第三方
- bob将公钥发送给CA,获得CA用其私钥签名的证书,然后将其发送给alice
- alice用CA的公钥验证证书,确认bob公钥的真实性
- 认证链
- 以一个公钥为起点(信任锚),对下一个公钥证书进行认证,,被认证的公钥用来对下一个证书进行认证,如此认证下去
- 公钥基础设施(PKI)
- 一套提供基于数字签名的公钥认证的软硬件集合
- PKI中只需要安全发布信任锚,就可以实现所有其他公钥的安全发布
流程和细节
1)新类型RR
类型 | 说明 |
---|---|
DNSKEY | DNSSEC Public Key, zone的公钥 |
DS | Delegation signer, 授权的公钥摘要 (子域的DNSKEY的哈希值) |
RRSIG | RR Signature, 资源记录的数字签名 |
NSEC | Next Secure,用于authenticated denial of existence |
NSEC3 | hashed authenticated denial of existence |
2)DNSKEY和签名
- DNSKEY分离
- 一个zone使用两个Key
- KSK:对其他Key签名
- ZSK:对zone中数据签名
- 子zone提交自己的KSK的DS到父zone
- 一个zone使用两个Key
- Zone签名方法
- 同一zone内的KSK对ZSK签名,产生RRSIG(ZSK)
- ZSK对每一个RRset(域名和类型相同的一组RR)生成一个签名RRSIG
- 父zone的ZSK对子zone的KSK的DS进行签名,生成RRSIG(DS),放在父zone处
- 信任链:DNSKEY(信任锚) -> [DS -> DNSKEY]* -> RRset
3)报文的新标记
- Checking Disabled(CD)标记
- 由解析器在Query中设置,禁止递归服务器端进行真实性验证(由解析器自己来检查)
- 若未设置,则由递归服务器检查
- Authenticated Data(AD)标记
- 由递归服务器在Response中设置,表示应答中的Answer和Authority部分的所有数据通过了验证
- 若未设置,则尚未验证
- DNSSEC OK(DO)标记
- 由递归服务器在Query中设置,表示支持DNSSEC
- 若未设置,则权威在应答中不应有DNSSEC信息示
4)递归服务器的状态
- Secure:具有一个信任锚,并获得了一条信任链,能够验证应答中的所有签名
- 应答中设置AD标记
- Insecure:具有一个信任锚,一条信任链,但在一个授权点不存在DS记录,表示后续子分支无DNSSEC保护
- Bogus:具有信任锚,授权信息表明该数据应该被签名,但应答为通过验证
- Indeterminate:为缺省操作模式,没有信任锚来表明空间树上特定部分是安全的
5)key更新—Key Rollover(密钥滚动)
- 原因:ZSK使用频率较高,密钥长度一般较短,以提高性能和效率,同时也意味着其安全性较低,需要定期更换
- Pre-Publish Zone Signing Key Rollover:提前发布Key
- Double-Signature Zone Signing Key Rollover:同时发布Key和SIG
4.2 DoT/DoH
- 加密DNS流量,保护DNS通信
- 主要保护桩解析器间的通信
DoT
DNS over TLS
- TLS(传输层安全协议)
- 目标:提供通信加密通道,保护通信内容的CIA安全属性
- 工作在传输层,基于TCP建立安全连接
- SSL是TLS的前身(TLS=SSL V3.1)
- 默认443端口
- 流程
- 握手阶段
- 确定使用的算法等会话参数
- 交换并认证数字证书,交换密钥,产生共享的对称密钥
- 数据传输阶段
- 使用对称密钥进行加密通信
- 握手阶段
DoH
DNS over HTTPS
- 使用HTTPS协议传输DNS请求/应答
GET
/POST
发送DNS请求,返回内容为DNS应答
4.3 ODNS
Oblivious DNS
- ODNS桩解析器在本地
- 递归服务器知道“who”,不知道“what”
- 域名使用ODNS权威服务器的公钥加密
- ODNS权威服务器知道“what”,不知道“who”
This post is licensed under CC BY 4.0 by the author.