<h1>前言</h1>
承接前文《短信發(fā)送接口被惡意訪問(wèn)的網(wǎng)絡(luò)攻擊事件(一)緊張的遭遇戰(zhàn)險(xiǎn)勝》,在解決了短信發(fā)送的問(wèn)題后菌赖,長(zhǎng)長(zhǎng)地舒了口氣伴郁,也就各忙各的事情去了,本以為應(yīng)該是個(gè)完美的收?qǐng)鼋胀眩闹乐皇悄酀舻缆返那耙欢温浒請(qǐng)鍪鞘詹涣肆耍€是要去應(yīng)付接下來(lái)的爛攤子摊唇,因?yàn)楣粽卟](méi)有停止攻擊咐蝇,雖然惡意請(qǐng)求已經(jīng)可以被識(shí)別并且不會(huì)被業(yè)務(wù)服務(wù)器處理,也不會(huì)去觸發(fā)短信發(fā)送接口巷查,但是請(qǐng)求依然會(huì)源源不斷的到達(dá)服務(wù)器有序,而且絲毫沒(méi)有停止的意思。
像前文中說(shuō)的岛请,那種感覺(jué)就像葛大爺被麻匪給劫了旭寿,既然被賊給盯上了,你覺(jué)得是那么輕而易舉的就能夠掙脫的了么崇败?
<h1>問(wèn)題分析</h1>
公司用的是阿里云的云服務(wù)器ECS盅称,在ECS控制臺(tái)中查看入網(wǎng)流量:
雖然在程序中加入邏輯判斷可以阻止非法請(qǐng)求對(duì)短信接口的觸發(fā),但是卻無(wú)法阻止攻擊者持續(xù)的向ECS發(fā)送請(qǐng)求后室,通過(guò)上圖ECS的入網(wǎng)流量可以看到缩膝,在流量上升之后,并沒(méi)有降下來(lái)的意思岸霹,得疾层,這狗皮膏藥真的一時(shí)沒(méi)法撕下來(lái)了,雖然說(shuō)這些個(gè)攻擊者無(wú)聊贡避,但還是得跟他們杠上了痛黎,心累。
所以剛剛開(kāi)心了沒(méi)多久贸桶,又陷入了困頓之中舅逸,剛剛踩完一個(gè)坑,爬上來(lái)沒(méi)多久皇筛,發(fā)現(xiàn)眼前又是一個(gè)坑,坑坑復(fù)坑坑坠七,開(kāi)發(fā)的坑是何其多水醋,運(yùn)維也一樣旗笔,都是一家人。
魯迅說(shuō)過(guò):
你盡管說(shuō)拄踪,說(shuō)得有用算我輸蝇恶,坑還是得踩,誰(shuí)讓你做開(kāi)發(fā)的惶桐。
我們都知道流量攻擊撮弧,攻擊者用大流量來(lái)壓垮網(wǎng)絡(luò)設(shè)備和服務(wù)器,或者有意制造大量無(wú)法完成的不完全請(qǐng)求來(lái)快速耗盡服務(wù)器資源姚糊,現(xiàn)在看來(lái)這次的短信接口攻擊稱不上流量攻擊贿衍,因?yàn)閿?shù)量級(jí)不在一個(gè)概念上,雖然也存在大量的非法請(qǐng)求救恨,但是并不足以癱瘓?jiān)O(shè)備贸辈,當(dāng)然,這些話都是寫(xiě)在事件結(jié)束之后的肠槽,與事件發(fā)生時(shí)的想法可能有些出入擎淤,因?yàn)楫?dāng)時(shí)并不確定攻擊者的請(qǐng)求是否會(huì)持續(xù)增加、是否會(huì)打滿服務(wù)器的帶寬秸仙,是否會(huì)影響正常請(qǐng)求嘴拢,是否會(huì)使服務(wù)器癱瘓.....
看著持續(xù)不減的入網(wǎng)流量,思考了半天寂纪,最終是打算加入防火墻席吴,通過(guò)封掉這些惡意請(qǐng)求的IP,讓ECS直接拒絕請(qǐng)求弊攘,在請(qǐng)求的第一步就把它弄死抢腐,將入口堵住應(yīng)該可以一定程度的阻止攻擊者繼續(xù)攻擊,也使得流量降低不會(huì)影響到處理正常請(qǐng)求所用到的系統(tǒng)資源襟交。
前文提到的只是針對(duì)具體的系統(tǒng)模塊迈倍,在應(yīng)用層降低攻擊的危害,因?yàn)橐婚_(kāi)始認(rèn)為這次攻擊只會(huì)影響短信接口捣域,但是如果是流量攻擊的話啼染,則是影響整個(gè)服務(wù)器層面,會(huì)影響所有在這臺(tái)服務(wù)器上的基礎(chǔ)設(shè)施焕梅,這個(gè)就比較麻煩了迹鹅,想法只有一個(gè):阻止入網(wǎng)請(qǐng)求。
<h1>應(yīng)急方案--iptables防火墻</h1>
一開(kāi)始想到的是用iptables來(lái)作為這次的防火墻工具贞言,花了些時(shí)間斜棚,寫(xiě)了一個(gè)分析日志的shell腳本,把攻擊者的IP定位出來(lái),然后把這些IP放到iptables的策略中給封掉弟蚀,以下為iptables策略設(shè)置的腳本蚤霞,運(yùn)行腳本的前提是你的linux服務(wù)器中安裝了iptables工具。
#!/bin/sh
#iptables設(shè)置
#author:13
iptables -P INPUT ACCEPT
iptables -F
iptables -X
iptables -Z
iptables -A INPUT -i lo -j ACCEPT
iptables -I INPUT -s 111.147.220.88 -j DROP
iptables -I INPUT -s 101.68.56.76 -j DROP
iptables -I INPUT -s 106.6.90.58 -j DROP
iptables -I INPUT -s 111.147.212.230 -j DROP
......
(這里省略了大部分的IP义钉,因?yàn)樘嗔耍?
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
#保存設(shè)置
service iptables save
#重啟iptables服務(wù)
systemctl restart iptables.service
雖然選擇了這個(gè)方式昧绣,但是也知道這種方式比較笨拙和被動(dòng),而且不能完全的做到自動(dòng)化捶闸,以后有時(shí)間會(huì)試著用nginx+lua+redis寫(xiě)一個(gè)攔截器夜畴,作為限制惡意IP訪問(wèn)的小工具,近期也會(huì)找一下其他的解決方案删壮。
由此贪绘,最新阻止攻擊的方式已經(jīng)變成了下圖中的模式:
根據(jù)日志文件來(lái)分析請(qǐng)求,一旦被識(shí)別為惡意IP的話醉锅,之后的所有請(qǐng)求都會(huì)被iptables防火墻攔截兔簇,請(qǐng)求不會(huì)被處理,半天時(shí)間限制了500多個(gè)IP的訪問(wèn)硬耍,但是依然會(huì)有新的IP加入到攻擊之中垄琐,散列IP攻擊真的很煩,限制了短信發(fā)送后经柴,已經(jīng)不會(huì)進(jìn)一步造成損失狸窘,而今天又做了IP訪問(wèn)限制,更進(jìn)一步確保了攻擊造成的影響降低坯认,同時(shí)也降低了流量陡增給系統(tǒng)帶來(lái)的危害翻擒。
這次攻擊并沒(méi)有造成進(jìn)一步的影響,應(yīng)該也算是送了一口氣牛哺,從數(shù)量級(jí)上來(lái)看陋气,倒不是特別大的攻擊,就是這兩天的日志文件比較大引润,因?yàn)樵跊](méi)有限制IP訪問(wèn)時(shí)巩趁,這幾百個(gè)IP搭配無(wú)數(shù)的手機(jī)號(hào)碼,發(fā)送的請(qǐng)求數(shù)量是挺驚人的淳附。而至于這次的攻擊者到底是什么人议慰,出于什么目的,完全不得而知奴曙,人民幣損失也是有的别凹,但是還好發(fā)現(xiàn)和解決的及時(shí),并沒(méi)有造成太大的影響洽糟,肯定不至于丟了工作炉菲,哈哈哈哈堕战。
<h1>防火墻效果</h1>
流量攻擊由第一天的每分鐘1000次左右的惡意請(qǐng)求(統(tǒng)計(jì)對(duì)象僅包含非法請(qǐng)求,正常請(qǐng)求不包含在內(nèi))颁督,通過(guò)采用封鎖IP的方法來(lái)進(jìn)行防御之后践啄,目前為每分鐘10-20次左右的惡意請(qǐng)求浇雹,雖然已經(jīng)攔截掉大部分的攻擊沉御,但是依然不斷會(huì)有新的偽裝IP加入到攻擊當(dāng)中,暫時(shí)也想不到其他辦法來(lái)應(yīng)對(duì)昭灵,因?yàn)镮P是一直在變的吠裆,雖然在半天內(nèi)已經(jīng)封鎖掉了500多條IP,不過(guò)依然還是會(huì)有新的IP帶著新的請(qǐng)求進(jìn)來(lái)烂完,但是好消息是试疙,現(xiàn)在的流量已經(jīng)不像剛開(kāi)始那樣,像是開(kāi)了閘口的洪水一樣噴涌而來(lái)了抠蚣,目前已經(jīng)是銳減成涓涓細(xì)流了祝旷,他奶奶的。
整個(gè)過(guò)程你來(lái)我往的嘶窄,看似熱鬧怀跛,其實(shí)就是菜雞互啄,攻擊者通過(guò)工具發(fā)送惡意請(qǐng)求柄冲,惡意請(qǐng)求進(jìn)來(lái)并被記錄到日志文件中吻谋,被腳本檢測(cè)到之后加入到iptables策略中封鎖IP,然后攻擊者又會(huì)利用新的IP做攻擊现横,檢測(cè)到之后再次封鎖漓拾,周而復(fù)始。說(shuō)難度嘛戒祠,倒是沒(méi)什么技術(shù)難度骇两,至于麻煩嘛,是有一些小麻煩姜盈,再說(shuō)損失低千,通過(guò)參數(shù)驗(yàn)證后,應(yīng)該不會(huì)請(qǐng)求短信服務(wù)商再造成損失了贩据,關(guān)鍵是被惡心到了栋操,畢竟這個(gè)事情沒(méi)法徹底的解決掉,除非停掉這一個(gè)服務(wù)饱亮,這是不可能的矾芙,也只能等下次更新了,中間這段時(shí)間只能被惡心了近上。
<h1>防火墻的方案</h1>
雖然當(dāng)時(shí)是選擇使用iptables來(lái)作為主要的防火墻工具剔宪,但是現(xiàn)在想想,也有其他方法的,事后諸葛亮一下葱绒,總結(jié)了以下四種方式感帅,希望大家補(bǔ)充:
- iptables
- hosts.deny
- 阿里云的ECS安全策略
- WAF(這個(gè)是前一篇文章中一位朋友留言提到的方案)
<h1>結(jié)語(yǔ)</h1>
也想過(guò)在APP重新發(fā)版時(shí),重新設(shè)計(jì)一套u(yù)rl地淀,將原來(lái)的url廢棄掉失球,或者關(guān)閉一些服務(wù)器以杜絕這些攻擊,但是帮毁,這些都是沖動(dòng)和極端的想法和做法实苞,即使APP重新發(fā)版,也不可能立即關(guān)閉后端服務(wù)器烈疚,關(guān)閉后端服務(wù)意味著完全拋棄對(duì)上一個(gè)版本的支持黔牵,但是正確做法不可能對(duì)沒(méi)有更新版本的用戶不管不問(wèn),即使他們不更新也要保證原來(lái)的整體功能可用爷肝。不能因?yàn)橐粋€(gè)服務(wù)的錯(cuò)誤猾浦,讓用戶去承受錯(cuò)誤,不能讓用戶來(lái)為我們埋單灯抛,停掉服務(wù)器的做法不可行金赦,沒(méi)有到那個(gè)地步,因此只能是自己去解決和維護(hù)。
每次發(fā)生這種意料之外的事件,都會(huì)提醒自己做好安全保障工作值桩,不可掉以輕心螟加,不要給心懷惡意之人有可乘之機(jī),這次損失一塊錢(qián)RMB,下次可能是一千塊,一萬(wàn)塊,金錢(qián)的損失可以衡量沽甥,如果是給系統(tǒng)帶來(lái)影響或者給團(tuán)隊(duì)招來(lái)不必要的麻煩就真的百口莫辯了。
目前來(lái)看乏奥,雖然是解決了一部分問(wèn)題摆舟,用請(qǐng)求驗(yàn)證阻止發(fā)送短信,用iptables阻止惡意IP的訪問(wèn)邓了,但是并沒(méi)有根本解除掉攻擊恨诱,不排除攻擊者會(huì)進(jìn)一步攻擊的可能性,因此只能被動(dòng)的防守骗炉,同時(shí)也做好web和服務(wù)器的安全防護(hù)照宝。
首發(fā)于我的個(gè)人博客,地址在這里