做者: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
首发于个人我的博客,地址在这里
最近工做也比较忙,原本不打算写这篇文章的,前一篇文章发布后看到有朋友留言了,所以在下班后抽出一段时间完成了这篇文章,文中并无特别难的知识点,但愿有所收获。