<h1>前言</h1>
承接前文《短信發(fā)送接口被惡意訪問的網(wǎng)絡攻擊事件(二)肉搏戰(zhàn)-阻止惡意請求》,文中有講到一個定位非法IP的shell腳本朱巨,現(xiàn)在就來公布一下吧史翘,并沒有什么技術難度,只是當時花了些時間去寫這個東西,類似于緊急修復線上bug一樣的趕這個小腳本琼讽,雖然現(xiàn)在看來挺簡單的必峰,但是在當時緊張的情景中,趕這個小腳本兒的過程確實是很有趣的钻蹬。
前一篇文章發(fā)布后自点,有朋友留言問了一下腳本的事,于是整理了一下脉让。
<h1>需求分析</h1>
目標:
通過日志定位并記錄攻擊者的IP桂敛,然后封掉此IP的所有請求
借助工具:
- shell腳本
- 日志文件
- iptables防火墻
具體步驟:
第一步,首先是獲取請求了被攻擊URL的所有請求中的IP溅潜,因為被攻擊的URL只有一個术唬,這里的做法是通過grep命令查找請求了此URL的日志行,查找的值為api地址的名稱字段滚澜,比如此URL的地址為'/message/send/'粗仓,而send字段只存在于此URL中,因此在日志文件中查找包含'send'字段的行即可设捐。
第二步是從所有的行中提取出IP列借浊,統(tǒng)計出所有出現(xiàn)的IP和此IP請求接口URL的次數(shù),存入ip.txt文件萝招。
接著第三步是通過對ip.txt文件的分析蚂斤,定位出所有的不正常的IP,分析的比較簡陋槐沼,做法是請求超過5次的都視為非法IP曙蒸,其實5次已經(jīng)算多的了,應該再小一點岗钩,但是其實在分析文件ip.txt文件過程中纽窟,發(fā)現(xiàn)正常的IP訪問次數(shù)基本為一次、兩次兼吓,而非法IP則為百次或千次臂港,因此閾值設置為5或者3并沒有大的影響,重點是找出訪問量較大的一些IP视搏。
最后一步审孽,得到這些IP值之后,將其加入到iptables的過濾策略中并重啟iptables即可凶朗。
<h1>腳本代碼</h1>
一開始的腳本瓷胧,能夠根據(jù)需求統(tǒng)計和記錄出訪問過多的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
后面又對腳本做了一些小改動显拳,改進點有:
- 對文件路徑進行參數(shù)命名棚愤,使得代碼不是特別臃腫;
- 增加一條判斷條件,判斷IP是否已經(jīng)存在于iptables配置文件中宛畦,剔除已經(jīng)統(tǒng)計和記錄過的IP瘸洛。
#! /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
<h1>總結</h1>
首發(fā)于我的個人博客,地址在這里
最近工作也比較忙次和,本來不打算寫這篇文章的反肋,前一篇文章發(fā)布后看到有朋友留言了,因此在下班后抽出一段時間完成了這篇文章踏施,文中并沒有特別難的知識點石蔗,希望有所收獲。