基础背景
Cloud Native
DNS(Domain Name System)[1]是任何网络活动的基础。它将易于记忆的域名转换为机器能够理解的 IP 地址。监控 DNS 服务可以帮助用户识别网络活动并保持系统安全。出于合规和安全性的考虑,公司通常要求对网络日志进行存储和分析。通过 DNS 日志,可以清晰了解企业域名解析的使用情况,于发现配置错误和不必要的网络障碍,减少系统中断,在帮助企业对用户行为、网络行为进行审计的同时,及时发现潜在的安全问题。
DNS 解析流程
DNS 记录类型
以上是一些基本的 DNS 记录类型,每种类型在日常网络和域名的解析中扮演着重要角色。
日志审计
Cloud Native
日志审计应用概况
如何开通 DNS 日志采集
3. 在全局配置页面,将 DNS 的日志审计开关打开并选择中心项目 Project 所在区域,例如 cn-hangzhou;详细操作步骤参见开启日志采集功能[6]。
其他功能
此外,除了基础存储、查询、告警等 SLS 功能外,还支持跨账号[7]采集、精细化采集策略[8]、Terraform[9]配置等功能。此处不详细展开,用户可以参考内网 DNS 日志转存 SLS[10]进行配置使用。
DNS 日志详情
Cloud Native
具体的日志字段内容,及解释请参见附录。
内网请求应答示例
DNS 请求日志
例如我们查询阿里云日志服务控制台 sls.console.aliyun.com 的 ip 地址。
dig sls.console.aliyun.com +short
模块应答日志
发出请求后,首先得到一条递归模块应答日志,从根域名服务器开启递归,得到sls.console.aliyun.com. 的 CNAME 记录为 sls-console-adns.console.aliyun.com.
全局应答日志
最后我们得到一条完整的全局应答日志,从而找到 sls.console.aliyun.com. 对应的 ip 地址。
公网解析日志示例
配置公网域名流量分析
查看公网权威解析日志
dig y*****.online @dns27.hichina.com
全局流量管理日志示例
配置全局流量管理模块
查看全局流量管理日志
dig ti*****.g****.net +vc
其响应日志内容记录在日志审计中如下:
洞察 DNS 日志
Cloud Native
因为 DNS 日志包含了丰富的信息,所以知道这些字段的具体解释,以及这些字段出现异常时,其内容所代表的特殊意义,对于我们在网络安全和网络性能中排查定位将会提供很大帮助。下面,本文大概总结了一些在监控 DNS 日志时安全运营人员应该注意的信号,掌握这些信号就可以快速而轻松地发现问题。详情可参见附录中日志字段的详细介绍。
-
query_name 字段,其内容为查询的完全限定域名 (FQDN[14], fully qualified domain name),可以让用户知道每一次请求应答的具体查询内容。如果查询的 Domain 出现在恶意域名列表上,那么该日志就可以作为安全威胁的证据。此外,过多重复的查询可能是恶意活动的一个指标,例如 DoS 攻击,在这种攻击中,恶意行为者让目标域名的服务器不堪重负,发送异常超高量的 DNS 查询。
-
query_type 字段,包含请求的记录类型,当搜寻恶意活动时可以提供有用的上下文。例如,文本(TXT)记录经常被用于指挥和控制(C2)攻击以及 DNS 隧道攻击。详细的记录类型可以参见前文背景介绍。
-
rt 字段,其内容为请求应答时间,如果 query_type 为 GLOBAL,则为全局应答,表示整个请求到应答的时延,否则模块日志 rt 仅表示在模块内部消耗的时延。如果 rt 值异常提升可能是网络连接问题的一个信号。例如,如果安全运维人员注意到与 DNS 日志中 rt 值升高相关的超时错误激增,你可能会推断超时错误是在 DNS 解析过程中发生的,这将表明用户的 DNS 服务器可能存在问题。
-
rcode 字段,即响应状态码,例如:0 表示 NOERROR,没有错误,查询域名成功;1 表示 FORMERR,格式错误,DNS 无法解析该请求;2 表示 SERVFAIL,即 DNS 服务器遇到内部错误或者超时引起的解析失败。rcode 为 2 是 DNS 无法从权威名称服务器获取有效响应时常见的一种错误。记录这个值的日志可以帮助运维人员找出问题的根本原因。
-
answer_rrset 字段,包含 DNS 所请求的信息返回的 IP 地址集合,例如 [www.taobao.com 600 A 1.1.1.1],这个字段的常见值 ip,可以帮助安全运维人员在本地网络上定位受损机器。在公共互联网上,这些 IP 地址可以与恶意行为者 IP 地址的数据库对照检查,例如可以发现是否存在 DNS 劫持行为等。
-
dns_msg_flags 字段,该字段中有许多请求标志(QR、RD、AA、TC 等),表明如查询是否是递归的、是否包含 DNSSEC 状态等。这些标志可以为 DNS 请求提供重要的上下文,例如所请求的 DNS 记录是否来自它的权威名称服务器、以及数据是否被修改。
解析路径劫持
原理背景
通过对 DNS 数据包“请求阶段”中的解析路径进行划分,我们将 DNS 解析路径分为四类。
-
首先是正常的 DNS 解析路径(Normal resolution),用户的 DNS 请求只到达指定的公共 DNS 服务器;此时,权威服务器应当只看到一个来自公共服务器的请求。
-
请求转发(Request redirection),用户的 DNS 请求将直接被重定向到劫持者的解析服务器,解析路径如下图红色路径所示;此时,权威服务器只收到来自这个服务器的请求,用户指定的公共 DNS 服务器完全被排除在外。
-
请求复制(Request replication),用户的 DNS 请求被网络中间设备复制,一份去往原来的目的地,一份去往劫持者使用的解析服务器,解析路径如下图橙色路径所示;此时,权威服务器将收到两个相同的查询。
-
直接应答(Direct responding),用户发出的请求同样被转发,但解析服务器并未进行后续查询而是直接返回一个响应,解析路径如图紫色路径所示;此时,权威服务器没有收到任何查询,但是客户端却收到解析结果。
下面我们将构造一个直接应答的解析路径劫持实验:
1)正常请求返回及日志审计 DNS 日志记录如下:
dig aaa.y******.online
[aaa A 172.16.0.189]
4)自建 dns 服务器直接应答,跳过前往权威 dns 服务器查询请求过程
PrivateZone 域名转发
配置域名转发
验证域名转发
解析失败、解析请求异常和解析 RT 异常
解析失败
rcode 是作为应答日志可以反映基本的解析状态,rcode 返回值 SERVFAIL(2)或者 NXDOMAIN(3)是两个较为典型且常见的解析失败场景,前者说明 DNS 服务器遇到内部错误或者超时引起的解析失败,后者表示这个域名并未找到。此时我们结合具体的用户阿里云 Uid 信息,和具体的 ECS 信息(内网场景)则可以更快捷地定位到此时出现问题的服务。下表是查找访问不存在的域名(rcode=3)的汇总统计记录。
rcode :3 and GLOBAL | select distinct(query_name), ecs_hostname, region_id, vpc_id, user_id
解析请求异常
前文已经提到,query_name 字段如果出现安全异常值(例如安全威胁库中已知的恶意地址),则可以作为一个非常直观的安全威胁的证据指标,另外某些 query_name 的解析量飙升,也可以作为判断 DoS 攻击的依据,下面是一个 vpc 下,通过全局响应日志进行 query_name 统计的图表示例,如果从中发现了对某些已知恶意域名的访问,则可以进一步排查,找到安全威胁:
* and vpc_id: vpc-j6cd*****mgkrt6 and ( region_id : cn-hongkong ) and GLOBAL and ( region_id : cn-hongkong ) and rcode: 0 |select count(*) as total_req, query_name group by query_name
正常情况下域名的解析请求量维持在一个可控平稳的范围(如下图),如果出现某个域名的请求量出现陡增,例如从 20 次/min 提升到了 1000 次/min,说明该域名可能遭受了攻击,可以通过创建告警分组评估[16],分别监控需要特殊关注的域名目标,通知到响应的安全运维人员处。
* and vpc_id: vpc-j6cd*****mgkrt6 and ( region_id : cn-hongkong ) and GLOBAL and rcode: 0 |select date_trunc('minute', __time__ )as t , query_name, count(*) as total_req group by t, query_name
解析请求 RT 异常
解析响应时间异常同样值得引发注意,这里我们仅用全局应答日志的 RT 进行统计分析,全局应答日志的 RT 是表示整个查询到应答的时延,解析路径的各个模块也包括在内,因为有 CACHE 模块的存在,正常情况下响应时延在一个可控范围。如果某个域名的 RT 突然提升,有可能是因为用户的 DNS 服务器网络配置存在问题,或者是遭遇了网络攻击,此时的域名解析服务器已经不堪重负,因此 RT 的统计分析也是非常有价值的观测指标。
* and vpc_id: vpc-j6cd*****mgkrt6 and ( region_id : cn-hongkong ) and GLOBAL and rcode: 0 |select date_trunc('minute', __time__ )as t , query_name, avg(rt)
as avg_rt where rt>=60 group by t, query_name
附录
DNS 日志字段
日志字段用户侧 |
说明及示例 |
__topic__ |
固定字段,表示日志类型
|
user_id |
阿里云账号 ID 示例:17387********105 |
region_id |
示例:”cn-beijing” |
vpc_id |
仅限内网 DNS 日志 示例:”vpc-2zek23lhcq11vwutcpq2q” |
ecs_id |
ECS 实例ID,例如:i-2******************94 |
ecs_hostname |
ECS 主机名,例如:Y*****-c***-d**-02 |
module_type |
解析模块类型,包括:
|
resolve_path |
解析路径, 使用半角逗号(,)分割,仅全局应答日志包含。 示例:”1,1,1,1,1″ 按照’,’分割分别表示 权威加速,权威普通,缓存,转发,递归模块, 1:表示经过该模块 0:表示跳过该模块 |
src_addr |
请求地址 示例:”1.1.1.1″ |
dst_addr |
响应地址 示例:”1.1.1.1″ |
src_port |
请求端口 示例:1234 |
dst_port |
响应端口: 示例:53 |
transport |
通信协议 示例:”UDP”、 “TCP” |
dns_msg_id |
DNS信息ID,表示本次DNS查询的唯一识别码 |
dns_msg_flags |
DNS信息Flags
|
query_name |
完全限定域名 示例:”www.taobao.com.” |
query_type |
记录类型
|
rcode |
仅限应答日志 表示以下响应状态码等:
|
answer_rrset |
回答资源记录集 示例: [“www.taobao.com 600 A 1.1.1.1″, www.taobao.com 600 A 2.2.2.2”] |
authority_rrset |
权威 资源记录集 示例: [“taobao.com 600 SOA ns4.taobao.com. hostmaster.alibabadns.com. 2018011109 3600 1200 3600 360”] |
additional_rrset |
其他资源记录集 示例:[“www.taobao.com 600 A 1.1.1.1”] |
edns |
DNS扩展协议 示例:”flags: DO udp: 1408 CLIENT-SUBNET: 1.1.1.1/32/24″ |
rt |
动态字段,仅全局应答和模块日志包含, 单位:ms 全局应答rt: 表示整个查询到应答的时延 模块日志rt: 表示在模块内部消耗的时延 示例:50 |
view_name |
用户dns请求命中线路名称 示例:DEFAULT |
z_name |
仅限公网解析日志和全局流量管理日志 表示匹配权威zone的zone name 示例:y*******.online |
wild_len |
仅限公网解析日志和全局流量管理日志 命中泛域名时候泛域名(wire格式)长度 示例:*.a. 长度为5 |
value |
应答日志资源记录集中value部分 |
subnet |
DNS扩展协议字段中subnet部分 |
原创文章,作者:速盾高防cdn,如若转载,请注明出处:https://www.sudun.com/ask/94253.html