写点什么

历史命令被黑客删除?教你实时备份

发布于: 2021 年 04 月 01 日
历史命令被黑客删除?教你实时备份

最近接到几个应急响应的需求,大多时候都是个人站长或者小企业的服务器,在安全方面都不会做,或者不注重,服务器常年被挂马或挖矿


基本拿到服务器之后,如果云服务器,就先做个快照,保存下当时的情况,如果有特殊情况,可以通过快照转镜像,以模板的形式启动一台临时的服务器查看处理前的情况;如果是托管服务器,就只能是跑脚本取证,收集下日志,以备不时之需


今天想要说的是关于应急响应中的历史命令的问题


在应急响应过程中,首先取证,肯定是通过收集各种日志文件、历史记录等来判断服务器的状况,通常情况下历史命令是最直观的可以看到操作记录的信息,也是最有价值的信息,但这么重要的信息,当然别人是不会给你留下的,所以思考能不能把 history 记录存一下,大体思路


history备份思路


思路其实很简单,总结一句话,实时备份 history 到其他文件


在处理实时备份之前,先对 history 做个优化处理,我们先看下默认的 history 记录


未优化history


啥也不是,只记录了执行的命令,其他什么信息都没有,我们看下改造后的结果


优化后history


history 中记录了命令数、执行时间、用户、终端、用户登录时间及 IP 以及执行的命令


实现这个很简单,修改历史命令记录格式如下:

HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S  `who am i` "

前面是时间格式,是命令 who am i,这里一定要空格分开,如果连一起,就是 whoami,这两个是完全不同的,whoami,只能显示当前用户


将这个配置加入到/etc/profile 中全局生效即可,接着介绍实现历史命令实时记录的几种方式


硬链接

在 Linux 中,硬链接的特性就是,当其中一个文件删除时,文件不会丢失,除非最后一个链接的文件被删除,所以我们可以根据这个特性,将~/.bash_history 文件硬链接到其他像存储的位置,这样,当~/.bash_history 文件被删除时,历史命令可以保留


这个方式优点很明显,简单粗暴,缺点也很明显,当不是删除文件,而是情况文件时,硬链接的文件也会被清空,起不到保留的作用


Python 脚本实时监控

既然同步的方式不行,那么就可以用实时监控的方式,我们可以通过 python 脚本,实时监控~/.bash_history 文件变化,并将变化的内容输入到另外的文件以达到保存的效果


我们通常在 linux 下查看日志的时候,最常用的应该就是 tail 命令了,它的-f 参数或直接 tailf,可以实时输出文件内容,所以我们可以利用该命令,通过 python 的 Popen()函数去调用该命令来获取~/.bash_history 的输出,代码如下:

import subprocess
history_file = '~/.bash_history'command = 'tail -f ' + history_filepopen = subprocess.Popen(command,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)while True: line = popen.stdout.readline().strip() with open('/path/to/file', 'ab') as f: f.write(line)
复制代码

除了这种调用命令的方式,还可以通过 python 的 tell()和 seek()来获取文件位置及操作文件游标便宜的方式实现文件实时查看,实现代码如下:

import time
with open('~/.bash_history', 'r') as f: while 1: where = f.tell() line = f.readline() if not line: time.sleep(1) f.seek(where) else: with open('/path/to/file', 'ab') as f1: f1.write(line)
复制代码

通过这种实时读取文件,再将读取到的内容写入到另外的文件中的方式,有点 low 的实现了历史命令的记录


filebeat 收集

没错,如果要说读取文件,再输出到另外的地方,我们一定会想到日志收集,当下最流行的就是 filebeat 了,相比自己粗鄙的 python 脚本,filebeat 肯定是最佳选择


平常我们都用 filebeat 收集日志,并输出到 elasticsearch 或 logstash 先做处理,但其实 filebeat 可以有 Kafka、redis、file、console 等多种输出方式,这里实时备份,如果没有必要搭建 elk,可以通过 filebeat 将备份输出到 file 中


filebeat 安装不多说了,可以从官网直接下 rpm 包,或者像我一样直接配置 yum 源进行安装

[filebeat]name=Elasticsearch repository for 7.x packagesbaseurl=https://artifacts.elastic.co/packages/7.x/yumgpgcheck=0gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearchenabled=1autorefresh=1type=rpm-md
复制代码

安装完成后,修改 filebeat.yml 配置文件


filebeat配置文件


配置 input 部分,读取/root/.bash_history 文件,以及 output 部分,输出格式为 file,并配置记录文件的位置及文件名,配置完成后,启动 filebeat,并查看 filebeat 输出的日志


filebeat收集到的日志


message 字段即拿到的历史命令信息,因为 filebeat 记录的是 json 格式,所以我们通过 python 提取 message 字段,就能很方便的提取历史命令记录


如果你觉得存储在本地还不够,廉价的对象存储是个不错的选着,通过官方提供的 api,可以很方便的将记录整理并存储在对象存储中


总结:

通过以上介绍的几种方式,可以将历史命令保存到本地或云端,当发生入侵时,可以通过备份的历史命令,迅速进行响应,不至于无从下手

发布于: 2021 年 04 月 01 日阅读数: 24
用户头像

运维技术社区,坚持运维技术研究与分享 2020.07.14 加入

「运维研习社」技术社区发起人,同名公众号「运维研习社」、知识星球,专注运维技术研究分享,坚持原创,希望能和大家在运维路上结伴而行!

评论

发布
暂无评论
历史命令被黑客删除?教你实时备份