1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/bin/bash
#######################################################
# 脚本名: file_monity.sh
# 版本: v1.0
# 作者: zhangyu
# 组织: http://zhangyu233.com
# 更新时间: 2018-6-12
# 功能: #此脚本用于检测linux系统重要文件是否被改动,如果改动则用邮件报警
# 描述: 参考http://www.cnblogs.com/kevingrace/p/8260032.html
###
#建议用定时任务执行此脚本,如每5分钟执行一次,
####*/5 * * * * /bin/bash /opt/file_monit.sh > /dev/null 2>&1

##############################################################
###rpm -Uvh http://mirrors.sohu.com/fedora-epel/7Server/x86_64/Packages/i/inotify-tools-3.14-8.el7.x86_64.rpm
###第一次安装,后面就不用了
##监控-文件状态。--事先是运行下面的命令 --或者加入supervisor 这里我监控的是/data/test目录
#inotifywait -mrq --timefmt '%Y-%m-%dT%H:%m:%S' --format '%T %w%f %e' -e modify,delete,create,attrib /data/test >> /tmp/inotify.log &


install_mailx () {
yum -y remove sendmail
yum -y install mailx

cat >>/etc/mail.rc<< EOF
set from=xxxxx@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth=login
set smtp-auth-user=xxxxx@qq.com
set smtp-auth-password=你的QQ邮箱授权码
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
EOF


echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/pki/nssdb/qq.crt

certutil -A -n "GeoTrust SSL CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/qq.crt

certutil -A -n "GeoTrust Global CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/qq.crt

certutil -L -d /etc/pki/nssdb/

certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d /etc/pki/nssdb/ -i /etc/pki/nssdb/qq.crt
}

#####install_mailx 第一次使用,后面就不用了

#######################################################################################
#定义验证文件所在目录 注意 file_monit.sh 不能放在FileDir里面

FileDir='/opt/checkfile'

#获取主机名或自己定义
HostName=$(hostname)


#定义需要验证的文件目录。这里我监控的是/data/test目录
CheckDir=(
/data/test
)

#定义邮件参数 ,接收邮件地址,邮件主题,邮件内容

Mail_To="xxxxx@qq.com"
Mail_Subject="${HostName}:There are changes to system files"



#生成所定义需验证的文件样本日志函数
OldFile () {
for i in ${CheckDir[@]}
do
find ${i} -type f |xargs md5sum >> ${FileDir}/old.log
done
}

NewFile () {
for i in ${CheckDir[@]}
do
find ${i} -type f |xargs md5sum >> ${FileDir}/new.log
done
}



SendEMail () {
mailx -v -s "$Mail_Subject" $Mail_To < /tmp/inotify.log 2> /dev/null
}

#####################################################
if [ ! -d ${FileDir} ]
then
mkdir ${FileDir}
fi

#假如验证文件目录不存在则创建
if [ ! -f ${FileDir}/old.log ]
then
OldFile
fi


#生成新验证日志
NewFile

#新验证日志与样本日志进行比较
diff ${FileDir}/new.log ${FileDir}/old.log >${FileDir}/diff.log
Status=$?

#假如比较结果有变化,则发送邮件报警
if [ ${Status} -ne 0 ]
then
Mail_Conntent="$(grep '<' ${FileDir}/diff.log |awk '{print $3}')"
SendEMail
fi

#清除新旧日志,把比较结果进行备份
mv -f ${FileDir}/diff.log ${FileDir}/diff#`date +%Y%m%d`.log
cat /tmp/inotify.log >> /tmp/inotify#`date +%Y%m%d`.log

cat /dev/null > /tmp/inotify.log
cat /dev/null > ${FileDir}/old.log
cat /dev/null > ${FileDir}/new.log

#重新生成样本日志
OldFile

#删除目录内30天以前的比较结果备份文件
find ${FileDir} -type f -mtime +30 |xargs rm -f