监控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、对面监控前后的目录和文件的大小进行对比
################################################################################
################################################################################
本文出自 “奋斗吧” 博客,请务必保留此出处http://lvnian.blog.51cto.com/7155281/1701728
本文转自 fxl风 51CTO博客,原文链接:http://blog.51cto.com/fengxiaoli/1952024