chaihongjun.me

inotify-tools工具inotifywatch实时监控网站目录

维护的网站一直受到后门程序的篡改页面的烦恼,一直都没找到合适的方案解决。一直在思考如何实现对网站目录的实时监控,一旦发现了陌生的文件,即可去判断是否是后门文件。

最近在github上面发现了一款工具inotify-tools,通过对linux操作系统的inotify提供接口,可以实现监控的功能,其中主要使用的是工具包中的inotifywatch程序。

项目说明WIKI: https://github.com/rvoicilas/inotify-tools/wiki

简要说明一下安装使用的方法:

  1. 因为服务器是centos 7 ,已经有发行版本的软件了,所以直接通过yum安装

     yum --enablerepo=epel install inotify-tools

  2. 安装完成之后我们需要的监控程序是在/usr/bin/inotifywatch

  3. 配置一个sh脚本程序:

  4. #!/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
  5. 给这个脚本做一个开机自启动,这样当服务器重启的时候监控程序也会自动启动,修改/etc/rc.local这个文件,在最后写入 /bin/sh /root/monitor.sh & 

  6. 记得给/etc/rc.local 文件添加执行权限 chmod +x /etc/rc.local 

  7. 另外需要修改一下 /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'.

  8. fs.inotify.max_user_watches=999999999

    上面的修改是在 /etc/sysctl.conf 这个文件里面直接添加的,如果其他两个文件参数引起启动失败,也可以照这个类似修改。

  9. 记得重启服务器,然后在网站目录做一些文件创建之类的操作测试一下。


说明一下执行脚本里面的参数说明:

-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

这样可以尽量将不需要监控的其他类型文件过滤掉,提高监控的精度。

知识共享许可协议本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。作者:柴宏俊»

相关推荐