知乎专栏 |
有时你到一家新公司,接手一堆烂摊子,俗称“擦屁股”。这是中国是离职,中国式裁员,中国式工作交接.....的结果,各种奇葩等着你。
你接手第一项工作就是工作交接,最重要的工作可能就是检查系统后门。通常工作交接少有积极配合的,全要靠你自己。
在我多年的工作中遇到过很多种形式挂马,有基于Linux的rootkit,有PHP脚本挂马,Java挂马,ASP挂马。通常骇客会植入数据库浏览工具,文件目录管理工具,压缩解压工具等等。
程序包括脚本,变异文件等等,通常是只读权限
数据是指由程序生成的文件,例如日志
将程序与数据分离,存放在不同目录,设置不同权限, 请关注“延伸阅读”中的文章,里面有详细介绍,这里略过。
我们这里关注一旦运行的程序被撰改怎么办,包括入侵进入与合法进入。总之我们要能快速知道那些程序文件被修改。前提是我们要将程序与数据分离,才能更好地监控程序目录。
我使用 Incron 监控文件变化
# yum install -y incron # systemctl enable incrond # systemctl start incrond
安装日志推送程序
$ git clone https://github.com/netkiller/logging.git $ cd logging $ python3 setup.py sdist $ python3 setup.py install
配置触发事件
# incrontab -e /etc IN_MODIFY /srv/bin/monitor.sh $@/$# /www IN_MODIFY /srv/bin/monitor.sh $@/$# # incrontab -l /etc IN_MODIFY /srv/bin/monitor.sh $@/$# /www IN_MODIFY /srv/bin/monitor.sh $@/$#
/srv/bin/monitor.sh 脚本
# cat /srv/bin/monitor.sh #!/bin/bash echo $@ | /usr/local/bin/rlog -d -H 172.16.0.10 -p 1220 --stdin
/etc 与 /www 目录中的任何文件被修改都回运行/srv/bin/monitor.sh脚本,/srv/bin/monitor.sh脚本通过/usr/local/bin/rlog程序将文件路径数据发给远程主机172.16.0.10。
$ git clone https://github.com/netkiller/logging.git $ cd logging $ python3 setup.py sdist $ python3 setup.py install
配置收集端端口,编辑文件logging/init.d/ucollection
done << EOF 1220 /backup/172.16.0.10/incron.log 1221 /backup/172.16.0.11/incron.log 1222 /backup/172.16.0.12/incron.log EOF
然后根据incron.log给相关管理人员发送邮件或短信警报等等,关于怎么发邮件与短信不再本文谈论范围,有兴趣留意我的官网。
首先谈谈什么是“历史记录异地留痕”,历史记录就是~/.bash_history文件,不同Shell名字可能不同,它会记录每次用户在键盘上敲下的命令,我们可以通过下面命令查询历史记录。
$ history | head 1009 ls /www 1010 vim Makefile 1011 cat Makefile 1012 make index.html 1013 vim Makefile 1014 make index.html 1015 vim Makefile 1016 make index.html 1017 vim Makefile 1018 make index.html $ history | tail 2000 find /tmp/var/ 2001 ll 2002 cd workspace/Journal/ 2003 s 2004 ls 2005 make shell.html 2006 cat ~/.bash_history 2007 history 2008 history | head 2009 history | tail $ cat ~/.bash_history | head -n 100 cat /etc/issue cat /etc/resolv.conf ifconfig cat /etc/resolv.conf dmd df df -T cat /etc/fstab cat /etc/issue uname -a ps ax cd /srv/ ls cd workspace/ ls df df -T df ls cd .. ls
由于篇幅的限制,我是用了head,tail 命令限制显示长度。
现在我在看看“监控”,监控就是过滤 ~/.bash_history 文件内字符串,达到匹配标准,做出报警操作等等。例如我们发现adduser命令应立即报警,通知相关人员检查。
首先我们将要用户操作留痕,以方便随时调阅,我们要知道系统管理员做了那些操作,还可用于审计工作。例如我们开发工作中有一个环节就是Code Review (代码审查),可以帮助我们提前发现BUG,以及不合理做法,甚至是人为恶意植入后门等等。
历史记录异地留痕就是运维工作的 sysop review(运维审查)。
其次是监控,注意这里的~/.bash_history监控并非实时监控,因为只有用户推出shell后才能保存~/.bash_history文件。所以监控是滞后的,但也足够能帮助我们更早的知道系统发生了那些变化。
首先修改history格式,默认只有行号,我需要记录每一个命令的输入时间点。
cat >> /etc/bashrc <<EOF export HISTTIMEFORMAT="%Y-%m-%d-%H:%M:%S " EOF
此时输入history命令你可以看到时间点
# history 741 2014-12-24-10:06:26 ll 742 2014-12-24-10:06:40 ls 743 2014-12-24-10:06:44 ll 744 2014-12-24-10:06:47 ls 745 2014-12-24-10:58:13 history
$ git clone https://github.com/netkiller/logging.git $ cd logging $ python3 setup.py sdist $ python3 setup.py install
配置启动脚本,打开文件logging/init.d/uhistory
HOST=127.0.0.1 #此处为收集端的IP地址 # Port | User # ------------------- # 配置端口号与用户 done << EOF 1220 neo 1221 jam 1222 sam EOF