最近接到幾個應急響應的需求,大多時候都是我的站長或者小企業的服務器,在安全方面都不會作,或者不注重,服務器常年被掛馬或挖礦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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。