监控站点目录文件是否被篡改


监控web站点目录下的所有文件是否被恶意篡改,如果有改动就打印改动的文件名,发邮件给管理员,定时任务每隔3分钟执行一次


监控的站点目录是(/var/http/www)

解答:

1、什么是恶意篡改,只有为经过许可的改动都是篡改。

2、文件被篡改的特征

  a、大小可能会变化

  b、修改时间会变化,(文件测试符:ot、nt)

  c、文件内容会变化,md5sum指纹

  d、文件是否被增加或者删除

  

  

问题:

可能脚本无法区分哪些是开发正常的代码上线更改,哪些是***的二元篡改。

一般代码发布,都是有相关规定的,在代码发布时,我们可以不监控暂停。如果是MD5sum指纹对比,是否修改文件,我们也会在代码更新后,重新生成md5sum的对比源

1、代码发布方案:大公司或者规范的公司,不会时刻传代码,每天1-2次

2、脚本不严谨啊,工作中先解决问题,然后在解决好问题



解决方法:

1、根据md5sum 对比

2、用inotify监控,如果发生变化就把变化的文件同步到其他目录

3、根据文件内容长度比较.

4、根据文件大小比较.

################################################################################

################################################################################

1、根据md5sum 对比

 缺点:如果是新建的文件,因为之前没有指纹,所以无法检测,解决,我们可以在建立指纹库的时候,也把这个目录的文件数目记录下来。在脚本监控的时候,也把文件数目进行对比,如果文件数目发生变化,那也一样可以监控了

 

 

  a、人工控制指纹文件的建立,上线前执行建立指纹库的操作,并保存

     命令:md5su  路径 > 指纹文件

#find /etc/ -type f -name "*" -exec md5sum {} > /tmp/checkmd5.db \;

find /etc/ -type f -name "*" | xargs md5sum > /tmp/checkmd5.db

 

取监控目录的文件数目

ls -l /etc/ |wc -l

==================

ls -l /etc/ >>site.log

  b、根据指纹库,对比是否发生变化

     md5sum -c /tmp/checkmd5.db

  

  c、过滤发生变化的文件

      md5sum -c /tmp/checkmd5.db |grep -i FAILED

  开发检查指纹识别的脚本

   #!/bin/sh

   num=`cat site.log|wc -l`

   md5num=`md5sum -c /tmp/checkmd5.db|grep -i FAILED|wc -l`

   filenum=`ls -l /etc/ |wc -l`

   if [  $md5num -ne 0 ]

      then

       echo "md5sum -c /tmp/checkmd5.db|grep -i FAILED"

   fi

   

   if [ $filenum -ne $num ]

      then

       echo "/etc/ dir is change"

   fi

     ###上面的site.log 和 /tmp/checkmd5.db 都是在监控前取到的数据

========================================================== 

把上面脚本变成定时任务,定时监控,或者写while 语句定时监控

[root@LAMP 04]# cat md5diff.sh 

#!/bin/sh

while true 

do

   num=`cat site.log|wc -l`

   md5num=`md5sum -c /tmp/checkmd5.db|grep -i FAILED|wc -l`

   filenum=`ls -l /etc/ |wc -l`

   if [  $md5num -ne 0 ]

   then

      echo "`md5sum -c /tmp/checkmd5.db|grep -i FAILED`"

   fi


   if [ $filenum -ne $num ]

   then

      echo "/etc/ dir is change"

   fi

   sleep 5

done

################################################################################

################################################################################

2、用inotify监控,如果发生变化就把变化的文件同步到其他目录

#!/bin/bash

#par

. /etc/init.d/functions

src=/data/

des=/tmp/data.log

inotify_home=/application/inotify


#${inotify_home}/bin/inotifywait -mrq  --format '%w%f' -e create,delete,close_write $src  >>$des


${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src  >> $des


if [ -s "$des" ]

  then

    action "web site change" /bin/true

cat /dev/null > $des

  else

    action "web site no change" /bin/true

fi  


################################################################################

################################################################################

3、根据文件内容长度比较

 a、在实施方案前,想取得要监控的目录的文件数目,以及每个文件的行数。甚至字节数,

 b、在实施时,就再去监控这个目录的文件数目,以及每个文件的行数,甚至字节数,

 c、对面监控前后,这些文件数目和每个文件行数,进行对比


获取文件数目,和每个文件长度的长度

#!/bin/sh

. /etc/init.d/functions

for file in `ls ./`

do 

   filelen=`cat $file|wc -l` 

   echo "$file ==========>  $filelen"  >> file.log

done

   dirlen=`ls -l /data/|wc -l`

   echo "data ==========>  $dirlen"  >> file.log  

  


################################################################################

################################################################################


3、根据文件大小比较

 a、在实施方案前,想取得要监控的目录大小,以及每个的文件大小

 b、在实施时,就再去监控这个目录大小,以及每个文件的大小

 c、对面监控前后的目录和文件的大小进行对比

 

################################################################################

################################################################################