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

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

export PROMPT_COMMAND='{ echo "date=$(date),from=${SSH_CLIENT},login=${SUDO_USER},user=${USER},pwd=$(pwd),exec=$(history 1|cut -c 8-)"; } >> /tmp/command.log'

 

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

 

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

$ visudo
Defaults env_keep += "PROMPT_COMMAND"
Defaults env_keep += "SSH_CLIENT"

 

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

date=Fri Sep 22 05:50:34 CST 2017,from=192.168.10.1 52703 22,login=,user=scottliao,pwd=/root,exec=ll

 

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

date=Fri Sep 22 05:51:26 CST 2017,from=192.168.10.1 52703 22,login=scottliao,user=root,pwd=/tmp,exec=ll

 

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

 

 

給 Mr. 沙先生一點建議

彙整

分類

展開全部 | 收合全部

License

訂閱 Mr. 沙先生 的文章

輸入你的 email 用於訂閱