Linux

在命令結束時在 ssh 登錄和註銷時執行命令

  • August 9, 2016

我們想在我們的一台 Centos7 機器上跟踪使用者活動。為此,管理層決定使用scriptscriptreplay來記錄使用者活動並進行回放。我對我們應該如何設計它進行了一些研究,但是管理層拒絕了依賴於 auditd 的解決方案,並且將腳本放在使用者的 .profile 中會導致一些問題,如下所述。

預期的行為如下:

  1. 當使用者通過 SSH 登錄到伺服器時,腳本命令會生成並開始將使用者活動記錄到文件中。
  2. 當使用者在伺服器上完成後,他會註銷(通常鍵入 exit 或 CTRLD)。
  3. 腳本程序停止並關閉文件。

現在的問題:

  1. 我的研究表明,腳本實際上創建了另一個 shell。因此,如果我將腳本 script.log 放在每個使用者(或 skel)的 .bash_profile 中,它將在登錄後為使用者發出一個新的 shell,使用者可以輕鬆中止程序並開始在他通常的 SSH 會話。 當使用者退出由 script 命令生成的 shell 時,如何強制我的腳本實際將使用者踢走?
  2. 腳本輸出(即使用者的命令)應儲存在非 sudoers 無法執行任何操作(無 R/W/E 權限)的私有位置。當使用者自己沒有特權時,我們如何在使用者登錄時執行具有提升特權的腳本?

至於強制命令,sshd有一個ForceCommand選項:

強制執行 ForceCommand 指定的命令,忽略客戶端和 ~/.ssh/rc 提供的任何命令(如果存在)。通過使用帶有 -c 選項的使用者登錄 shell 呼叫該命令。

這適用於 shell、命令或子系統執行。它在 Match 塊中最有用。最初由客戶端提供的命令在 SSH_ORIGINAL_COMMAND 環境變數中可用。

因此,從閱讀中,如果您設置ForceCommandscript,那應該大致符合您的要求。

為了保證審計跟踪的安全,多伺服器系統中的一種解決方案是從 syslog 中學習並通過網路將條目發送到不同的物理主機。這幾乎可以防止使用者在生成日誌後訪問日誌。如果其他任何事情都失敗了,您可能會安裝一些東西,只是將日誌發送到 localhost 上的不同埠,守護程序會在那裡收集和儲存它們。(已經嘗試了明顯的,你不能script -f /dev/tcp/localhost/8888因為/dev/tcp/...需要由 bash 處理,所以我想你需要mkfifo一個通信路徑,如手冊頁範例中的script -f那樣)

引用自:https://unix.stackexchange.com/questions/302173