故障点:大部分地区访问我们的门户网站都跳转到同一条域名地址了

  

故障点分析:

    1.大部分域名被劫持跳转到同一条域名

    2.域名劫持只有部分地区,但都是访问量大的地区

    3.授权DNS的工具dnspod刚好这个时间维护了

    4.nginx配置文件被修改,是否有做地址重写

    5.问开发说可能是js或者php文件被篡改,url地址被程序重写定向了

 

解决流程:

  起初,我们以为部分地区被劫持,加上dnspod维护,以为是dnspod那里业务受到了影响,导致了跳转现象。但是从dnspod上的维护信息上看,只是解析业务暂停,之前解析好的域名业务正常使用,而我们在这个时间之前解析的域名还是被劫持,所以排除掉dnspod工具解析波动的问题。

  查看nginx配置文件,都是正常的。那就只有文件被篡改这个了,站点文件很多,成千上万个,先用find加grep 跳转url地址 排查下,无果。想想也知道,***者怎么会傻到暴露很明显的url地址了,那不很快的排除掉了。然后我们就只有从重点文件一个个下手排查异常,配合开发,才知道url地址都要过一个防sql注入的php文件过滤规则,仔细检查这个文件。发现多了一个异常函数,大概意思就是所有访问的url地址全部跳转到这个url地址,这个地址用16进制加密了,而且还生成了一个隐藏的临时文件,这个临时文件放置了大量的IP,都是针对地区性的。注释掉这个函数,问题就解决了。这个问题虽小,但是影响很大(初入运维这行,故障问题点分析或解决可能不专业,敬请谅解)




为了防止下次再出现类似问题,本人开发了一个shell脚本用来实现***检测和报警(如有不完善的地方,欢迎各位读者热情交流探讨)


一:文件内容改变有以下特征

  1. 文件内容会变化,这里用生成md5sum指纹验证

  2. 文件大小会变化

  3. 文件时间会话

  4. 增加或者删除一些文件,比对每次检测后的差异文件数量


二:脚本的实现流程和思路

  本文以监控Web服务器apache的站点目录/var/html/www下的所有文件是否被篡改为示例,实际环境参考自己部署的代码目录以及监测所需的文件  

  生成环境中,在网站发布代码之后,就可以对网站数据或者服务相关的配置建立初始的指纹库和文件数量库,这步很重要。这是最基础的指纹库,后面就没有对比的对象,那就无法进行***检测了。

  友情提示:chattr  +i    +文件名   可以锁死文件,防止修改和删除重要文件,一般对/etc/passwd和/etc/shadow这种放置重要数据的类似文件,都可以用这个命令锁起来。如果为了更加安全,可以改名chattr这个命令为其它名字,记住修改名即可。但是要经常修改的文件用这个方法就比较麻烦了,要先解锁,才能正常修改。


1)导入测试数据

cp -a /etc/a* /var/www/html/

cp -a /etc/b* /var/www/html/ 

[root@www html]# ls /var/www/html/

abrt     aliases     alternatives  at.deny  bash_completion.d

acpi     aliases.db  anacrontab    audisp   bashrc

adjtime  alsa        asound.conf   audit    blkid


2)建立初始的文件指纹库

find /var/www/html/ -type f |xargs md5sum >/opt/zhiwen.db    #建立文件内容指纹库

[root@www opt]# tail -5 /opt/zhiwen.db

5238f32ba493cb2543bb2ed222a7a397  /var/www/html/bashrc

9cf17d7193572d7e684215051926b8ed  /var/www/html/aliases.db

199eaa1e43fa9139f0910bdb64fd219e  /var/www/html/audisp/plugins.d/af_unix.conf

b011b799f8cf6918611c9949bef00c19  /var/www/html/audisp/plugins.d/syslog.conf

2bba2f3012bdee732a5cfb7edf3a52a2  /var/www/html/audisp/audispd.conf


3)建立初始的文件数量库

find /var/www/html/ -type f >/opt/wenjian.db    #建立文件名和数量库

[root@www opt]# tail -5 /opt/wenjian.db

/var/www/html/bashrc

/var/www/html/aliases.db

/var/www/html/audisp/plugins.d/af_unix.conf

/var/www/html/audisp/plugins.d/syslog.conf

/var/www/html/audisp/audispd.conf


4)检测文件内容变化

echo ywxi >> /var/www/html/audisp/audispd.conf

export  LANG=en

[root@www html]# md5sum -c --quiet /opt/zhiwen.db    #检测所有文件内容是否有变化。

/var/www/html/audisp/audispd.conf: FAILED

md5sum: WARNING: 1 of 30 computed checksums did NOT match


5 ) 检测文件数量变化

echo ywxi.txt > /var/www/html/test.txt

md5sum -c --quiet /opt/zhiwen.db                                 #无法检测到文件的变化

find /var/www/html/ -type f >/opt/wenjian.db.error      #获取检测前的所有文件数量及文件名

[root@www html]# diff /opt/wenjian.db*                       #用diff命令去比较两个文件的差异

18a19

> /var/www/html/test.txt                                                #这个文件就是新增的


6)调整命令放入shell脚本中

[root@www scripts]# cat /scripts/Monitorfile.sh 

#!/bin/bash

RETVAL=0                                            #状态初始化,有利于下面做

export LANG=zh_CN.UTF-8                 #调整字符集

CHECK_DIR=/var/www/html               #定义检测目录

[ -e $CHECK_DIR ]||exit 1                     #检测目录是否存在

zhiwendb="/opt/zhiwen.db"               #定义原始指纹库路径

filedb="/opt/wenjian.db"                    #定义原始文件库路径

ErrLog="/opt/error.log"                       #定义检测后的日志内容

[ -e $zhiwendb ] || exit 1                      #如果原始指纹库不存在则退出脚本

[ -e $filedb ] || exit 1                            #如果原始文件库不存在则退出脚本


#Detect file content


echo "`date` The contents of the file have been modified" >> $ErrLog    #打印检测命令,方便日志记录清晰可观


md5sum -c --quiet /opt/zhiwen.db &>>$ErrLog                                          #实际执行检测命令


RETVAL=$?                                                                                                    #收集返回值


# Detect the number and name of documents


find $CHECK_DIR  -type f   >/opt/wenjian.db.error                                 #实际执行检测命令,获取最新文件数量


echo "`date` Increase or delete the number of files " &>>$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) error"   *******@qq.com <$ErrLog   #发错误日志给邮箱

 else

   echo "Sites dir is ok"|mail -s "`uname -n` $(date + %F) is ok" *******@qq.com     #发正确信息给邮箱

fi  



7)把脚本放在定时任务里面执行

[root@www opt]# crontab -l|tail -2

#monitor site dir and file change by ywxi at 2018323

*/5 * * * * /bin/sh /scripts/Monitorfile.sh >/dev/null 2>&1


8)测试脚本是否正常使用

[root@www scripts]# sh /scripts/Monitorfile.sh 

[root@www opt]# cat error.log 

2018年 04月 27日 星期五 17:59:53 CST The contents of the file have been modified

/var/www/html/audisp/audispd.conf: 失败

md5sum: 警告:1/30 生成的校验和不匹配

2018年 04月 27日 星期五 17:59:53 CST Increase or delete the number of files 

18a19

> /var/www/html/test.txt                            #这是上面用检测命令时改过的文件和新增的文件

[root@www scripts]# echo ywxi.test >>/var/www/html/test2.txt

[root@www scripts]# echo ywxi2 >> /var/www/html/audisp/plugins.d/syslog.conf

[root@www scripts]# sh Monitorfile.sh 

[root@www opt]# cat error.log 

2018年 04月 27日 星期五 18:24:38 CST The contents of the file have been modified

/var/www/html/audisp/plugins.d/syslog.conf: 失败

/var/www/html/audisp/audispd.conf: 失败

md5sum: 警告:2/30 生成的校验和不匹配

2018年 04月 27日 星期五 18:24:38 CST Increase or delete the number of files 

18a19

> /var/www/html/test.txt

24a26

> /var/www/html/test2.txt                      #看到这些报错信息,表示脚本执行成功


  脚本总结:这个脚本是个简单实用但并没有优化过的,各位读者可以从实际生产环境出发,根据需要修改这个脚本。生产环境中有很多重要文件都需要被监控起来,如服务器的配置文件,系统命令文件,系统启动文件这些都可以监控起来,做好日志审计,让操作透明化。减少当黑锅侠的风险。