您的位置:首页 > 运维架构 > Nginx

通过统计nginx访问日志禁止恶意抓取数据的实现

2014-09-25 18:02 751 查看
nginx默认会记录客户端访问服务端的日志,默认的目录位于:/var/logs/access.log;

业务需求:每小时读取access.log内容,统计每个ipd访问系统次数,如果超过指定次数,则将该ip加入到防火墙中,以便禁止其继续访问(后续可以考虑不是禁止其访问服务,而是重定向到指定的页面)。这样避免别人恶意从自己网站上抓取数据

#-*-coding:utf8 -*-
import logging,datetime,os,sys,string,re
reload(sys)
sys.setdefaultencoding('utf8')
logging.basicConfig(level=logging.DEBUG, \
format='%(asctime)s %(levelname)s- %(message)s', \
filename='/data/analyse.log', \
datefmt='%m-%d %H:%M', \
)
#单位时间内允许最大有效访问次数
maxallowednum=500
ipDic={}
pip = re.compile('[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
ptime = re.compile('[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}')
logfilepath = '/var/log/nginx/access.log'
#该文件记录上次访问到的日志行数
tmpfilepath ='/data/tmp'

linenum = string.atoi(open(tmpfilepath,'r').read())
#读取文件总行数,如果总行数小于tmp文件中记录的行数,说明该日志文件微新增的日志文件,则需要从第一行开始读取
loglinenum = len(open(logfilepath,'rU').readlines())
if(loglinenum<linenum):
    linenum = 1

logging.debug('linenum is:%s',linenum)

logfile = open(logfilepath,'r')
tmpfile = open(tmpfilepath,'w')

index = 0
line = logfile.readline()
while(line!=''):
if(index>=linenum):
#print line
mip = pip.search(line)
#mtime = ptime.search(line)
if mip:
ip = mip.group()
#将每个ip的有效请求存放在ipDic字典中
if(line.find('/static/')==-1):
if(ipDic.has_key(ip)):
ipDic[ip] = ipDic[ip]+1
else:
ipDic[ip] = 1

#times = mtime.group()
#logging.debug('%s' %(ip))

line=logfile.readline()
index+=1

logging.debug('new line num:%i'%(index))
tmpfile.write(str(index))
tmpfile.close()
logfile.close()
#循环ip字典,将其中访问次数超过最大允许访问次数的ip加入到防火墙,禁止其继续访问
for k,v in ipDic.items():
if(v>=maxallowednum):
logging.debug('ip:%s visited %i times,add to iptables' %(k,v))
os.system('iptables -I INPUT 1 -s '+k+' -j DROP')
else:
logging.debug('ip:%s visited %i times' %(k,v))

logging.debug('-------------------------over------------------------------')


也可一去我的个人站点
查看

或者,欢迎关注俺的微信订阅号,每天一篇小笔记,每天提高一点点:

公众好:enilu123

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: