概述
不怕出問題,就怕出問題找不到原因運維團隊一般會有個需求就是記錄運維或者開發同事在服務器上的操作記錄,比如進行一些常規審核或者是服務器被黑了、服務器日志被刪的情況需要知道發生過什么事情,今天和大家分享下我們現在的服務器的shell和mysql操作日志記錄的DIY方案。團隊內部之前有測試過一些堡壘機硬件,但終端操作方面不夠人性化,不夠靈活,而且價格昂貴,硬件容易形成單點故障。當然也接觸過一些開源的方案,比如可以直接用ttyrec對終端進行錄制,并且支持文本匹配,但是在實際使用中發現過嚴重bug,還有另外一些openssh的修改方案也不盡人意。鑒于上述問題,我們針對bash和mysql的代碼進行簡單的修改來實現一個低成本、實用性能高的日志審計方案。
服務器日志:
下面來“開源”這個解決方案,希望對大家有小小幫助。
1.linux bash審計大家應該有聽說過網絡說的bash修改方案,我們從2011年開始使用,中間經歷過很多bug,修復和優化過多次版本,下面會詳細地給出我們現在的線上方案?,F在的功能支持大致如下:
同一系統用戶精確到具體人員的shell操作記錄
支持遠程通過ssh IP “command”執行和scp時候的日志記錄
支持不同系統用戶進行切換時候能繼續記錄日志
新支持mysql的操作日志
上述每一個功能列表都是經過多次實踐出來的需求,雖然不是非常完美,但是如果不是刻意來逃避日志記錄的話,基本可以滿足大家的需求,上述的記錄對應的人員是指多個人同時使用同一個系統帳號的情況,比如root帳號。1.1 基本功能實現基本功能就是需要記錄到每個人的操作記錄,網絡上有個方案雛形,修改bashhist.c文件,701行左右修改bash_syslog_history函數,修改完之后內容:
1.2. 指紋變量處理接下來重點就是處理NAME_OF_KEY這個指紋變量,原理也比較簡單,每個人登錄系統的時候,我們讓他自動執行一個腳本,然后設置這個變量為具體人就可以了。--------別說有人還在利用密碼登錄Linux服務器,太不專業了-_---------在這個文件里面~/.ssh/authorized_keys加key的時候,第三列設置為具體的人員,我們是用工號@姓名拼音的模式,然后通過腳本進行處理即可。腳本路徑 /etc/bash_ywjt,內容:
2. Mysql操作日志很早以前找過相關的mysql插件,也嘗試過audit之類的方案,但結果不是我們需要的效果,我們需要的是運維方面在服務器上的mysql操作,和mysql的binlog等日志不是同一個事情,而且和.mysql_history記錄的也不一樣,我們需要精確到同一系統用戶的不同人員。以下mysql版本是指Percona-Server-5.5。2.1 初步解決mysql自帶了syslog日志功能,但是需要手動配置開啟,配置比較簡單:在/etc/my.cnf里面的client字段加上syslog即可。
1)在mysqldump時候會報錯:
2)可以輕易地繞過這個日志,在敲mysql命令行的時候加個參數--no-defaults即可。3)日志里面只有是root帳號操作的,沒有體現出具體是某個人操作的。解決這幾個問題還得靠開源的優勢進行代碼修改。2.2 源碼開啟我們可以在源碼里面就把syslog這個開關開啟,比較容易,找到client/mysql.cc這個文件,開關邏輯比較簡單,找到以下代碼:
2.3 交互式記錄單純那樣改會發現還有個小問題,就是在shell終端下面直接mysql可以用-e進行命令操作,比如:
但是按照之前那樣開啟syslog也無法記錄日志。我們是有記錄shell操作記錄的,這個問題可以忽略,不過一定要顯示的話也是有辦法的,繼續修改代碼。稍微看下邏輯分析可以看到是需要滿足connect_flag == CLIENT_INTERACTIVE才寫日志,找到CLIENT_INTERACTIVE的定義:原來這個就是交互模式的定義,所以我們把這個“與”條件去掉即可,改為這樣:
2.4 海量日志問題在實際環境中會有新的問題,比如導入sql語句時候,會生成同樣大小的日志,比如導入2G的sql,會生成2G的日志,這樣明顯不符合我們的需求。想到我們已經有bash審核了,-e執行時候可以忽略記錄,但是如果在mysql里面通過source命令引用sql語句時候同樣有這個問題,所以還得繼續改代碼。找到write_syslog函數,正式寫日志時候是用的syslog函數,里面有個for循環的邏輯,意思是當sql語句很大時候,需要“切割”一下再寫入,所以從這里入手,把syslog改為定義的MAX_SYSLOG_MESSAGE長度之內就寫,超過的話就直接忽略。另外之前說需要精確到不同人員,所以我們引入了我們的bash審核里面的指紋,變量NAME_OF_KEY,然后在mysql.cc里面引入即可。關鍵修改如下:
2.5 自定義參數這樣雖然是在源碼里面寫死了一定有日志,但是還是可以提供一個備用的參數來取消這個功能。在參數定義那里改動,把之前的syslog改為這樣:
3. 遠程日志中心上述日志全部是通過syslog服務記錄到/var/log/messages文件,更合理的是再傳輸到遠程的日志中心來統一備案管理。這個方法比較簡單,在/etc/rsyslog.conf里面加入配置:
4. 內網日志攔截這個段落是額外的參考,我們的定制系統是寫死了配置全部發送到公網的某一臺日志中心服務器,但是我們內網機房也有很多服務器,這樣會導致在日志中心那里無法查看原始的內網IP,只有辦公網的出口IP,而且不方便每個機器都去更改日志中心的IP,那樣會很容易漏掉,解決辦法是進行“日志劫持”。在我們的juniper防火墻那里進行日志攔截,然后轉發到內網的一個日志中心即可,參考配置:
-
服務器
+關注
關注
12文章
9295瀏覽量
85878 -
代碼
+關注
關注
30文章
4823瀏覽量
68900 -
MySQL
+關注
關注
1文章
829瀏覽量
26677
原文標題:大神教你DIY高性能運維堡壘體系
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論