
最近接到几个应急响应的需求,大多时候都是我的站长或者小企业的服务器,在安全方面都不会作,或者不注重,服务器常年被挂马或挖矿python
基本拿到服务器以后,若是云服务器,就先作个快照,保存下当时的状况,若是有特殊状况,能够经过快照转镜像,以模板的形式启动一台临时的服务器查看处理前的状况;若是是托管服务器,就只能是跑脚本取证,收集下日志,以备不时之需linux
今天想要说的是关于应急响应中的历史命令的问题web
在应急响应过程当中,首先取证,确定是经过收集各类日志文件、历史记录等来判断服务器的情况,一般状况下历史命令是最直观的能够看到操做记录的信息,也是最有价值的信息,但这么重要的信息,固然别人是不会给你留下的,因此思考能不能把history记录存一下,大致思路redis
思路其实很简单,总结一句话,实时备份history到其余文件shell
在处理实时备份以前,先对history作个优化处理,咱们先看下默认的history记录json
啥也不是,只记录了执行的命令,其余什么信息都没有,咱们看下改造后的结果api
history中记录了命令数、执行时间、用户、终端、用户登陆时间及IP以及执行的命令安全
实现这个很简单,修改历史命令记录格式以下:bash
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S `who am i` "服务器
前面是时间格式,是命令who am i,这里必定要空格分开,若是连一块儿,就是whoami,这两个是彻底不一样的,whoami,只能显示当前用户
将这个配置加入到/etc/profile中全局生效便可,接着介绍实现历史命令实时记录的几种方式
在Linux中,硬连接的特性就是,当其中一个文件删除时,文件不会丢失,除非最后一个连接的文件被删除,因此咱们能够根据这个特性,将~/.bash_history文件硬连接到其余像存储的位置,这样,当~/.bash_history文件被删除时,历史命令能够保留
这个方式优势很明显,简单粗暴,缺点也很明显,当不是删除文件,而是清空文件时,硬连接的文件也会被清空,起不到保留的做用
既然同步的方式不行,那么就能够用实时监控的方式,咱们能够经过python脚本,实时监控~/.bash_history文件变化,并将变化的内容输入到另外的文件以达到保存的效果
咱们一般在linux下查看日志的时候,最经常使用的应该就是tail命令了,它的-f参数或直接tailf,能够实时输出文件内容,因此咱们能够利用该命令,经过python的Popen()函数去调用该命令来获取~/.bash_history的输出,代码以下:
import subprocess
history_file = '~/.bash_history'
command = 'tail -f ' + history_file
popen = 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了,相比本身粗鄙的python脚本,filebeat确定是最佳选择
日常咱们都用filebeat收集日志,并输出到elasticsearch或logstash先作处理,但其实filebeat能够有Kafka、redis、file、console等多种输出方式,这里实时备份,若是没有必要搭建elk,能够经过filebeat将备份输出到file中
filebeat安装很少说了,能够从官网直接下rpm包,或者像我同样直接配置yum源进行安装
[filebeat]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=0
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
安装完成后,修改filebeat.yml配置文件
配置input部分,读取/root/.bash_history文件,以及output部分,输出格式为file,并配置记录文件的位置及文件名,配置完成后,启动filebeat,并查看filebeat输出的日志
message字段即拿到的历史命令信息,由于filebeat记录的是json格式,因此咱们经过python提取message字段,就能很方便的提取历史命令记录
若是你以为存储在本地还不够,廉价的对象存储是个不错的选择,经过官方提供的api,能够很方便的将记录整理并存储在对象存储中
今日彩蛋:
文章写到这里,本应该结束了,可是回顾整篇文章,我犯了一个很明显,却又不那么容易察觉的错误,那我就把这个问题做为一个彩蛋抛给你们,第一个发现错误并在评论区留言解决方式的朋友,我请你喝杯咖啡,欢迎参与

运维技术交流群
「运维研习社」创建了运维技术交流群,你们能够添加小编微信进行加群。欢迎有想法、乐于分享的朋友们一块儿进群交流学习。
扫描添加好友邀您进运维交流群

本文分享自微信公众号 - 运维研习社(gh_4135e2716ad3)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。