前言
对于网络安全的学习而言,日志分析技巧是非常重要的,日志分析做好了,就方便对于后续的排查修复和溯源有非常大的帮助,本文就以分析apache服务器的日志来编写一个简单的检测封禁脚本,可能编写代码比较简单,主要是提供一个编写思路,方便大家如何编写此类工具。
编写思路
通过查看apache中的日志我们可以发现日志具体由访问的IP地址、访问时间、访问的请求数据包、登录浏览器的操作系统组成,我们可以选取相关关键属性进行筛选日志进行判断。
所以我们可以设置一个时间段,用一个文件统计这个时间段内访问量最大的ip,从大到小排序,再创建一个文件来筛选这个时间段内访问量超过多少频率的ip,最后再进行一个封禁。
这就是整个脚本编写的大致思路,具体实现步骤如下。
实验步骤
我们通过tac access.log | awk '{print $4}'
命令可以筛选出最新时间日志时间。
通过tac access_log | awk '{print $1}' | sort |uniq -c | sort -nr | head -n 10
命令可以选出访问量最大的前十个ip
- sort:对打印的字符进行排序
- unqi -c:去除重复的数据并进行统计
- sort -nr:按照整个数字来排序
- head -n 10:打印出前十行
了解这些就可以进行一个脚本的编写
在目录下创建一个deny_ip.sh的脚本文件
定义一个系统时间跟日志时间进行比对
使用chmod +x deny_ip.sh
命令给脚本添加执行权限
测试结果如下
发现跟apache日志格式时间不一样,脚本显示月份格式为数字,apache显示月份格式为英文,这里有两种解决方法。
注意:在这里定义的时间格式必须和日志的时间格式一样,要不然运行脚本时无法比对。
解决方法1:将月份显示格式数字修改为英文字母
通过date --help命令
查看date命令的帮助文档可以发现
date命令中的%b参数可以实现我们想要的效果,所以将脚本中的%M替换为%b,进行测试
结果成功修改
注意:若你使用的kali版本为中文版,使用%b参数修改后月份会显示为中文的7月,若还想用此方法比对必须将kali版本转换为英文版,或者使用解决方法2。
解决方法2:将月份显示格式英文字母修改为数字
这种方法比较麻烦需要进入apache的配置文件中修改。
在kali中,自带一个apache2,主配置文件为/etc/apache2/apache2.conf
文件较长,在末行模式下输入 :set nu
显示行号,方便编辑。
根据查阅apache配置文档可知%t
变量有一个可选项来自定义时间格式。
%…t: 以公共日志时间格式表示的时间(或称为标准英文格式)
%…{format}t: 以指定格式format表示的时间
修改后如下
对apache服务重启并测试
发现新访问的时间格式已经修改为我们自定义的格式
更多apache配置文件变量的详细参数可以查看链接: apache日志格式定义及示例说明
继续将脚本内容补全
进行测试,运行脚本后进入apache网页尝试多次刷新
发现已经无法进入网站
输入iptables -L
命令进行查看
已经成功把可疑ip进行拦截放入策略
指定任务计划
使用crontab -e命令
若弹出
提示你选择编辑器,你可以根据个人喜好选择(我选择的是vim)
如果需要重新选择其他的编辑器,可以输入
select-editor
进入编辑器后添加每分钟执行deny_ip.sh文件
*/1 * * * * sh /var/log/deny_ip.sh
* * * * *
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 6) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
点击测试后,发现正常封禁,成功执行