我的日志分析之道:简单的Web日志分析脚本

时间:2021-11-01 17:29:52

前言

长话短说,事情的起因是这样的,由于工作原因需要分析网站日志,服务器是windows,iis日志,在网上找了找,github找了找,居然没找到,看来只有自己动手丰衣足食。

那么分析方法我大致可分为三种:

1. 基于时间:将请求url按时间段分类,那么我们根据每个时间段的url数量及攻击数量就可以大致判断出哪个时间段有apt类型攻击,哪个时间段是扫描器行为;

2. 基于攻击ip:正常的攻击肯定会有请求被记录(当然你要是有0day当我没说,正常的探测总会有吧=。=!),然后每个ip去分析;

3. 基于访问请求的状态码,也大致可以判断出行为。

规则可以基于开源waf规则,分析扫描器写正则也可以,开源waf地址是

https://github.com/loveshell/ngx_lua_waf/tree/master/wafconf

扫描器正则https://github.com/smarttang/w3a_SOCD的database里面有详细地址

https://github.com/smarttang/w3a_SOC/tree/master/db_sql

Sql语句里面有想把它做的功能全一些,但是学python学习时间也不是很长,写出来的代码也没有pythonic,会慢慢写的。目前分三个模块,一个日志归类模块命名为url.py,攻击分析模块attac.py, ip地理位置查询模块ipfind.py,还有一个主函数。

日志归类模块url.py

import re
import os
import sys
from datetime import datetime

dt = datetime.now()
date = str(dt.date())


loglist = []   #  
iplist = []    #   ip统计
urllist = []   #    url统计列表
needlist = []   #    需要统计的
errorlist = []   #    格式错误的列表
ipdict,urldict = {},{} 

rizhi = str(input('请输入要分析的日志文件名'))

def find_log():
    print('>>>>>>>开始解析日志')
    with open(rizhi,'r',encoding='UTF-8',errors='ignore') as f:
        #loglist = f.readlines()
       
for i in f.readlines():   #
           
if i[0] != '#':
                b = re.split(' ',i)
                iplist.append(b[10])
                urllist.append(b[6])
                try:
                    needlist.append([b[10],b[1],b[5],b[6],b[15]])
                except:
                    errorlist.append(i)
    print('>>>>>>>日志解析完毕')

def count(iplist,urllist):    #统计ip url访问量函数
   
print('>>>>>>>开始分析urlip访问量')
    global ipdict,urldict
    for i in set(iplist):
        ipdict[i] = iplist.count(i)
    for i in set(urllist):
        urldict[i] = urllist.count(i)

    ipdict = sorted(ipdict.items(),key=lambda d: d[1], reverse=True)   
    urldict = sorted(urldict.items(),key=lambda d: d[1], reverse=True)
    print(type(urldict))
    iplist = list(ipdict)
    urllist = list(urldict)
    ipdict,urldict = {},{}
    print('>>>>>urlip分析完毕.......')

    return [iplist,urllist]

def save_count():
    print('>>>>>>>正在保存分析结果')
    ipname = 'ip-'+date+'.txt'
    urlname = 'url-'+date+'.txt'
    with open(ipname,'w') as f:
        for i in iplist:
            f.write(str