脚本须知:shell
1. 运行此脚本的用户必须是root,由于在某些文件所在路径普通用户没有访问权限安全
2. 源文件和其md5码只要有一方内容有改动,都会致使校验失败,因此校验码的保存就相当重要防止其余人修改,建议修改权限为 root root 600bash
3. 此脚本带简单的日志功能,方便之后系统安全评估和查看spa
4.对一个目录下的全部文件作校验,通常有如下几种状况:日志
1)该目录下文件总的数量没有发生变化,但个别源文件内容发生修改code
x文件 --> 改变 --> 记录日志blog
2)该目录下文件总的数量发生改变ip
a 新增文件 --> 校验 -->记录日志md5
b 文件丢失 --> 记录日志 --> 是否删除此文件的MD5校验值字符串
Yes -- (目前此脚本没有提示用户是否要删除丢失源文件校验码,暂时须要手动删除,删不删除须要根据需求)
No -- 找回丢失的源文件从新校验
5. 该脚本目前没有实现告警功能,这个功能模块其实能够经过SendEmail实现,后期补上
6. 校验的文件应该是不常常修改的文件,好比etc下的配置文件,若是校验常常变更的文件没有任何意义,好比日志文件
1 #!/bin/bash 2 # 3 # QQ: 765482322 4 5 # 定义MD5文件保存的路径 6 md5_path=/tmp/md5.sum 7 8 # 判断MD5基准校验文件是否存在,不存在则建立此文件,并修改权限只有root用户或者指定用户有读写权限 9 [ ! -f $md5_path ] && touch $md5_path && chmod 600 $md5_path 10 read -p "请输入你须要MD5检验文件的目录,必须以\"/\"开始: " path 11 if ! echo $path | grep -q "^/";then echo "不是以\"/\"开始";exit 1;fi 12 13 echo "#################################################" 14 # 若是所给须要md5校验的目录不存在,或者目录存在但目录下没有一个文件,则返回错误并提示用户 15 if [ ! -d $path ] || [ `find $path -type f | wc -l` -eq 0 ];then 16 echo "错误:路径不存在或者该路径下没有文件" 17 exit 1 18 fi 19 # 判断基准文件数量 20 for i in `cat /tmp/md5.sum | awk '{print $2}'`;do 21 [ ! -f $i ] && echo -e "[检测时间:`date +"%Y-%m-%d %T.%N"`] [文件:$i] \033[31m[MD5结果:去除]\033[0m" 2>&1 | tee -a /var/log/md5.log 22 done 23 24 for list in `find $path -type f`;do 25 # echo " list = $list" 26 new_md5_arg1=`md5sum $list | awk '{print $1}'` 27 new_md5_arg2=`md5sum $list | awk '{print $2}'` 28 old_md5_arg2=`awk -v List="$list" '$2 == List{print $2}' $md5_path` 29 if [[ "$new_md5_arg2" == "$old_md5_arg2" ]];then 30 old_md5_arg1=`awk -v List="$list" '$2 == List{print $1}' $md5_path` 31 if [[ ! "$new_md5_arg1" == "$old_md5_arg1" ]];then 32 echo -e "[检测时间:`date +"%Y-%m-%d %T.%N"`] [文件:$list] \033[31m[MD5结果:改变]\033[0m" 2>&1 | tee -a /var/log/md5.log 33 else 34 echo -e "[检测时间:`date +"%Y-%m-%d %T.%N"`] [文件:$list] \033[32m[MD5结果:未改变]\033[0m" 35 fi 36 else 37 md5sum $list >> $md5_path 38 echo -e "[检测时间:`date +"%Y-%m-%d %T.%N"`] [文件:$list] \033[31m[MD5结果:添加]\033[0m" 2>&1 | tee -a /var/log/md5.log 39 fi 40 # 若是文件数量大,能够把sleep的时间间隔设置小点。 41 sleep 0.2 42 done 43 44
脚本执行展现
第一种状况:校验目录下的文件总数不变,个别文件遭到篡改
对一个新路径下的全部文件作校验,因为第一次校验因此至关于发生改变
记录到日志
再次执行校验:
查看日志,能够看到/etc/sysconfig/network-scripts 路径下没有文件发生改变
模拟篡改一个文件,好比/etc/sysconfig/network-scripts/ifcfg-eth0 追加一行带 # 注释的字符串到其尾部
shell>echo "#hello world" >> /etc/sysconfig/network-scripts/ifcfg-eth0
再次执行脚本校验
能够看到,日志里记录了改变的文件相关信息,之后咱们能够经过查看此日志文件,来锁定那些文件被修改,而后根据时间点去大概锁定一个篡改来源