zoukankan      html  css  js  c++  java
  • linux 通过MD5监控指定路径文件的变动

    脚本须知:

      1. 运行此脚本的用户必须是root,因为在某些文件所在路径普通用户没有访问权限

      2. 源文件和其md5码只要有一方内容有改动,都会导致校验失败,所以校验码的保存就至关重要防止其他人修改,建议修改权限为 root root 600

      3. 此脚本带简单的日志功能,方便以后系统安全评估和查看

      4.对一个目录下的所有文件做校验,一般有以下几种情况:

        1)该目录下文件总的数量没有发生变化,但个别源文件内容发生修改

          x文件 --> 改变 --> 记录日志

        2)该目录下文件总的数量发生改变

          a 新增文件 --> 校验 -->记录日志

          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] 33[31m[MD5结果:去除]33[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] 33[31m[MD5结果:改变]33[0m" 2>&1 | tee -a /var/log/md5.log
    33         else
    34             echo -e "[检测时间:`date +"%Y-%m-%d %T.%N"`]  [文件:$list] 33[32m[MD5结果:未改变]33[0m" 
    35         fi
    36     else
    37         md5sum $list >> $md5_path
    38         echo -e "[检测时间:`date +"%Y-%m-%d %T.%N"`]  [文件:$list] 33[31m[MD5结果:添加]33[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

       

       再次执行脚本校验

     

       可以看到,日志里记录了改变的文件相关信息,以后我们可以通过查看此日志文件,来锁定那些文件被修改,然后根据时间点去大概锁定一个篡改来源

  • 相关阅读:
    使群辉支持NTFS(未完善)
    docker 解决 Dockerfile同级文件有其他文件 导致docker build包越来越大
    nginx location配置前后端地址
    前端 Umi框架自带的proxy功能请求后端地址
    linux常用命令
    arthas的使用(正常部署+服务docker部署)
    linux
    oracle行转列,列转行函数的使用(listagg,xmlagg)
    oracle 使用函数 ROW_NUMBER() OVER(PARTITION BY 列 ORDER BY 列 排序 ),自关联日志表,将列数据转换为 行数据
    oracle merge into用法
  • 原文地址:https://www.cnblogs.com/M18-BlankBox/p/6025515.html
Copyright © 2011-2022 走看看