中文站

快速成长期应用架构实践-防劫持攻击

我们在访问某些特定站点或者是所有站点时,有时会弹出广告。比较典型的是,当宽 带快要欠费的时候,运营商会弹出页面提醒你续费。这是怎么做到的呢?其实就是通过流 量劫持的方式。

流量劫持方式主要分为两类:一是 DNS 劫持,在用户通过域名系统访问目标的时 候劫持域名解析的回包,目标域名会被恶意地指向其他恶意 IP 地址,造成用户无法正 常使用服务,甚至造成弹广告、挂马、搜集账号密码、DDoS 等更加严重的危害;二是 链路劫持,对于服务器返回的数据包内容进行篡改或者抢先与服务器进行回包,在回包 中强行插入恶意业务逻辑,干扰用户的正常使用,同样会造成广告、挂马等一系列的危 害后果。

2015 年,代码托管网站 GitHub 遭遇大流量 DDoS 攻击。攻击者使用了链路劫持技术, 通过劫持百度广告联盟的 JS 脚本并将其替换成攻击 Github 的恶意代码,然后访问百度海 量用户的浏览器加载改恶意代码,发动针对 GitHub 的大规模分布式拒绝服务攻击。2016 年,美国最大的比特币公司 Blockchain 遭遇了 DNS 劫持,导致 Blockchain 的用户正常登录 后被引导至错误的页面,从而导致 Blockchain 的巨大损失。

DNS 劫持 

DNS 劫持最直接的手段是通过入侵 DNS 服务器,获取攻击目标域名的解析记录控制 权,之后修改攻击目标域名的解析结果,等到 TTL 时间生效之后,所有对该域名的访问由 原 IP 地址指向修改后的恶意 IP。DNS 劫持的后果就是对被修改域名记录的网址不能访问, 甚至访问到虚假网址,导致用户数据被盗、被挂马的严重危害。

通常的 DNS 查询没有强大的认证机制作为安全保证,而且 DNS 查询通常基于无连接 不可靠的 UDP 协议,因此 DNS 的查询非常容易被篡改,通过对 UDP 端口 53 上的 DNS 查 询进行侦听,一经发现与关键词相匹配的请求,则立即伪装成目标域名的解析服务器(NS, Name Server)给查询者返回虚假结果,从而实现窃取资料或者破坏原有正常服务的目的。 还有一种手段是黑客伪造权威 DNS 服务器的应答,对缓存 DNS 服务器进行污染。

DNS 劫持对策 

DNS 劫持往往是针对个人,分布在不同的运营商和不同的网络中。就个人而言,针对 DNS 劫持,可以采用使用国外免费公用的 DNS 服务器解决,例如 GoogleDNS(8.8.8.8); 针对 DNS 污染,可以使用 VPN 或者域名远程解析的方法解决,但这大多需要购买付费的 VPN 或 SSH 等,还可以通过修改本地 Host 文件的方法,手动设置域名正确的 IP 地址,但 这样会大大提高维护成本。

对于服务提供方,需要对 DNS 劫持进行持续的检测。大量的终端布点可以检测 DNS 劫持的情况,帮用户针对劫持向运营商投诉。同时,现在越来越多的互联网厂商开始使用 HTTPDNS 服务,能够从一定程度上缓解 DNS 劫持的影响。HTTPDNS 基本原理如图 4-48 所示。 


图 4-48 HTTPDNS 基本原理

如何使用 HTTPDNS 服务 

开通服务,在 HTTPDNS 服务提供商出注册账号,开通 HTTPDNS 服务。 

控制台添加域名

在HTTPDNS提供商的服务台申请HTTPDNS服务,这可能涉及费用(一般的HTTPDNS 服务提供商会有一定的免费查询次数,如果超过了这个次数就需要额外的费用)。假设我们 通过控制台获得了 HTTPDNS 服务商提供的账号,就直接在控制台上提价所需要解析的域 名记录,一般几分钟之后会在 HTTPDNS 服务端生效。

使用 HTTPDNS 解析域名 

使用 HTTPDNS 解析域名,可以使用类似下面的方式进行。http://httpdns-service.com? host=www.yourdomain.com,其中 http://httpdns-service.com 是 HTTPDNS 的提供方,www. yourdomain.com 是需要解析的域名。具体的 API 接口规范可参考 HTTPDNS 的服务提供商。

客户端集成 HTTPDNS 

在通过 HTTPDNS 设置获得域名的 IP 地址后,客户端应用能够利用这个 IP 发起业务 请求。

链路劫持 

链路劫持是指第三方(可能是运营商、黑客或者内鬼)通过在用户客户端至服务器之 间的网络线路中植入恶意设备,侦听用户和服务器之间的通信数据,达到窃取和篡改用户 重要数据的目的。链路劫持最常用的就是在网页中植入广告,当然也可以进行挂马、钓鱼, 还可以窃取帐号密码、银行卡、身份证等重要个人数据。

链路劫持的原理是侦听网络上的数据包,发现某些设定特征的包时,抢在服务器回包 之前进行回包,这样客户端会自动忽略服务器真正的响应包而接受先到的假回包,从而受 到欺骗和劫持。

链路劫持对策 

从链路劫持的原理来看,其实是网络链路上侦听、伪造 TCP 包,达到控制目标网络链 路的行为。我们发现核心的问题是,客户端没有办法识别返回的应答是服务器返回的,还是第三方返回的,所以信任了第三方的应答,丢弃了真正的应答。解决这个问题可以通过 全程 HTTPS 来解决,如图 4-49 所示,HTTPS 使用了加密技术,第三方无法知道通信的密 钥,保证通信的安全而不被劫持。 


图 4-49 通过全程 HTTPS 解决链路劫持问题  

HTTPS 服务部署实践 

获取 CA 证书 

SSL服务首先需要申请 SSL 证书。证书可以分成付费和免费的两种,产品可以根据自身的需求进行选择。在申请证书的时候,需要提供大量的信息以供 CA 机构备案和签署证书。

以网易云基础服务为例,通过平台申请 CA 证书需要点击左侧导航栏“SSL 证书管理”, 进入 SSL 证书管理页面,再点击“申请证书”按钮开始申请,经过“确认证书信息→确认 公司信息→确认联系人信息→绑定域名”等步骤之后,点击“提交申请”按钮验证域名所 有权,弹出如图 4-50 所示的对话框。 


图 4-50 验证域名所有权对话框  

申请信息成功提交后,可以在 SSL 证书管理页面看到证书状态为“验证中”,在该页 面也可以查看域名所有权的验证方式,如图 4-51 所示。更详细的步骤,请参阅官方使用 文档。 


图 4-51 证书状态为“验证中”  

部署 CA 证书 

现在一般的网站会使用负载均衡,所以 CA 证书需要部署到负载均衡实例上。以网易 云基础服务为例,可以在创建监听时选择“HTTPS”监听协议,然后在 SSL 证书处选择已 经申请的证书,如图 4-52 所示。 


图 4-52 部署 CA 证书

如果没有使用负载均衡设备,就需要在后端的 Web 服务器中配置 SSL 证书,具体可以 参考各类不同的 Web 服务器配置文档进行配置。

客户端安装 CA 证书 

客户端一般已经内置权威 CA 机构的根证书,不需要额外配置安装证书。如果颁发证 书机构的根证书没有在客户端正确安装,将会出现连接问题。所以我们一般推荐使用权威 CA 机构颁发的根证书,而不是使用自签名的证书。

小 结 

本章我们介绍了一个中型系统在这一阶段所面临的问题,主要集中在稳定、高可用和 水平扩展方面,目标是为用户提供一个可扩展、高性能、稳定的系统,并提供基础的 DevOps 能力和良好的系统服务化能力,为系统的进一步进化和发展打好基础。

文章节选自《云原生应用架构实践》 网易云基础服务架构团队 著

参考文档:https://sq.163yun.com/blog/article/221404388877201408