如何在“sudo su -”中記錄命令?

如何在“sudo su -”中記錄命令?

如果我:

[user@notebook ~] sudo echo 123456uu
123456uu
[user@notebook ~] 

然後我可以在日誌中看到:

[root@notebook /var/log] grep 123456uu *
auth.log:Jan  9 17:01:51 notebook sudo: user : TTY=pts/3 ; PWD=/home/user ; USER=root ; COMMAND=/bin/echo 123456uu
[root@notebook /var/log] 

但如果我:

[user@notebook ~] sudo su -
[root@notebook ~] echo 1234567zz
1234567zz
[root@notebook ~] 

我在日誌中看不到它:

[root@notebook /var/log] grep 1234567zz *
[root@notebook /var/log] echo $?
1
[root@notebook /var/log] 

我的問題:如何開啟“sudo su -”中命令的日誌記錄?

作業系統是 Ubuntu 12.04,但問題很普遍。

更新#1:

[user@notebook ~] sudo su -
[sudo] password for user: 
[root@notebook ~] echo zizizi
zizizi
[root@notebook ~] cd /var/log
[root@notebook /var/log] grep -iIR 'zizizi' *
[root@notebook /var/log] grep 'COMMAND=/bin/su -' *
auth.log:Jan 10 15:42:42 notebook sudo: user : TTY=pts/1 ; PWD=/home/user ; USER=root ; COMMAND=/bin/su -
[root@notebook /var/log]

答案1

由於您使用的是 Ubuntu 12.04,請查看透過log_inputlog_output選項啟動的 I/O 日誌記錄功能。

log_input

    如果設置,sudo將在偽 tty 中運行命令並記錄所有用戶輸入。如果由於 I/O 重定向或命令是管道的一部分,標準輸入未連接到使用者的 tty,則該輸入也會被捕獲並儲存在單獨的日誌檔案中。

    使用包含在正常 sudo 日誌行中的唯一會話 ID(以 .sudo 為前綴)將輸入記錄到該iolog_dir選項指定的目錄(預設) 。此選項可用於控制會話ID的格式。/var/log/sudo-ioTSID=iolog_file

    請注意,使用者輸入可能包含敏感訊息,例如密碼(即使它們沒有回顯到螢幕),這些資訊將以未加密的方式儲存在日誌檔案中。在大多數情況下,只需透過 log_output 記錄命令輸出即可。

log_output

    如果設置,sudo將在偽 tty 中運行該命令並記錄發送到螢幕的所有輸出,類似於 script(1) 命令。如果由於 I/O 重定向或命令是管道的一部分,標準輸出或標準錯誤未連接到使用者的 tty,則也會捕獲該輸出並將其儲存在單獨的日誌檔案中。

    輸出使用包含在正常 sudo 日誌行中的唯一會話 ID iolog_dir(預設)記錄到該選項指定的目錄,前綴為.此選項可用於控制會話ID的格式。/var/log/sudo-ioTSID=iolog_file

    可以使用 sudoreplay(8) 實用程式查看輸出日誌,該實用程式也可用於列出或搜尋可用日誌。

實作:Sudo 版本至少:需要 1.7.4p4。

/etc/sudoers修改:您需要做的就是向所有必需的 sudoers 條目添加兩個標籤(其中指定“su”,使用命令或別名)。日誌輸入和日誌輸出。

例子:

%admins         ALL=(ALL) NOPASSWD: LOG_INPUT: LOG_OUTPUT: ALL

將以下預設日誌目錄結構新增至sudoers

Defaults iolog_dir=/var/log/sudo-io/%{user}

答案2

你的grepwhile 操作sudo su -失敗了,因為你沒有運行echo 1234567zz,你正在運行su -,這會啟動一個 shell。然後 shell 就會運行你的echo.

這是故意的,記錄每個運行的命令會讓你的系統日誌充滿無用的信息(通常有大量的程式在幕後運行,你通常看不到)。

如果你將 grep 改為grep 'COMMAND=/bin/su -' *你就會看到它。


sudo su -也是無用之用susudo -i做同樣的事情。

答案3

隨著複雜性的增加,以下是記錄「sudo su -」中發出的命令的三種方法:

  1. 依賴 bash 命令歷史記錄
  2. 安裝 execve 日誌記錄包裝器
  3. 使用SELinux的auditd

至於哪個合適,這實際上取決於您想要透過日誌記錄完成什麼任務。

1) Bash 命令歷史

您可能需要配置歷史記錄工具以確保保留足夠的行,不會從不同的會話覆蓋,不會忽略命令以及適當的時間戳記。 (參見 HIST* 變數bash手冊)。透過編輯歷史檔案、操縱環境或執行另一個 shell 可以輕鬆破壞。

2) 執行包裝器

史努比記錄器是一。新增檢查/etc/profile記錄器庫是否在進程的記憶體映射中 ( /proc/<pid>/maps),如果沒有,則設定LD_PRELOAD並重新啟動(使用exec $SHELL --login "$@")。$LIB/snoopy.so或者,您可以使用或在 /etc/ld.so.preload 新增條目等效路徑到您的 32/64 位元版本的 snoopy.so。

儘管更加困難,但LD_PRELOAD仍可以透過操縱執行環境來破壞上述環境變數版本,從而使窺探程式碼不再運作。

系統日誌應開箱發送,以使內容可信。

3)審核

配置比 execve 包裝器稍微簡單一些,但從中提取資訊更困難。這就是您可能真正問的問題的答案:「有沒有辦法記錄使用者發出命令後對系統產生的影響sudo su -」。系統日誌應開箱發送,以使內容可信。

伺服器故障答案似乎是與auditd一起使用的相當全面的配置。

還有一些其他建議關於伺服器故障的類似問題

答案4

正如其他人所說,sudo不能這樣做。

相反,使用auditd.如果你想登入一切由root完成(包括例如由crontab完成的事情),使用這個:

sudo auditctl -a exit,always -F euid=0

ETA:請注意,記錄所有內容都會影響效能,因此您可能需要對其進行一些限制。請參閱man auditctl範例。

如果您只想記錄原始登入 uid 不是 root 的系統調用,請使用以下命令:

sudo auditctl -a exit,always -F euid=0 -F auid!=0

日誌通常最終位於 /var/log/audit/audit.log 中。您可以使用 搜尋它們ausearch

和的手冊頁中有更多資訊auditctlaudit.rulesausearch

相關內容