被攻擊了!
為您報(bào)道【網(wǎng)站被攻擊現(xiàn)場(chǎng)】,傷害不大,侮辱性極強(qiáng)!
大家好,我是魚皮。
前段時(shí)間,我的網(wǎng)站疑似被攻擊了,今天帶大家一起來(lái)事故現(xiàn)場(chǎng)看看,并且分享事故分析思路和事后防控手段。
孽起
先看看我是怎么發(fā)現(xiàn)網(wǎng)站被攻擊的吧。
通常,為了保證線上網(wǎng)站和后臺(tái)服務(wù)的穩(wěn)定運(yùn)行,我們需要給項(xiàng)目添加監(jiān)控告警功能,出現(xiàn)意外情況時(shí),系統(tǒng)會(huì)第一時(shí)間向管理員發(fā)送通知。
由于我的項(xiàng)目使用 騰訊云云開發(fā)
來(lái)部署,默認(rèn)提供了額度監(jiān)控和告警,可以防止資源消耗過(guò)多,非常方便。

但光有告警還不夠,真出了問(wèn)題,靠什么去分析呢?必須給故障排查提供一些線索。
騰訊云云開發(fā)默認(rèn)為云函數(shù)、云托管等提供了監(jiān)控和日志記錄,一行代碼都不用寫,就能夠看到資源的運(yùn)行信息和詳細(xì)日志,比如請(qǐng)求時(shí)間、IP 地址、請(qǐng)求頭信息等,非常方便。

此外,我還在開發(fā)時(shí),給服務(wù)添加了一些日志和數(shù)據(jù)上報(bào),比如哪位用戶在哪個(gè)時(shí)間執(zhí)行了什么操作。記錄的越詳細(xì),排查問(wèn)題就越方便。當(dāng)然,無(wú)意義的內(nèi)容就不用記錄了,否則看日志的時(shí)候密密麻麻的,傷眼又低效!
我一直把項(xiàng)目當(dāng)成自己的孩子(雖然我還沒有孩子),因此,我每天都會(huì)看一下監(jiān)控和日志,來(lái)了解下 “孩子” 的身體狀況。
我最??吹谋O(jiān)控指標(biāo)是服務(wù)的 調(diào)用次數(shù)
,它很大程度上反映了用戶流量的訪問(wèn)情況。
正常情況下,調(diào)用次數(shù)隨時(shí)間的曲線圖應(yīng)該是下面這樣的,夜里沒人看,白天流量還算平穩(wěn),偶爾會(huì)有一些小高峰:

但有一天,我突然看到了下面這個(gè)曲線圖,大家看看這個(gè)曲線有什么特點(diǎn)?

沒錯(cuò),地中海上偏偏長(zhǎng)了一根長(zhǎng)毛!在 25 分附近,調(diào)用次數(shù)突然飆升,我們一般把這種現(xiàn)象稱為 “流量突刺”,把監(jiān)控圖上這一枝獨(dú)秀稱為 “毛刺”。
大多數(shù)情況下,有毛刺可不是什么好事??吹竭@個(gè)曲線,我的第一反應(yīng)不是 “臥槽,項(xiàng)目火了?”,而是 “臥槽,被攻擊了!”
到底是不是被攻擊了?是誰(shuí)攻擊我了呢?不會(huì)我真的火了吧(還帶有一絲幻想)?
帶著這些疑問(wèn),趕緊來(lái)分析一下。
分析
光看上面的曲線圖,是分析不出來(lái)的,必須要從事故現(xiàn)場(chǎng)找找線索。
還好云開發(fā)幫我們記錄了訪問(wèn)日志,選擇事故發(fā)生的時(shí)間段(以 25 分鐘為基準(zhǔn),前后各空 5 分鐘),然后就篩選出了對(duì)應(yīng)日志。

為了更靈活地分析,我們將日志導(dǎo)出到本地,使用 Excel 等表格軟件打開它。

然后,我們來(lái)分析下日志,先看 日志生產(chǎn)時(shí)間
這列,即案發(fā)時(shí)間:

大家發(fā)現(xiàn)了么?日志生產(chǎn)時(shí)間非常均勻!每秒大概 3 - 4 條。
從這點(diǎn)就說(shuō)明了,大概率不是人工訪問(wèn)服務(wù),而是機(jī)器自動(dòng)按照某個(gè)頻率發(fā)送請(qǐng)求。
再看下日志的內(nèi)容,每條日志的結(jié)構(gòu)如下:
//?請(qǐng)求時(shí)間
2021-04-29T04:22:05.937752445Z
//?發(fā)起請(qǐng)求的?IP
stdout?F?169.254.128.20
//?請(qǐng)求頭
HEAD?/webroot.bak?HTTP/1.1\
//?響應(yīng)狀態(tài)碼
200?0?
//?請(qǐng)求地址
http://www.code-nav.cn/webroot.bak
//?請(qǐng)求瀏覽器身份
Mozilla/5.0?(compatible;?MSIE?9.0;?Windows?NT?6.1;?Trident/5.0)
其中,請(qǐng)求時(shí)間、請(qǐng)求 IP、請(qǐng)求地址是關(guān)鍵信息。時(shí)間剛剛已經(jīng)分析過(guò)了,再看看請(qǐng)求 IP 和地址。
我直接在表格中全局搜索上述 IP,發(fā)現(xiàn)所有的 IP 地址都是相同的!

這下我松了口氣,應(yīng)該只是一個(gè)人在小打小鬧吧。
然后我看了幾條連續(xù)日志的請(qǐng)求地址,大概是這樣:
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" 我大致明白了,這位攻擊者應(yīng)該是在用字典枚舉的方式掃描我的網(wǎng)站,企圖找出網(wǎng)站的后臺(tái)地址。
攻擊的原理很簡(jiǎn)單,就根小時(shí)候我們嘗試破解別人密碼一樣,一個(gè)一個(gè)瘋狂亂試。只不過(guò)攻擊者通常會(huì)使用一些網(wǎng)站掃描工具,將可能的密碼作為一本字典,交給機(jī)器,代替人工來(lái)試而已。試的次數(shù)和頻率高了,就被稱為 “爆破”。
又回想起了大學(xué)時(shí)被網(wǎng)絡(luò)安全課支配的恐懼。。。

基于以上的分析,這位 “攻擊者” 應(yīng)該只是拿我的網(wǎng)站來(lái)練練手,畢竟掃描頻率不高、持續(xù)時(shí)間不長(zhǎng),當(dāng)然,我希望如此。
防控
這件事雖然傷害不大,侮辱性極強(qiáng)!讓我充分意識(shí)到自己的網(wǎng)站在安全性上是缺斤少兩的。最起碼應(yīng)該在異常流量出現(xiàn)的是否給我告警,發(fā)個(gè)短信啥的吧!
如果是自己搭建服務(wù)器來(lái)部署網(wǎng)站項(xiàng)目,需要自行接入或開發(fā)一個(gè)業(yè)務(wù)監(jiān)控告警系統(tǒng),雖然網(wǎng)上的這類第三方系統(tǒng)很多,比如 Zabbix、Prometheus(AlertManager)、Grafana 等,但都需要自己來(lái)部署和維護(hù),需要一定的人力物力成本。
但使用騰訊云云開發(fā),除了上面提到的基礎(chǔ)資源額度告警外,還可以靈活自定義各種高級(jí)的告警策略。
比如給點(diǎn)贊功能添加調(diào)用次數(shù)限制告警,先選擇告警對(duì)象為 “云函數(shù)”:

再配置觸發(fā)條件,比如 5 分鐘內(nèi)調(diào)用次數(shù)超過(guò) 100 次則告警:

再配置下告警接收人、告警方式、時(shí)間段等,支持郵件、短信、微信等,選擇很多樣:

這樣就大功告成了,如法炮制,可以給每個(gè)最小粒度的函數(shù)都添加上告警,出了事兒在第一時(shí)間就能感知到了。
最后,對(duì)于一個(gè)成熟的網(wǎng)站,其實(shí)以上的防護(hù)措施還是遠(yuǎn)遠(yuǎn)不夠的。
還好,我的網(wǎng)站現(xiàn)在并不成熟,所以求求各位網(wǎng)絡(luò)安全愛好者,放過(guò)孩子吧!