前言

承接前文《短信發(fā)送接口被惡意訪問的網(wǎng)絡(luò)攻擊事件(二)肉搏戰(zhàn)-阻止惡意請求》,文中有講到一個(gè)定位非法IP的shell腳本,現(xiàn)在就來公布一下吧,并沒有什么技術(shù)難度,只是當(dāng)時(shí)花了些時(shí)間去寫這個(gè)東西,類似于緊急修復(fù)線上bug一樣的趕這個(gè)小腳本,雖然現(xiàn)在看來挺簡單的,但是在當(dāng)時(shí)緊張的情景中,趕這個(gè)小腳本兒的過程確實(shí)是很有趣的。

前一篇文章發(fā)布后,有朋友留言問了一下腳本的事,于是整理了一下。

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

需求分析

目標(biāo):

通過日志定位并記錄攻擊者的IP,然后封掉此IP的所有請求

借助工具:

  • shell腳本

  • 日志文件

  • iptables防火墻

具體步驟:

  • 第一步,首先是獲取請求了被攻擊URL的所有請求中的IP,因?yàn)楸还舻腢RL只有一個(gè),這里的做法是通過grep命令查找請求了此URL的日志行,查找的值為api地址的名稱字段,比如此URL的地址為'/message/send/',而send字段只存在于此URL中,因此在日志文件中查找包含'send'字段的行即可。

  • 第二步是從所有的行中提取出IP列,統(tǒng)計(jì)出所有出現(xiàn)的IP和此IP請求接口URL的次數(shù),存入ip.txt文件。

  • 接著第三步是通過對ip.txt文件的分析,定位出所有的不正常的IP,分析的比較簡陋,做法是請求超過5次的都視為非法IP,其實(shí)5次已經(jīng)算多的了,應(yīng)該再小一點(diǎn),但是其實(shí)在分析文件ip.txt文件過程中,發(fā)現(xiàn)正常的IP訪問次數(shù)基本為一次、兩次,而非法IP則為百次或千次,因此閾值設(shè)置為5或者3并沒有大的影響,重點(diǎn)是找出訪問量較大的一些IP。

  • 最后一步,得到這些IP值之后,將其加入到iptables的過濾策略中并重啟iptables即可。

腳本代碼

一開始的腳本,能夠根據(jù)需求統(tǒng)計(jì)和記錄出訪問過多的IP地址了:

#! /bin/bash#author:13#date:2017-06#desc:找出攻擊者IPcat /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`doIP=`echo $i |awk -F= '{print $1}'`
NUM=`echo $i|awk -F= '{print $2}'`if [ $NUM -gt $DEFINE ];thengrep $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
    fidone

后面又對腳本做了一些小改動(dòng),改進(jìn)點(diǎn)有:

  • 對文件路徑進(jìn)行參數(shù)命名,使得代碼不是特別臃腫;

  • 增加一條判斷條件,判斷IP是否已經(jīng)存在于iptables配置文件中,剔除已經(jīng)統(tǒng)計(jì)和記錄過的IP。

#! /bin/bash#author:13#date:2017-06#desc:找出攻擊者IPLOGFILE="/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;}' > $IPTXTfor i in `cat  $IPTXT`doIP=`echo $i |awk -F= '{print $1}'`
NUM=`echo $i|awk -F= '{print $2}'`if [ $NUM -gt $DEFINE ];thengrep $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
    fidone

總結(jié)

首發(fā)于我的個(gè)人博客,地址在這里

最近工作也比較忙,本來不打算寫這篇文章的,前一篇文章發(fā)布后看到有朋友留言了,因此在下班后抽出一段時(shí)間完成了這篇文章,文中并沒有特別難的知識(shí)點(diǎn),希望有所收獲。

我曾七次鄙視自己的靈魂, 第一次,當(dāng)它本可進(jìn)取時(shí),卻故作謙卑; 第二次,當(dāng)它空虛時(shí),用愛欲來填充; 第三次,在困難和容易之間,它選擇了容易; 第四次,它犯了錯(cuò),卻借由別人也會(huì)犯錯(cuò)來寬慰自己; 第五次,它自由軟弱,卻把它認(rèn)為是生命的堅(jiān)韌; 第六次,當(dāng)它鄙夷一張丑惡的嘴臉時(shí),卻不知那正是自己面具中的一副; 第七次,它側(cè)身于生活的污泥中雖不甘心,卻又畏首畏尾。

http://www.cnblogs.com/han-1034683568/p/7040417.html