Linux

防止在 Linux 中更改 bash(和 ksh)歷史記錄

  • February 22, 2016

從表面上看,修復 ksh 以使歷史更改變得不可能是相當容易的。我已經看到了將 HIST* 環境變數設置為只讀的所有建議,以及使用 chattr 使歷史文件僅追加(使用 chattr +a .sh_history)。

然而,Bash 有兩件事似乎無法阻止歷史更改:歷史命令(使用歷史 -c 和歷史 -d)和歷史文件與實際執行時歷史的分離(保存在記憶體中) . 我也在 serverfault 上讀到,如果你殺死目前的 shell,那麼歷史將不會被寫出。

有什麼方法可以防止 Bash 的歷史更改?我希望能夠保存所有使用者命令,而使用者無法從歷史記錄中刪除任何內容。

也歡迎任何有關 Korn shell 的進一步提示。(我知道ksh-93審計……不知道能不能用。)

這是將所有執行的命令發送到系統日誌伺服器的解決方案。

http://blog.rootshell.be/2009/02/28/bash-history-to-syslog/

摘自博文

這是將使用者執行的所有命令的副本發送到 Syslog 伺服器的兩種方法。第一個將使用 Bash “陷阱”功能。第二個是在 Bash 原始碼中應用的更新檔。

使用陷阱

只需在 /etc/profile 中添加以下行:

function log2syslog
{
  declare command
  command=$(fc -ln -0)
  logger -p local1.notice -t bash -i — $USER : $command
}
trap log2syslog DEBUG

/etc/profile在 Bash 啟動時解析並執行。目標是使用陷阱功能並在使用者每次生成活動時呼叫一個函式。陷阱函式 (log2syslog) 將從歷史記錄中提取最後一條命令,並使用 logger 命令將其記錄到 Syslog。很容易實現,但是這個方法:

spawns new process at each command logged (can have a negative effect when the server activity is high)
is not transparent to the user (regular users can’t edit /etc/profile but can read it!)

這就是為什麼首選第二種方法的原因。 使用更新檔

方法是在 Bash 原始碼樹上應用更新檔並重新編譯 shell。它需要一個帶有編譯器和原始碼的環境,但這種方法將使用更少的 CPU 並且完全透明!

此處提供了一個更新檔範例。手動將更新檔應用到 Bash 4 原始碼樹需要五分鐘。

以下是 Syslog 消息的範例:

Feb 27 19:30:51 honey bash: HISTORY: PID=21099 UID=1000 echo foo!

引用自:https://serverfault.com/questions/271108