题目要求:使用shell脚本监控网站目录(/var/html/www)中的文件是否被篡改,如果有就打印出改动的文件名并用邮件告警。
分析:
概念:
什麽是恶意篡改?只要是未进过许可改动的都是恶意篡改。
文件被篡改了,会有特征:
a.文件大小可能会发生变化;
b.文件的修改时间会发生变化(文件测试符ot、nt等);
c.文件内容会发生变化(md5sum指纹);
d.文件目录中的文件被删除,或者文件目录中有其他文件增加;
注意:
需要文件信息记录库(变化前 VS 变化后,这个是衡量对比的标准)
实际应用:
1.代码发布方案:大公司或规范的公司,不会时刻上传代码,每天1-2次为宜。
2.服务器上的项目目录是否被黑客入侵进行恶意篡改。
解答:
命令行测试:
[root@myhost ~]# cd /var/www/html
[root@myhost html]# pwd
/var/www/html
[root@myhost html]# touch wenben1.txt
[root@myhost html]# cat wenben1.txt
[root@myhost html]# md5sum wenben1.txt
d41d8cd98f00b204e9800998ecf8427e wenben1.txt
[root@myhost html]# echo "addContent to the file" >> wenben1.txt
[root@myhost html]# cat wenben1.txt
addContent to the file
[root@myhost html]# md5sum wenben1.txt
009c4ee40b070fa48fb47c503642c0f1 wenben1.txt
[root@myhost html]# find /var/www/html/ -type f | xargs md5sum
009c4ee40b070fa48fb47c503642c0f1 /var/www/html/wenben1.txt
d41d8cd98f00b204e9800998ecf8427e /var/www/html/wenben2.txt
[root@myhost html]# find /var/www/html/ -type f | xargs md5sum > /home/yuki/infoDB/md5sumBefore.log
[root@myhost html]# cat /home/yuki/infoDB/md5sumBefore.log
009c4ee40b070fa48fb47c503642c0f1 /var/www/html/wenben1.txt
d41d8cd98f00b204e9800998ecf8427e /var/www/html/wenben2.txt
[root@myhost html]# md5sum -c /home/yuki/infoDB/md5sumBefore.log
/var/www/html/wenben1.txt: OK
/var/www/html/wenben2.txt: OK
[root@myhost html]# md5sum -c /home/yuki/infoDB/md5sumBefore |egrep -i "fail"
#测试:修改文件中的内容(增加内容/减少内容/修改内容)
[root@myhost html]# echo "now we add sth to the file with name wenben2.txt" >> wenben2.txt
[root@myhost html]# md5sum -c /home/yuki/infoDB/md5sumBefore.log |egrep -i "fail"
md5sum: WARNING: 1 of 2 computed checksums did NOT match
/var/www/html/wenben2.txt: FAILED
#测试:删除某个文件
[root@myhost html]# rm -rf wenben1.txt
[root@myhost html]# md5sum -c /home/yuki/infoDB/md5sumBefore.log
md5sum: /var/www/html/wenben1.txt: No such file or directory
/var/www/html/wenben1.txt: FAILED open or read
/var/www/html/wenben2.txt: FAILED
md5sum: WARNING: 1 of 2 listed files could not be read
md5sum: WARNING: 1 of 1 computed checksum did NOT match
#测试:创建刚刚删除的文件
[root@myhost html]# touch wenben1.txt
[root@myhost html]# md5sum -c /home/yuki/infoDB/md5sumBefore.log
/var/www/html/wenben1.txt: FAILED
/var/www/html/wenben2.txt: FAILED
md5sum: WARNING: 2 of 2 computed checksums did NOT match
#注意:向刚刚创建的文件恢复删除之前的内容,md5sum又和之前的一样了。
[root@myhost html]# echo "addContent to the file" >> wenben1.txt
[root@myhost html]# md5sum -c /home/yuki/infoDB/md5sumBefore.log
/var/www/html/wenben1.txt: OK
/var/www/html/wenben2.txt: FAILED
md5sum: WARNING: 1 of 2 computed checksums did NOT match
#测试:创建新的文件(新的文件代表着它的md5sum指纹从未被记录到文件记录信息库中去)
[root@myhost html]# touch newFresh.log
[root@myhost html]# md5sum -c /home/yuki/infoDB/md5sumBefore.log
/var/www/html/wenben1.txt: OK
/var/www/html/wenben2.txt: FAILED
md5sum: WARNING: 1 of 2 computed checksums did NOT match
#注意:我发现md5sum从未被记录的新文件是无法被监控对比到是否被篡改了。
#但是,我们可以提前将这个目录的文件数量、信息都记录下来然后再将现在的文件数量和之前的进行对比就可以什麽新文件被创建了。
[root@myhost html]# ll
total 8
-rw-r--r--. 1 root root 0 Nov 14 14:01 newFresh.log
-rw-r--r--. 1 root root 23 Nov 14 13:58 wenben1.txt
-rw-r--r--. 1 root root 49 Nov 14 11:45 wenben2.txt
[root@myhost html]# find /var/www/html/ -type f | wc -l
3
#创建前记录
[root@myhost html]# find /var/www/html/ -type f > /home/yuki/infoDB/fileInfoBefore.log
#创建新文件
[root@myhost html]# touch wenben3.log
[root@myhost html]# ll
total 8
-rw-r--r--. 1 root root 0 Nov 14 14:01 newFresh.log
-rw-r--r--. 1 root root 23 Nov 14 13:58 wenben1.txt
-rw-r--r--. 1 root root 49 Nov 14 11:45 wenben2.txt
-rw-r--r--. 1 root root 0 Nov 14 14:09 wenben3.log
#创建后再记录
[root@myhost html]# find /var/www/html/ -type f > /home/yuki/infoDB/fileInfoAfter.log
#比较两个记录文件的不同
[root@myhost html]# diff /home/yuki/infoDB/fileInfoBefore.log /home/yuki/infoDB/fileInfoAfter.log
diff: home/yuki/infoDB/fileInfoAfter.log: No such file or directory
脚本编写:
脚本1:篡改之前做文件信息记录库,(变化前 VS 变化后,这个是衡量对比的标准)
#!/bin/sh
source /etc/profile
#define variable
#定义一个需要监控的站点目录
siteDir="/var/www/html"
#定义一个文件信息库目录
path="/home/yuki/infoDB"
if [ !d ${path} ];
then
mkdir -p ${path}
fi
#做好的文件md5sum指纹记录文件
md5sumBeforeDB="${path}/md5sumBefore.log"
if [ -f ${md5sumBeforeDB} ];
then
touch ${md5sumBeforeDB}
fi
echo `find ${siteDir} -type f | xargs > ${path}/md5sumBefore.log`
#篡改之前记录的需要监控目录下的文件数量、信息记录
fileInfoBefore="${path}/fileInfoBefore.log"
if [ -f ${fileInfoBefore} ];
then
touch ${fileInfoBefore}
fi
echo `find ${siteDir} -type f > ${path}/fileInfoBefore.log`
脚本2:网站目录(/var/html/www)中的文件是否被篡改,如果有就打印出改动的文件名并用邮件告警。
#!/bin/sh
source /etc/profile
#define variable
#定义一个邮件地址
[email protected]
#定义需要监控的站点目录
siteDir="/var/www/html"
#定义文件信息库目录
path="/home/yuki/infoDB"
if [ !d ${path} ];
then
mkdir -p ${path}
fi
#下面这个是之前就做好的文件md5sum指纹记录文件
md5sumBeforeDB="${path}/md5sumBefore.log"
fileInfoBefore="${path}/fileInfoBefore.log"
if [ ! -f ${md5sumBeforeDB} -o ! -f ${fileInfoBefore} ];
then
echo "文件信息库的建立不完全,无法参照对比"
exit 1
fi
fileNumBefore=`cat ${fileInfoBefore}|wc -l`
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
#篡改之后记录的需要监控目录下的文件数量、信息记录
fileInfoAfter="${path}/fileInfoAfter.log"
if [ -f ${fileInfoAfter} ];
then
touch ${fileInfoAfter}
fi
echo `find ${siteDir} -type f > ${path}/fileInfoBefore.log`
fileNumAfter=`cat ${fileInfoAfter}|wc -l`
#再继续定义一个记录篡改文件的篡改信息文件,方便后面邮件告警。
recordAllInfoLog="${path}/recordAllInfo.log"
if [ ! -f ${recordAllInfoLog} ];
then
touch ${recordAllInfoLog}
fi
#篡改标志可以通过两个方面进行比较:
#2>/dev/null 将错误信息追加空设备
changeNumFlag=`md5sum -c ${md5sumBeforeDB} 2 > /dev/null |egrep -i "failed" | wc -l`
if [ ${changeNumFlag} -ne 0 ] || [ ${fileNumAfter} -ne ${fileNumBefore} ]
then
echo `md5sum -c ${md5sumBeforeDB} 2 > /dev/null |egrep -i "failed"` > ${recordAllInfoLog}
diff ${fileInfoAfter} ${fileInfoBefore} >> ${recordAllInfoLog}
happenTime= `date "+%Y-%m-%d %H:%M:%S"`
mail -s "the directory of the site on ${happenTime} ${email}" < ${recordAllInfoLog}
fi