面试及实战考试题:监控web站点目录(/var/html/www)下所有文件是否被恶意篡改(文件内容被改了),如果有就打印改动的文件名(发邮件),定时任务每3分钟执行一次。
1.1问题分析
1)首先要说明的是,思考过程的积累比实际代码开发的能力积累更重要。
2)什么是恶意篡改,只要是未经过许可的改动都是篡改。
3)文件内容被改动了会有如下特征。
◎ 大小可能会变化
◎ 修改时间会变化
◎ 文件内容会变化,利用md5sum指纹校验
◎ 增加或删除文件,比对每次检测前后的文件数量。
1.2参考解答
本题主要采用md5sum的方法来实现。
第一步,在企业网站发布代码之后,即对所有网站数据建立初始指纹库和文件库,这个步骤很重要,没有基础的指纹库,无法进行入侵检测。
以/var/html/www作为站点目录为例。
1)建立测试数据:
[[email protected] scripts]# mkdir /var/html/www -p #<==创建站点目录。
[[email protected] scripts]# cp -a /etc/a* /var/html/www #<==复制少量测试数据。
[[email protected] scripts]# cp -a /etc/b* /var/html/www #<==复制少量测试数据。
[[email protected] scripts]# ls /var/html/www #<==检查。
abrt acpi adjtime aliases aliases.db alsa alternatives anacrontab asound.conf at.deny audisp audit bash_completion.d bashrc blkid
2)建立初始的文件指纹库:
[[email protected] scripts]# find /var/html/www -type f|xargs md5sum >/opt/zhiwen.db.ori
<==建立文件内容指纹库。
[[email protected] scripts]# tail /opt/zhiwen.db.ori
68b329da9893e34099c7d8ad5cb9c940 /var/html/www/at.deny
e5d91bca71662d7c09bc7fc731ad3222 /var/html/www/adjtime
8241db83d5edf01c71734e41e383e205 /var/html/www/anacrontab
c23a47aca3ec55122b8871c5a61494b5 /var/html/www/abrt/abrt-action-save-package-data.conf
9cd848af905b767fa410070b265a70c7 /var/html/www/abrt/gpg_keys
b6bcc3a178b9442d30d88444a9311769 /var/html/www/abrt/abrt.conf
441645d0e419c1f593694ca014817ee1 /var/html/www/abrt/plugins/CCpp.conf
1ecf30990ac5948a8e3bd7b8c1cd944f /var/html/www/abrt/plugins/python.conf
1e4aded98bb1ff08094c8dfb09d33192 /var/html/www/abrt/plugins/oops.conf
b2a676d524cb2d46eccc00baadfbfe29 /var/html/www/aliases.db
3)建立初始的文件库:
[[email protected] scripts]# find /var/html/www -type f>/opt/wenjian.db.ori
#<==建立文件数量和名字库。
[[email protected] scripts]# tail /opt/wenjian.db.ori
/var/html/www/at.deny
/var/html/www/adjtime
/var/html/www/anacrontab
/var/html/www/abrt/abrt-action-save-package-data.conf
/var/html/www/abrt/gpg_keys
/var/html/www/abrt/abrt.conf
/var/html/www/abrt/plugins/CCpp.conf
/var/html/www/abrt/plugins/python.conf
/var/html/www/abrt/plugins/oops.conf
/var/html/www/aliases.db
第二步,检测文件内容和文件数量变化。
1)检测文件内容变化:
[[email protected] scripts]# echo oldboy>>/var/html/www/audisp/plugins.d/af_unix.conf #<==篡改文件。
[[email protected] scripts]# export #<==调整字符集。
[[email protected] scripts]# md5sum -c --quiet/opt/zhiwen.db.ori
#<==检查所有文件的内容是否变化。
/var/html/www/audisp/plugins.d/af_unix.conf: FAILED #<==变化的会被打印出来。
md5sum: WARNING: 1 of 29 computed checksums did NOTmatch #<==综合提示。
2)检测文件数量变化:
[[email protected] scripts]# echo oldgirl.txt>/var/html/www/test.txt
#<==模拟增加新文件。
[[email protected] scripts]# md5sum -c --quiet/opt/zhiwen.db.ori
#<==利用指纹库无法检测新增文件。
/var/html/www/audisp/plugins.d/af_unix.conf: FAILED
md5sum: WARNING: 1 of 29 computed checksums did NOT match
[[email protected] scripts]# find /var/html/www -type f>/opt/wenjian.db_curr.ori
#<==获取检测前的所有文件数量及文件名。
[[email protected] scripts]# diff /opt/wenjian.db* #<==采用diff命令比较。
20d19
< /var/html/www/test.txt #<==test.txt就是新增的,怎么样,还可以吧。
第三步,开发检查指纹识别脚本。
首先,人工做如下操作:
[[email protected] scripts]# find /var/html/www -type f |xargs md5sum>/opt/zhiwen.db.ori
[[email protected] scripts]# find /var/html/www -type f>/opt/wenjian.db.ori
脚本检测会以上述两个命令获取的结果为原始的正确依据,如下
[[email protected] scripts]# cat 30-14.sh
#!/bin/bash
RETVAL=0 #<==状态初始化。
export #<==调整字符集。
CHECK_DIR=/var/html/www #<==定义要监测得站点目录。
[ -e $CHECK_DIR ] || exit 1 #<==如果目录不存在则退出脚本。
ZhiWenDbOri="/opt/zhiwen.db.ori" #<==定义原始指纹库路径。
FileCountDbOri="/opt/wenjian.db.ori" #<==定义原始文件库路径。
ErrLog="/opt/err.log" #<==定义检测后的内容日志。
[ -e $ZhiWenDbOri ] || exit 2 #<==如果原始指纹库不存在则退出脚本。
[ -e $FileCountDbOri ] || exit 3 #<==如果原始文件库不存在则退出脚本。
#judge file contet
echo "[[email protected] scripts]# md5sum -c --quit/opt/zhiwen.db.ori">$ErrLog #<==打印检测命令。
md5sum -c --quiet /opt/wenjian.db.ori &>>$ErrLog #<==实际执行检测命令。
RETVAL=$? #<==收集返回值。
#com file count
find $CHECK_DIR -type f >/opt/wenjian.db_curr.ori #<==实际执行检测命令,获取最新文件数量等。
echo "[[email protected] scripts]# diff /opt/wenjian.db*"&>>$ErrLog #<==打印检测命令。
diff /opt/wenjian.db* &>>$ErrLog #<==实际执行检测命令,比对文件数量及文件名变化情况。
if [ $RETVAL -ne 0 -o `diff /opt/wenjian.db*|wc -l`-ne 0 ]
#<==如果返回值不为0,或者比对结果行数不为0,则进入判断。
then
mail -s "`uname -n`$(date +%F) err" [email protected] <$ErrLog
else
echo "Sites dir isok"|mail -s"`uname -n` $(date +%F) is ok" [email protected]
fi
mail发送相关配置内容
[[email protected] scripts]# cat /etc/mail.rc
# For Linux and BSD, this should be set. #<==配置文件的最后修改mail内容。
set bsdcompat
set [email protected] smtp=smtp.163.com
set smtp-auth-user=15537920814smtp-auth-password=l123456 smtp-auth=login
然后利用定时任务检查,命令如下:
[[email protected] scripts]# crontab -l|tail -2
# ids monitor site dir and file change by oldboy at20170511
*/3 * * * * /bin/sh /server/scripts/30-10.sh>/dev/null 2>&1
现在来思考一下,在企业中一般什么文件需要做指纹验证呢?
系统命令、用户文件、配置文件、启动文件等重要文件,都要监控起来,另外,在实际工作中应对所有的用户操作做日志审计,让所有人的所有操作无处遁形,起到威慑和监督的作用,从而减少被当作“黑锅侠”的风险。