linux中nginx日志分析shell脚本

以前使用虚拟主机的时候,查看网站运行日志,就发现了很多异常的恶意的访问。当时因为自己并没有系统权限没办法对这些行为进行屏蔽。现在有了自己的云主机,前端时间查看日志,又发现了很多恶意访问。正好可以通过最近对shell的学习,来做一个简单的日志分析工具,来屏蔽一些这样的操作。
首先,所谓的分析工具,肯定是建立在人为的分析的基础上的。我们来看一点我的域名运行日志:

 代码如下 复制代码
78.56.78.115 - - [21/May/2014:16:54:27 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:54:30 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:54:32 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
42.159.83.42 - - [21/May/2014:16:54:36 +0800] "HEAD /521php.rar HTTP/1.1" 404 0 "-" "-" -
78.56.78.115 - - [21/May/2014:16:54:36 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:54:38 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:54:41 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:54:45 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:54:47 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:54:50 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:54:53 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:54:56 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:54:58 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:00 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
42.159.83.42 - - [21/May/2014:16:55:05 +0800] "HEAD /521php.zip HTTP/1.1" 404 0 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:05 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:07 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:11 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:14 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:17 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:21 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:23 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:25 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:27 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:31 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
42.159.83.42 - - [21/May/2014:16:55:31 +0800] "HEAD /wwwroot.rar HTTP/1.1" 404 0 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:33 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:37 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:39 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:41 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:44 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:50 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:52 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
42.159.83.42 - - [21/May/2014:16:55:56 +0800] "HEAD /wwwroot.zip HTTP/1.1" 404 0 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:57 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:55:59 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:56:01 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:56:03 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -
78.56.78.115 - - [21/May/2014:16:56:05 +0800] "POST /wp-login.php HTTP/1.0" 200 3198 "-" "-" -

很明显可以看到有ip在恶意暴力破解我的登录信息,还有一个ip在尝试下载我的网站程序。这样的ip我们对比正常的访问日志会发现,他没有头信息,即你浏览器等等的信息,而且一般访问都是get或者post访问,而这里有head访问。所以我们可以将这样的ip加入防火墙或者nginx的ip黑名单,当然还可以有其他规则,比较访问的频次,404出现的频次,当然有的访问你会发现他访问你的首页,却没有加载你的js,css等,当然这里也有缓存的影响,但是即使缓存也会发送304的确认信息。当然还有很多其他的恶意访问行为。
然后,针对这些规则,我们来写处理逻辑和操作即可,写这个之前,我们先做一个nginx的ip黑名单。我这里没有再使用linux的防火墙,因为防火墙操作不太方便,频繁重启有一定的影响,而nginx的黑名单,是可以平滑重启的,而且是让指定ip显示403错误,但是可以访问的,这样就给人家一个改过自新的机会啊是吧,如果人家访问正常了,就可以将此ip移除黑名单。
配置nginx ip黑名单:
在你的nginx.conf配置文件中,包含一个blocksip.conf;
blocksip.conf 存放黑名单ip;
这样写

 代码如下 复制代码

deny 1.1.1.2;
deny 1.1.1.1;
deny 1.1.1.4;
deny 1.1.3.1;
deny http://www.111cn.net;

然后我们写个shell脚本,自动添加、移除ip,并平滑重启nginx,并发送邮件通知

editblocksip.sh

 代码如下 复制代码
#!/bin/sh
file="/etc/nginx/conf/blocksip.conf"
file2="/etc/nginx/conf/blocksip.bak"
v1=$1
v2=$2
if [ $v1 = "add" ]
then
  deny_info=`cat $file | grep $2`
  if [ -z "$deny_info" ]
  then
  `echo "deny $v2;" >> $file`
  fi
else if [ $v1 = "del" ]
then
  `cat $file | grep -v $2 > $file2`
  `cat $file2 > $file`
fi
fi
`/usr/sbin/nginx -s reload`
`cat $file|mail -s "edit blocks list" zhangcunchao@izptec.com zhangcunchao_cn@163.com`
exit 0

使用比较简单

 代码如下 复制代码

#添加
sh editblocksip.sh add 1.1.1.1
 
#移除
sh editblocksip.sh del 1.1.1.1

最后,我们只需要写个脚本,来分析nginx日志文件,有符合条件的记录,来触发这个shell脚本添加ip黑名单即可
思路是这样的,首先记录日志最大行号,然后每次执行分析脚本,从指定行号读取剩下所有记录(tail -n +5 file),并再次记录最大行号(wc),然后使用awk,逐行分析记录,并切割字符进行匹配判断,符合条件的,提取ip,加入ip黑名单;
这个分析脚本,可以用crontab 或者 做成守护进程来跑。根据自己网站的运行情况,定义执行频次,几秒,几分钟等等。
这样就实现了一个简单的日志分析工具!

时间: 2024-11-01 02:09:20

linux中nginx日志分析shell脚本的相关文章

linux中nginx日志分析利器GoAccess使用方法

面试的时候一定会被面到的问题是:给出web服务器的访问日志,请写一个脚本来统计访问前10的IP有哪些?访问前10的请求有哪些?当你领略过goaccess之后,你就明白,这些问题,除了考验你的脚本背诵记忆能力以外,唯一的作用只有装A或者装C了. 对于nginx日志分析,有很多工具,衡量好坏的标准大概就是三快:安装快,解析快,上手快.满足这三点的goaccess确实是居家必备良药. 话说这个标题其实有点委屈GoAccess了,它是一个日志分析工具,并不只是为nginx使用的.你也可以用它来分析apa

nginx日志分析shell脚本

先基本了解一几条命令 一下脚本都是基于上面日志格式的,如果你的日志格式不同需要调整awk后面的参数. 分析日志中的UserAgent  代码如下 复制代码 cat access_20130704.log | awk -F """ '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -20 上面的脚本将分析出日志文件中最多的20个UserAgent 分析日志中那些IP访问最多  代码如下 复制代码 cat access_20

嵌入式linux中设置开机运行shell脚本的问题

问题描述 嵌入式linux中设置开机运行shell脚本的问题 想写一个设置静态ip的开机自运行的shell脚本,然后百度说放在rc.local什么的文件里,然后我的板子里/etc 下根本没有这个文件,请大神们指点我应该怎么办? /etc 下只有fstab hosts host.conf group init.d inittab ld.so.conf mdev.conf profile passwd resolv.conf services 解决方案 输入命令 vi /etc/network/in

nginx日志切割shell脚本_linux shell

一.脚本思路 第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志.在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,linux是靠文件描述符而不是文件名定位文件. 第二步向nginx主进程发送USR1信号. nginx主进程接到信号后会从配置文件中读取日志文件名称,重新打开日志文件(以配置文件中的日志名称命名),并以工作进程的用户作为日志文件的所有者. 重新打开日志文件后,nginx主进程会关闭重名的日志文件并通知工作进程使用新打开的日志文件.

linux中NGINX日志切割和定时删除旧日志例子

  在nginx日志切割方面,我的方法和其他人用的方法有一些不一样,但对于我这种方法,如果有人觉得不好,可以给我提出,谢谢 nginx日志切割,我是直接写的一个简单的shell实现的,内容如下:  代码如下 复制代码 mv /usr/local/nginx/logs/abc.log /www/logbak/abc`date +%Y%m%d%H%M`.log /usr/local/nginx/sbin/nginx -s reload 这样执行以后,就会在/www/logbak目录下生成日志文件,你

简单的nginx日志分割shell脚本

nginx的日志access.log没有分割,访问的记录一直都记录在此文件中,长期下去对于日志查询和文件系统都不好,所以需要进行分割. vim /data/scripts/cut_nginx_log.sh   #!/bin/bash # auto-run this script at 00:00 LOGS_PATH=/data/app/nginx/logs YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) mv ${LOGS_PATH}/access

linux中Tomcat开机启动shell脚本

记录一个比较好的tomcat启动脚本,截取<OneinStack>,修改如下两个参数即可用. 使用之前修改下面2个参数: #Location of JAVA_HOME (bin files)export JAVA_HOME=/usr/java/jdk1.7.0_80    #jdk路径 #CATALINA_HOME is the location of the configuration files of this instance of TomcatCATALINA_HOME=/usr/lo

nginx日志分析利器GoAccess

面试的时候一定会被面到的问题是:给出web服务器的访问日志,请写一个脚本来统计访问前10的IP有哪些?访问前10的请求有哪些?当你领略过goaccess之后,你就明白,这些问题,除了考验你的脚本背诵记忆能力以外,唯一的作用只有装A或者装C了. 对于nginx日志分析,有很多工具,衡量好坏的标准大概就是三快:安装快,解析快,上手快.满足这三点的goaccess确实是居家必备良药. 话说这个标题其实有点委屈GoAccess了,它是一个日志分析工具,并不只是为nginx使用的.你也可以用它来分析apa

GoAccess:nginx日志分析利器

面试的时候一定会被面到的问题是:给出web服务器的访问日志,请写一个脚本来统计访问前10的IP有哪些?访问前10的请求有哪些?当你领略过goaccess之后,你就明白,这些问题,除了考验你的脚本背诵记忆能力以外,唯一的作用只有装A或者装C了. 对于nginx日志分析,有很多工具,衡量好坏的标准大概就是三快:安装快,解析快,上手快.满足这三点的goaccess确实是居家必备良药. 话说这个标题其实有点委屈GoAccess了,它是一个日志分析工具,并不只是为nginx使用的.你也可以用它来分析apa