A Deep Dive into DNS Security for Beginners
作者:禅与计算机程序设计艺术
1.简介
1.1 引言
互联网服务目前已经成为世界范围内最流行的服务之一,越来越多的人开始使用互联网产品和服务。而网络服务中的域名系统(Domain Name System,DNS)也扮演着至关重要的角色,作为解析域名到 IP 地址的中间件,它确保用户在浏览网站时能够访问正确的页面。但是,随着互联网的发展,许多公司越来越重视网络安全,希望限制对 DNS 服务的攻击和欺骗行为。因此,现在越来越多的公司开始开发防御性的 DNS 安全产品,如基于防火墙、入侵检测系统、Web 安全防护、动态 DNS 等等。
然而,对于刚接触 DNS 安全的初学者来说,理解 DNS 的工作原理,以及如何在自己的网络环境中配置 DNS 安全方案并有效保障 DNS 服务器的安全,仍然是一个难点。本文将从以下几个方面详细介绍 DNS 安全的相关知识:
- DNS 是什么?
- DNS 协议和机制
- DNS 缓存投毒攻击
- DNS 欺骗与劫持
- DNS 劫持攻击及防范
- 域名服务器的配置管理和 DNSSEC 设计
- DNS 治理与运营监控
- DNS 名册传输方式选择
- 对策建议
通过阅读本文,可以帮助读者了解 DNS 安全、防御以及运维方面的一些知识。
1.2 DNS 是什么?
域名系统(Domain Name System,DNS)是互联网的一项服务,用于域名到 IP 地址之间的转换。每当用户在浏览器输入域名后,就会自动请求 DNS 服务器解析出对应的 IP 地址进行通信。DNS 将域名转换成 IP 地址,使得域名解析更加容易,并且使通信更加快速。目前,世界上已有数十亿的域名,但仍然没有解决全球分布式计算机网络的单个中心问题。DNS 通过将域名映射到相应的 IP 地址,让用户可以在网络上找到所需的信息或资源。它还负责提供各种服务,例如邮件发送,即时消息传递,以及网络连接。
域名系统由分层的 DNS 服务器组成,它们按照分布式网络结构组织起来,形成一个全局的、覆盖全球的分布式数据库。这些服务器存储着互联网上使用的各种域名和 IP 地址信息,当用户需要查询某个域名对应的 IP 地址时,就向本地 DNS 服务器发起请求。如果本地 DNS 服务器找不到记录,它会向根 DNS 服务器请求授权,授权服务器将响应递送给本地 DNS 服务器,再向顶级 DNS 服务器请求授权,最终找到域名对应的 IP 地址。
图 1 DNS 架构示意图
2. DNS 协议和机制
2.1 DNS 查询过程
当用户访问一个网站时,首先要确定该网站的 IP 地址。为此,用户向本地 DNS 服务器提交域名的请求,本地 DNS 会检查自身的缓存中是否存在对应记录,如果存在则直接返回结果;如果不存在,则向对应的 ROOT DNS 服务器请求授权,ROOT DNS 告诉本地 DNS 服务器下一步应该请求哪个顶级 DNS 服务器;本地 DNS 服务器向顶级 DNS 服务器请求授权,然后把结果返回给用户,顶级 DNS 服务器再向权威 DNS 服务器请求授权,最后返回结果给本地 DNS 服务器,并把结果缓存到本地。如下图所示:
图 2 DNS 请求过程
2.2 DNS 数据包格式
DNS 报文格式共包括三种类型:
- 查询报文:用户浏览器向 DNS 发出查询报文,请求进行域名解析,通常采用 UDP 协议。
- 回答报文:当 DNS 接收到查询报文时,如果在自己的数据库中找到了相应的记录,则回复回答报文,将域名指向的 IP 地址放入回答报文中。
- 错误报文:当 DNS 收到查询报文时,发现数据库中没有相应的记录,或者不支持请求的类型,则会返回错误报文。
其中,DNS 查询报文和回答报文均包括五个字段:
- Header:共占两字节,用于标识 DNS 报文的 ID 和 QR 标志位。ID 是 DNS 报文的唯一标识符,用于标识每个 DNS 查询事务,QR 为响应报文(1)还是查询报文(0)。
- Question Record(查询记录):占 10 个字节,用于指定域名的类型和类别。
- Answer Record(回答记录):最多可容纳多个回答记录,每个回答记录占 11 个字节。
- Authority Record(授权记录):可容纳多个授权记录,每个授权记录占 11 个字节。
- Additional Record(附加记录):可容纳多个附加记录,每个附加记录占 11 个字节。
每个字段都以固定的长度进行编码。Header 字段包括两个字段——ID 和 QR,前者用来标识 DNS 报文的唯一 ID,后者用于指示报文是查询报文(0)还是回答报文(1)。Question Record 中的 TYPE 和 CLASS 字段分别表示查询的域名类型和类别。回答记录和授权记录中各自存放着查询的域名的 IP 地址、主机名、TTL(Time To Live,生存时间),以及其他扩展字段。Additional Record 中一般为空。
查询报文和回答报文示例:
// 查询报文示例:
ID: 1234
QR: 0 (查询报文)
Opcode: 0 (标准查询)
AA: 0 (非权威应答)
TC: 0 (非截断报文)
RD: 1 (期望递归)
RA: 0 (非递归可用)
Z: 0 (RESERVED)
RCODE: 0 (无差错)
QDCOUNT: 1 (查询数量为 1)
ANCOUNT: 1 (回答数量为 1)
NSCOUNT: 0 (授权数量为 0)
ARCOUNT: 0 (附加数量为 0)
Query: www.example.com IN AAAA
|--------------|
域名 QTYPE
Query Data区 |-------------------|
数据 |---------------------|
查询数据区示例
||
可用查询类型为AAAA
// 回答报文示例:
ID: 1234
QR: 1 (回答报文)
OPCODE: 0 (标准查询)
AA: 0 (非权威应答)
TC: 0 (非截断报文)
RD: 1 (期望递归)
RA: 0 (非递归可用)
Z: 0 (RESERVED)
RCODE: 0 (无差错)
QDCOUNT: 1 (查询数量为 1)
ANCOUNT: 1 (回答数量为 1)
NSCOUNT: 0 (授权数量为 0)
ARCOUNT: 0 (附加数量为 0)
Answer:
1 answers:
[DNS Resource Record of type AAAA with TTL=3600]
NAME: www.example.com
RDLENGTH: 16 bytes
TTL: 3600 seconds
RDATA: fd00:a516:7c1b:17cd:6d81:2137:bd2a:2c5b
|---------------|------------------|
IPV6 地址
|------------------------------------|------------------|
Answer Record Section |---------------|-----------------------|
回答记录区 |-------------------------|
回答记录示例
||
IPv6 类型的回答记录
1 name server record(s):
[DNS Resource Record of type NS with TTL=600]
NAME: example.com
RDLENGTH: 10 bytes
TTL: 600 seconds
RDATA: ns1.example.com
|-----------|---------------|
名称
|----------------------|-----------------|
authority records section(s):
empty
additional records section(s):
empty
代码解读
2.3 DNS 缓存投毒攻击
DNS 缓存投毒攻击是一种威胁 DNS 服务器的攻击方法,它利用 DNS 缓存中保存的过时的信息,误导用户访问到恶意站点或域名。此攻击方法可以分为四步:
- 漏洞分析:收集 DNS 缓存投毒攻击工具、漏洞验证脚本等。
- 搭建测试环境:设置多个域,模拟不同地区的用户访问,并配置恶意的 DNS 服务器,然后安装恶意软件。
- 攻击演练:黑客通过精心构造的 URL 来诱导受害者点击,并等待受害者打开链接。
- 观察反应:实施攻击后,观察 DNS 服务器的行为,检查其是否发生变化。如果 DNS 服务器缓存的条目被修改,那么攻击就成功了。
2.4 DNS 欺骗与劫持
DNS 欺骗攻击和劫持攻击都是利用 DNS 服务来获取对方真实 IP 地址的一种攻击手段。下面简要介绍两种 DNS 欺骗攻击方法:
- DNS 缓存污染攻击:DNS 缓存污染攻击是利用 DNS 缓存服务器上的缓存记录,对网站的正常访问造成严重影响。攻击者可以创建虚假的、指向其它目的地址的 DNS 记录,同时将伪造的记录加入到 DNS 缓存中,导致用户在访问网站时产生错误的连接。
- 绕过 DNS 过滤:DNS 过滤是指防火墙或路由器在对 DNS 查询进行处理时,只允许特定的域名服务器响应 DNS 查询。攻击者可以选择一个看起来合法的 DNS 服务器来响应 DNS 查询请求,进而避开 DNS 过滤规则。
DNS 劫持也是一种 DNS 攻击手段,它允许攻击者篡改目标域名的 DNS 记录,把它指向自己的服务器,替换掉原有的目的服务器的记录,甚至可以完全控制目标域名的解析结果。劫持攻击可以分为两种:
- 域名劫持:域名劫持是利用 DNS 的权威服务器故意拒绝某些域名解析请求。攻击者注册一个域名,并指向自己的服务器,让它拒绝任何其他服务器的域名解析请求。这样就可以屏蔽访问目标网站的所有请求。
- 浏览器劫持:浏览器劫持是指恶意站点嵌入恶意代码,尝试劫持用户访问目标网站。攻击者会隐藏在网站的恶意代码里,劫持用户的访问,然后安装自己制作的木马。由于用户对木马的信任程度远低于恶意站点,所以很少有用户会注意到它。
2.5 DNS 劫持攻击防范措施
为了防止 DNS 劫持攻击,除了配置 IP 黑白名单外,以下措施可供参考:
- 使用公共 DNS 服务器:很多 DNS 提供商提供了免费的公共 DNS 服务器,可以代替私有 DNS 服务器,可以降低 DNS 劫持攻击的风险。另外,各大互联网公司也在积极推动 DNS over HTTPS 技术,通过加密通信的方式防止 DNS 劫持攻击。
- 配置 DNS 转发器:如果用户的设备连接的是 VPN 网络,则可以配置 DNS 转发器,将 DNS 请求转发给公共 DNS 服务器。这样可以减轻本地 DNS 服务器的压力,避免出现 DNS 劫持攻击。
- 使用隐私保护模式:在浏览器的隐私模式下浏览网页,可以减少 DNS 请求,降低 DNS 劫持攻击的风险。
- 更新系统软件:系统软件的升级可能会带来新的安全功能,提高 DNS 服务器的安全性。
2.6 域名服务器的配置管理和 DNSSEC 设计
DNS 记录存储在域名服务器上,是一台独立的计算机。为了保证数据的安全,域名服务器提供了 DNS 安全 Extensions(DNSSEC)技术,它通过数字签名的方式验证 DNS 记录的完整性、保密性和来源不可抵赖性。DNSSEC 可以为 DNS 数据提供强大的防篡改功能,有效保障域名信息的真实性、保密性和完整性。
2.6.1 域名服务器的配置管理
域名服务器需要设定各种参数,例如,运行 IP 地址、域名权限等。为了保证域名服务器的安全性和可用性,需要对其进行合理的配置管理。这里推荐以下几点:
- 设置 IP 白名单:IP 白名单是一个用来限制域名服务器可绑定到哪些 IP 地址的列表,可以有效防止域名服务器被恶意攻击。如果允许外部的计算机访问域名服务器,就要小心谨慎。
- 分配合适的资源:分配足够的内存、CPU 和磁盘空间,可以避免因过多资源占用带来的性能问题。
- 设置守护进程:设置守护进程可以避免因为异常退出导致的资源泄露和攻击。
- 创建备份:定时备份域名服务器的配置文件和日志文件,可以保持数据的完整性和可用性。
2.6.2 DNSSEC 设计
DNSSEC 提供了针对 DNS 记录的强大防篡改功能,可以通过数字签名来实现。简单地说,DNSSEC 的实现分为三个阶段:
- 密钥生成:需要使用 RSA 或 ECDSA 等非对称加密算法,生成一对密钥对,公钥放在 DNS 服务器的 DNSKEY 资源记录中,私钥保留在本地。
- 证书签名:使用私钥对待签名的 DNSKEY 资源记录进行签名,得到一个 DNSKEY 签名资源记录。将这个签名资源记录放在待签名的 DNS 记录上,一起提交给域名服务器。
- 验证签名:域名服务器对待验证的 DNS 记录进行验证,先从 DNS 记录中取出 DNSKEY 资源记录,用公钥验证签名。如果签名验证通过,则说明该 DNS 记录没有被篡改。
除此之外,还有很多其他 DNSSEC 技术可以提升 DNS 记录的安全性,比如 DNS 刷新、NSEC 和 NXT 记录等。
2.7 DNS 治理与运营监控
DNS 的治理主要包括记录管理、统计分析、安全事件响应、法规遵从、政策法规、可靠性保证等方面。DNS 的运营监控主要包括 DNS 服务器健康状况监测、DNS 安全事件检测、域名查询量统计、安全配置管理、预警与报警、异常流量监测等。
2.7.1 记录管理
DNS 记录的管理可以分为三个层次:基础记录、一级域记录和二级域记录。基础记录包括 SOA、NS、MX、CNAME、PTR、TXT 等,一级域记录包括 A、AAAA、SRV 等,二级域记录包括 NS、MX、SOA、TXT 等。
2.7.1.1 基础记录
SOA 资源记录(Start Of Authority):该记录保存在顶级域(TLD)的 DNS 服务器上,用于标识该域名服务器所在的区域。它会标识区域的管理员、电子邮箱、序列号和刷新间隔等信息。通过修改 SOA 记录可以修改所有顶级域记录。
NS 资源记录(Name Server):该记录保存在顶级域的 DNS 服务器上,用于标识该区域的域名服务器地址。
MX 资源记录(Mail Exchanger):该记录保存在二级域的 DNS 服务器上,用于标识区域中的邮件交换机地址。
CNAME 资源记录(Canonical Name):该记录用于将多个名字映射到同一 canonical name 上,方便于记录管理。例如,www.google.com 记录可以指向 google.com 的 A 记录。
PTR 资源记录(Pointer Record):该记录用来将 IP 地址转换为域名,它保存在另一台服务器上。
TXT 资源记录(Text Record):该记录用于保存文本字符串。
2.7.1.2 一级域记录
A 资源记录(Address Record):该记录用于将域名指向指定的 IP 地址。
AAAA 资源记录(IPv6 Address Record):该记录用于将域名指向指定的 IPv6 地址。
SRV 资源记录(Service Locator Record):该记录用于记录服务的位置和端口号。
2.7.1.3 二级域记录
NS 资源记录(Name Server Record):该记录用于标识区域的域名服务器。
MX 资源记录(Mail Exchange Record):该记录用于标识区域的邮件交换机地址。
SOA 资源记录(Start Of Authority Record):该记录用于标识区域的管理员、电子邮箱、序列号和刷新间隔。
TXT 资源记录(Text Record):该记录用于保存文本字符串。
2.7.2 统计分析
DNS 查询量统计可以根据 DNS 请求的目的地址、请求的源地址、查询的类型以及查询响应的时间来进行统计。
2.7.3 安全事件响应
安全事件响应包括安全事件排查、安全事件评估、安全事件通知、安全事件处置等方面。安全事件的排查一般包括收集相关信息、调查原因、采取补救措施,及时向管理人员报告事件。
2.7.4 法规遵从
法规遵从包括收集相关信息、评估事件的影响、采取措施、及时报告事件、跟踪事件的进展。
2.7.5 政策法规
政策法规包括研究国家和地区的相关法律法规、关注新出现的问题、做好事件的总结及研判等。
2.7.6 可靠性保证
可靠性保证主要包括 DNS 服务器的冗余部署、 DNS 服务器的高可用性和负载均衡、 DNS 服务器的监控、 DNS 服务器的高效配置等。
