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