1. 程式人生 > 其它 >Linux 審計使用者執行的命令

Linux 審計使用者執行的命令

技術標籤:linuxshell

Linux系統中需要對使用者輸入的命令進行審計記錄,系統自帶有 history 功能,但是預設顯示的內容有限,且 root 使用者需要要看全部使用者的操作記錄,需要檢視所有使用者 home 目錄下的 .bash_histroy 檔案,而且預設檢視到的 histroy 命令記錄所記錄的資訊有限,只有命令內容,沒有記錄所執行的時間、當時登入執行操作的來源 ip ,無法滿足實際的審計需求。

預設能使用 shell 的使用者基本都是 bash shell ,bash 有一個內建的環境變數 PROMPT_COMMAND,這個環境變數的內容會在 bash 顯示提示符之前,作為常規的 bash 命令執行。

即在你執行命令回車之後,顯示下一個命令列之前,執行 PROMPT_COMMAND 裡面的內容,如下圖。
在這裡插入圖片描述
所以基於審計的需求,可以使用 PROMPT_COMMAND 的方式來將所有使用者的命令都集中記錄到某個檔案去,最後統一對檢查該檔案就可以知道各個使用者的命令執行資訊。

配置方式:在 /etc/profile 最後新增以下內容。(如連續執行多次同個命令,則最終在檔案中只會記錄第一次執行的記錄)

export PROMPT_COMMAND="HistID0=\$(history 1|awk '{print \$1}'); \
lastcommand=\$(history 1|awk '{\$1
=\"\" ;print}'
)
;\ login_pid=\$(who -u am i | awk '{print \$(NF-1)}') login_ip=\$(who -u am i | awk -F '\\\(|\\\)' '{print \$2}'); \ if [ \${HistID0}x != \${HistID1}x ];then \ echo -E [\$(date \"+%Y/%m/%d %H:%M:%S\")] [sshpid:\${login_pid}] [fromip:\${login_ip}] [\$(id -un)@\$(hostname
)
\$(pwd)] \${lastcommand} >> /var/log/cmd_audit.log; \ HistID1=\${HistID0}; \ fi;"

效果圖如下。
在這裡插入圖片描述

PROMPT_COMMAND 編寫需要注意:

  1. PROMPT_COMMAND 所涉及到的命令內容,不是直接執行,而是為了應用之後,以原始的命令在執行命令前應用執行,所以涉及到變數或者命令時,如 ${var1} 或 $(date) ,$ 需要使用 \ 進行轉義
  2. 建議使用雙引號 " " 包含內容,用單引號也可以,但是如果內容中涉及到的命令內容也必須使用到單引號,則會有出現無法識別解釋的情況,內容中涉及到的命令內容使用到雙引號時,也許同樣使用 \ 進行轉義

參考連結:
https://tldp.org/HOWTO/Bash-Prompt-HOWTO/x264.html
https://tldp.org/HOWTO/Bash-Prompt-HOWTO/x279.html
https://spin.atomicobject.com/2016/05/28/log-bash-history/ (空內容回車會重複記錄上一條命令)
https://stackoverflow.com/questions/3058325/what-is-the-difference-between-ps1-and-prompt-command