Linux 把 history 的 command log 寫到指定的 Log file

2017-09-22 CentOS, Ubuntu

history 是 login 到 Linux 後執行 command 的記錄,history 在我們日常執行 command 有很多幫助,讓你需要重複打指令的時候,只要簡單的 !number 或是 !prefix 就能執行已經打過落落長的指令。

 

除此之外每個人 login 到 server 後的 history 記錄也能達到 debug 的依據 (但不能作為稽核,要竄改 history 是非常簡單的事情)

 

這篇將記錄怎麼把 Linux 的 history 的 command log 丟到指定的 log file 位置

 

在網路上已經有很多用 logger 拋到 rsyslog 再 output 的作法,中間不透過 rsyslog,原因是本身的環境太過複雜,OS 版本差異相當大,加上 rsyslog 的版本差異太多維護不易,所以在這篇我只是單純的從 history export to log。

 

先設定達成項目:

  • 一般使用者登入後的 command (未 sudo)
  • 已 sudo 後 root 的 command (已 sudo)
  • 記錄項目:時間 / 來源 IP / Login User / sudo user / PWD / command

 

history 的 export 可以透過 PROMPT_COMMAND 這個變數來執行,PROMPT_COMMAND 是系統內建變數,預設空值,我們會利用 PROMPT_COMMAND 來讓每次執行 command 後來跑我們想要執行的動作。

 

簡單的作法像這樣寫在 /etc/profile.d/prompt_command.sh

 

你可能會問為什麼不寫在 ~/.bashrc 或是 /etc/bashrc,原因是使用者家目錄通常很容易有自定義的項目,每個人有自己的 dotfile 是很正常的一件事情,另外寫在 /etc/profile.d 可以在不影響原有的 profile 下新增你想要的項目,而不寫在 /etc/bashrc 的理由是 Ubuntu 和 CentOS 的 bashrc 預設不同檔案位置。

 

由於 sudo 後通常不會把變數帶到下個 shell,所以必須在 /etc/sudoers 把 sudo 後不給的變數帶進去。

 

使用一般 User 登入後 command.log 會長這樣

 

如果用 sudo 後 login 和 user 的值會改變

 

已經輸出 log 後,你就可以透過 logstash 或 filebeat 來把 Log 收到 elastic stack 統一做處理。

 

 

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

彙整

分類

open all | close all

License

訂閱 Mr. 沙先生 的文章

輸入你的 email 用於訂閱