前段时间,我的网站疑似被攻击了,今天带大家一起来事故现场看看,并且分享事故分析思路和事后防控手段。
孽起
先看看我是怎么发现网站被攻击的吧。
通常,为了保证线上网站和后台服务的稳定运行,我们需要给项目添加监控告警功能,出现意外情况时,系统会第一时间向管理员发送通知。
由于我的项目使用 腾讯云云开发
来部署,默认提供了额度监控和告警,可以防止资源消耗过多,非常方便。
但光有告警还不够,真出了问题,靠什么去分析呢?必须给故障排查提供一些线索。
腾讯云云开发默认为云函数、云托管等提供了监控和日志记录,一行代码都不用写,就能够看到资源的运行信息和详细日志,比如请求时间、IP 地址、请求头信息等,非常方便。
此外,我还在开发时,给服务添加了一些日志和数据上报,比如哪位用户在哪个时间执行了什么操作。记录的越详细,排查问题就越方便。当然,无意义的内容就不用记录了,否则看日志的时候密密麻麻的,伤眼又低效!
我一直把项目当成自己的孩子(虽然我还没有孩子),因此,我每天都会看一下监控和日志,来了解下 “孩子” 的身体状况。
我最常看的监控指标是服务的 调用次数
,它很大程度上反映了用户流量的访问情况。
正常情况下,调用次数随时间的曲线图应该是下面这样的,夜里没人看,白天流量还算平稳,偶尔会有一些小高峰:
但有一天,我突然看到了下面这个曲线图,大家看看这个曲线有什么特点?
没错,地中海上偏偏长了一根长毛!在 25 分附近,调用次数突然飙升,我们一般把这种现象称为 “流量突刺”,把监控图上这一枝独秀称为 “毛刺”。
大多数情况下,有毛刺可不是什么好事。看到这个曲线,我的第一反应不是 “卧槽,项目火了?”,而是 “卧槽,被攻击了!”
到底是不是被攻击了?是谁攻击我了呢?不会我真的火了吧(还带有一丝幻想)?
带着这些疑问,赶紧来分析一下。
分析
光看上面的曲线图,是分析不出来的,必须要从事故现场找找线索。
还好云开发帮我们记录了访问日志,选择事故发生的时间段(以 25 分钟为基准,前后各空 5 分钟),然后就筛选出了对应日志。
为了更灵活地分析,我们将日志导出到本地,使用 Excel 等表格软件打开它。
然后,我们来分析下日志,先看 日志生产时间
这列,即案发时间:
大家发现了么?日志生产时间非常均匀!每秒大概 3 - 4 条。
从这点就说明了,大概率不是人工访问服务,而是机器自动按照某个频率发送请求。
再看下日志的内容,每条日志的结构如下:
// 请求时间
2021-04-29T04:22:05.937752445Z
// 发起请求的 IP
stdout F 169.254.128.20
// 请求头
HEAD /webroot.bak HTTP/1.1
// 响应状态码
200 0
// 请求地址
http://www.code-nav.cn/webroot.bak
// 请求浏览器身份
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
其中,请求时间、请求 IP、请求地址是关键信息。时间刚刚已经分析过了,再看看请求 IP 和地址。
我直接在表格中全局搜索上述 IP,发现所有的 IP 地址都是相同的!
这下我松了口气,应该只是一个人在小打小闹吧。
然后我看了几条连续日志的请求地址,大概是这样:
http://www.code-nav.cn/111.gz
http://www.code-nav.cn/111.tar.bz2
http://www.code-nav.cn/111.dat
http://www.code-nav.cn/111.bz2
http://www.code-nav.cn/222.tgz
http://www.code-nav.cn/222.gz
http://www.code-nav.cn/333.zip
...
看到 "111"、"222"、"333" 我大致明白了,这位攻击者应该是在用字典枚举的方式扫描我的网站,企图找出网站的后台地址。
攻击的原理很简单,就根小时候我们尝试破解别人密码一样,一个一个疯狂乱试。只不过攻击者通常会使用一些网站扫描工具,将可能的密码作为一本字典,交给机器,代替人工来试而已。试的次数和频率高了,就被称为 “爆破”。
又回想起了大学时被网络安全课支配的恐惧。。。
基于以上的分析,这位 “攻击者” 应该只是拿我的网站来练练手,毕竟扫描频率不高、持续时间不长,当然,我希望如此。
防控
这件事虽然伤害不大,侮辱性极强!让我充分意识到自己的网站在安全性上是缺斤少两的。最起码应该在异常流量出现的是否给我告警,发个短信啥的吧!
如果是自己搭建服务器来部署网站项目,需要自行接入或开发一个业务监控告警系统,虽然网上的这类第三方系统很多,比如 Zabbix、Prometheus(AlertManager)、Grafana 等,但都需要自己来部署和维护,需要一定的人力物力成本。
但使用腾讯云云开发,除了上面提到的基础资源额度告警外,还可以灵活自定义各种高级的告警策略。
比如给点赞功能添加调用次数限制告警,先选择告警对象为 “云函数”:
再配置触发条件,比如 5 分钟内调用次数超过 100 次则告警:
再配置下告警接收人、告警方式、时间段等,支持邮件、短信、微信等,选择很多样:
这样就大功告成了,如法炮制,可以给每个最小粒度的函数都添加上告警,出了事儿在第一时间就能感知到了。
产品介绍
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为开发者提供高可用、自动弹性扩缩的后端云服务,包含计算、存储、托管等serverless化能力,可用于云端一体化开发多种端应用(小程序,公众号,Web 应用,Flutter 客户端等),帮助开发者统一构建和管理后端服务和云资源,避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
开通云开发:https://console.cloud.tencent.com/tcb?tdl_anchor=techsite
产品文档:https://cloud.tencent.com/product/tcb?from=12763
技术文档:https://cloudbase.net?from=10004
技术交流群、最新资讯关注微信公众号【腾讯云云开发】