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