做者:13
GitHub:https://github.com/ZHENFENG13
版權聲明:本文爲原創文章,未經容許不得轉載。html
承接前文《短信發送接口被惡意訪問的網絡攻擊事件(二)肉搏戰-阻止惡意請求》,文中有講到一個定位非法IP的shell腳本,如今就來公佈一下吧,並無什麼技術難度,只是當時花了些時間去寫這個東西,相似於緊急修復線上bug同樣的趕這個小腳本,雖然如今看來挺簡單的,可是在當時緊張的情景中,趕這個小腳本兒的過程確實是頗有趣的。git
前一篇文章發佈後,有朋友留言問了一下腳本的事,因而整理了一下。github
目標:shell
經過日誌定位並記錄攻擊者的IP,而後封掉此IP的全部請求api
藉助工具:bash
具體步驟:網絡
第一步,首先是獲取請求了被攻擊URL的全部請求中的IP,由於被攻擊的URL只有一個,這裏的作法是經過grep命令查找請求了此URL的日誌行,查找的值爲api地址的名稱字段,好比此URL的地址爲'/message/send/',而send字段只存在於此URL中,所以在日誌文件中查找包含'send'字段的行便可。工具
第二步是從全部的行中提取出IP列,統計出全部出現的IP和此IP請求接口URL的次數,存入ip.txt文件。日誌
接着第三步是經過對ip.txt文件的分析,定位出全部的不正常的IP,分析的比較簡陋,作法是請求超過5次的都視爲非法IP,其實5次已經算多的了,應該再小一點,可是其實在分析文件ip.txt文件過程當中,發現正常的IP訪問次數基本爲一次、兩次,而非法IP則爲百次或千次,所以閾值設置爲5或者3並無大的影響,重點是找出訪問量較大的一些IP。code
最後一步,獲得這些IP值以後,將其加入到iptables的過濾策略中並重啓iptables便可。
一開始的腳本,可以根據需求統計和記錄出訪問過多的IP地址了:
#! /bin/bash #author:13 #date:2017-06 #desc:找出攻擊者IP cat /opt/sms-service/logs/access_log.log | awk '{print $1}'|sort|uniq -c|awk '{print $2"="$1;}' > /opt/sms-service/logs/ip.txt DEFINE="5" for i in `cat /opt/sms-service/logs/ip.txt` do IP=`echo $i |awk -F= '{print $1}'` NUM=`echo $i|awk -F= '{print $2}'` if [ $NUM -gt $DEFINE ];then grep $IP /opt/sms-service/logs/black.txt > /dev/null if [ $? -gt 0 ];then echo "iptables -I INPUT -s $IP -j DROP" >> /opt/sms-service/logs/black.txt fi fi done
後面又對腳本作了一些小改動,改進點有:
#! /bin/bash #author:13 #date:2017-06 #desc:找出攻擊者IP LOGFILE="/opt/sms-service/logs/access_log.log" IPTXT="/opt/sms-service/logs/ip.txt" BLACKTXT="/opt/sms-service/logs/black.txt" IPTABLES="/opt/iptables/run.sh" DEFINE="5" cat $LOGFILE|awk '{print $1}'|sort|uniq -c|awk '{print $2"="$1;}' > $IPTXT for i in `cat $IPTXT` do IP=`echo $i |awk -F= '{print $1}'` NUM=`echo $i|awk -F= '{print $2}'` if [ $NUM -gt $DEFINE ];then grep $IP $BLACKTXT > /dev/null if [ $? -gt 0 ];then grep $IP $IPTABLES > /dev/null if [ $? -gt 0 ];then echo "iptables -I INPUT -s $IP -j DROP" >> $BLACKTXT fi fi fi done
首發於個人我的博客,地址在這裏
最近工做也比較忙,原本不打算寫這篇文章的,前一篇文章發佈後看到有朋友留言了,所以在下班後抽出一段時間完成了這篇文章,文中並無特別難的知識點,但願有所收穫。