1. 程式人生 > 實用技巧 >修改openssh原始碼,新增操作記錄審記功能

修改openssh原始碼,新增操作記錄審記功能

為什麼80%的碼農都做不了架構師?>>> hot3.png

這個是之前一年前研究搞過,當時記儲存了原始碼,本想直接用當時的程式碼寫編文章,中間電腦換過幾次,不知是丟了,還是沒有找到。寫這編博文是憑記憶重新再改了一次openssh原始碼,有些東西忘了,沒有之前寫的功能強,之前寫的那個有動態回放的功能,這個只相當於螢幕錄製,但大家熟悉思路以後,也可以自己寫一個,後面我會把思路寫一下。

也許很多公司有樣的需求,希望生產環境中的所有對伺服器操作能夠記錄下來,起一下堡壘機的功能,以別日後查詢原因,同時,對於很多人的運維環境,更需要這麼一套東東,避免有人亂操作。

這裡主要寫的是通過修改openssh原始碼,當有個登陸伺服器時,自動的按照登陸者的姓名的登陸時間,新建一個檔案,同時把登陸者的操作記錄都寫入該檔案中。

第一步,下載openssh原始碼,進入原始碼目錄,修改channels.h檔案

在channels.h找到struct Chanel結構體,新新增一行,目的是新建一個檔案描述符,在使用者登陸時,開啟一個檔案,賦值給該檔案描述符。

第二步,初始化上面新建的logfd,開啟channels.c。

找到channel_new(char *ctype, int type, int rfd, int wfd, int efd,u_int window, u_int maxpack, int extusage, char *remote_name, int nonblock)這個函式,新增上面一行內容,初始該logfd為-1。

第三步,當用戶登陸時,建立一個檔案,該檔案將是記錄使用者的操作記錄,開啟serverloop.c檔案。

在serverloop.c中找到server_request_session(void)函式,在上圖的位置新增紅框部分,當然這裡面有一個我自己寫的函式creatdir,按日期建目錄,可以放在server_request_session(void)上面,如下圖就是createdir函式。

第四步:記錄使用者的螢幕輸出,開啟channels.c原始檔,修改如下:

在channel.c找到channel_handle_rfd(Channel *c, fd_set *readset, fd_set *writeset)函式,在上圖位置新增紅框部分內容,記錄使用者的操作記錄。

第五部,使用者登出時關閉記錄檔案,開啟channel.c:

在channel.c中找到channel_free(Channel *c)函式,在上圖位置新增紅框部分,目的是使用者logout時關閉日錄檔案。

最後編譯安裝,為了不影響系統自帶的openssh,我安裝在/usr/local/openssh中,如下

./configure --prefix=/usr/local/openssh

make

make install

執行完這三步後,停止系統自帶的sshd程序:/etc/init.d/sshd stop

啟用修改後重新編譯的openssh: /usr/local/openssh/sbin/sshd

找另外一臺登陸一下該伺服器,驗證一下。

下圖是ssh登陸時執行的幾個操作:

下圖時操作記錄的結果,可以用cat檢視,如下

是不是和ssh登陸操作看到的輸出一樣呢,呵呵。

最後我講一下,怎麼去實現記錄使用者的輸入,並實現動態回放思路,有興趣的可以研究一下。

在chanel.c另一個函式channel_handle_wfd(Channel *c, fd_set *readset, fd_set *writeset)是使用者的輸入的資料處理,需要記錄使用者輸入的,可以這一行len = write(c->wfd, buf, dlen);前加一個寫入,將buf寫入到我們審記記錄。

至於動態回放,其實也很簡單,每次寫日誌記錄之前,定義一下結果體,結果體定義時間戳,再定義buf的長度,先寫一個這個結構體,再寫buf,然後我們寫別一個程式讀這個檔案,通過時間戳的資訊實現動態回放。

轉載於:https://my.oschina.net/beiyou/blog/76766