Improve DNS security for apps and servers
Privacy & Security 进阶 20m

提升应用和服务器的 DNS 安全性

Improve DNS security for apps and servers

2022年6月6日

在 Apple 官方观看视频

一句话判断

iOS 16 和 macOS Ventura 终于支持客户端 DNSSEC 验证——如果你在构建安全敏感的网络应用,这意味着 DNS 层面的钓鱼和劫持攻击可以被彻底阻断。

这场 Session 讲了什么

Apple 网络安全团队的 Qiaoyu Deng 讲解了 DNS 安全的根本问题以及 iOS 16/macOS Ventura 中的两个解决方案:DNSSEC(DNS 安全扩展)和 DDR(DNS 发现机制)。

DNS 作为互联网的基础设施,历史上既没有认证也没有加密。这使得 DNS 缓存投毒(伪造 IP 地址指向恶意服务器)和 DNS 嗅探(窃听用户浏览历史)成为可能。TLS 保护了通信内容,但 DNS 作为更底层的基础仍然是脆弱的。

DNSSEC 通过数字签名认证 DNS 响应,确保数据未被篡改。DDR 则通过自动发现支持加密 DNS 的服务器,实现 DNS 查询的自动加密。

值得深挖的点

DNSSEC 的信任链机制。 DNSSEC 从根信任锚(预装在设备上)开始,逐级建立信任链:根区域签名 -> 顶级域名签名 -> 具体域名签名。客户端验证每一级的签名,确保最终获得的 IP 地址是真实未被篡改的。

NSEC 记录防止”伪造存在”攻击。 NSEC 记录按字母序列出区域中存在的记录名。如果攻击者声称一个不存在的域名存在,客户端可以通过 NSEC 记录检测到——该名称不在任何两个连续 NSEC 记录之间。

验证失败不返回错误——等同于无响应。 DNSSEC 验证失败时,客户端不会返回错误码,而是直接丢弃伪造的响应。这等价于没有收到任何响应。当设备切换到安全的网络后,解析会自动恢复正常。

DDR 的自动加密发现。 在 iOS 14 中引入的加密 DNS 需要手动配置。iOS 16 的 DDR 让设备能够自动发现网络中支持加密 DNS 的服务器,无需用户或开发者手动配置。

代码片段

import Network

// NSURLSession: 在会话级别启用 DNSSEC
let config = URLSessionConfiguration.default
config.requiresDNSSECValidation = true  // 启用 DNSSEC 验证
let session = URLSession(configuration: config)
// 此会话的所有请求都会进行 DNSSEC 验证

// NSURLSession: 在单个请求级别启用 DNSSEC
let defaultSession = URLSession(configuration: .default)
var request = URLRequest(url: url)
request.requiresDNSSECValidation = true  // 仅此请求启用
let task = defaultSession.dataTask(with: request)

// Network.framework: 启用 DNSSEC
let parameters = NWParameters.tcp
parameters.requiresDNSSECValidation = true
let connection = NWConnection(host: "example.com", port: 443, using: parameters)
// 连接只会在 DNSSEC 验证完成后才进入 ready 状态
connection.start(queue: .main)

最佳实践

  • 启用 DNSSEC 前确保你的域名支持 IPv6——在纯 IPv6 环境中,合成的 IPv6 地址无法通过 DNSSEC 验证
  • 确保你的 DNS 服务商支持 DNSSEC 签名
  • 对安全敏感的连接(如登录、支付)启用 DNSSEC 验证
  • DNSSEC 会增加少量 DNS 流量和解析时间,仅在必要时启用
  • 可以在会话级别或请求级别灵活控制 DNSSEC 的启用范围
  • DDR 让加密 DNS 可以自动配置,配合 DNSSEC 实现 DNS 层面的完整安全

还有什么值得关注

  • DNSSEC 验证失败时应用不会收到明确的错误信息,连接会一直等待直到超时或切换网络
  • 配合 “Enable encrypted DNS”(WWDC 2020)Session 了解加密 DNS 的完整配置
  • 某些网络可能不支持 DNSSEC 所需的 DNS over TCP 和 EDNS0 协议
  • DDR 的自动发现机制减少了用户配置加密 DNS 的门槛
WWDC 2022