维护的网站一直受到后门程序的篡改页面的烦恼,一直都没找到合适的方案解决。一直在思考如何实现对网站目录的实时监控,一旦发现了陌生的文件,即可去判断是否是后门文件。
最近在github上面发现了一款工具inotify-tools,通过对linux操作系统的inotify提供接口,可以实现监控的功能,其中主要使用的是工具包中的inotifywatch程序。
项目说明WIKI: https://github.com/rvoicilas/inotify-tools/wiki
简要说明一下安装使用的方法:
因为服务器是centos 7 ,已经有发行版本的软件了,所以直接通过yum安装
yum --enablerepo=epel install inotify-tools
安装完成之后我们需要的监控程序是在/usr/bin/inotifywatch
配置一个sh脚本程序:
#!/bin/sh /usr/bin/inotifywait -drq --timefmt '%d/%m/%y %H:%M' --format '%T %w %f %e' -o /alidata1/monitor.log -e modify,delete,create,attrib /alidata1/web给这个脚本做一个开机自启动,这样当服务器重启的时候监控程序也会自动启动,修改/etc/rc.local这个文件,在最后写入 /bin/sh /root/monitor.sh &
记得给/etc/rc.local 文件添加执行权限 chmod +x /etc/rc.local
另外需要修改一下 /proc/sys/fs/inotify 目录内三个文件的值,不然监控无法启动:
Failed to watch /alidata1/www/web; upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via `/proc/sys/fs/inotify/max_user_watches'.
fs.inotify.max_user_watches=999999999上面的修改是在 /etc/sysctl.conf 这个文件里面直接添加的,如果其他两个文件参数引起启动失败,也可以照这个类似修改。
记得重启服务器,然后在网站目录做一些文件创建之类的操作测试一下。
说明一下执行脚本里面的参数说明:
-drq 三个参数分别代表 daemon recursive quiet ,也就是以守护进程的形式,递归的对目录和子目录进行监控,并且只输出事件类型。
--timefmt 是事件时间的格式,需要和 --format 的 %T 搭配使用
%w 表示事件发生的目录
%f 表示事件发生的文件
%e 表示发生的事件名称
-o 是指定事件发生记录在哪个文件里面
-e 表示记录事件类型
最后的 /alidata1/web 就是需要监控的目录了。这个可以酌情修改。
inotifywatch具体的参数可以通过命令:
inotifywatch --help
来获取。
以上的方法是监控一个目录和子目录内的全部的文件,但是一般情况下,PHP的后门都是php文件,我们不需要监控其他的诸如js,css等文件,所以可以在执行命令里使用参数--excludei,这个参数和--exclude都是忽略文件的作用,但是,它对文件名称的大小写不敏感了,于是,脚本可以这样:
#!/bin/sh /usr/bin/inotifywait -drq --timefmt '%d/%m/%y %H:%M' --format '%T %w %f %e' -o /alidata1/monitor.log -e create,move,delete,modify --excludei '.*/*.html|.*/*.css|.*/*.js|.*/*.txt|.*/*.bak|.*/*.jpg|.*/*.png|.*/*.gif|.*/*.jpeg|.*/*.htm|.*/*.inc' /alidata1/web
这样可以尽量将不需要监控的其他类型文件过滤掉,提高监控的精度。