
如果我:
[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_input
和log_output
選項啟動的 I/O 日誌記錄功能。
log_input
如果設置,
sudo
將在偽 tty 中運行命令並記錄所有用戶輸入。如果由於 I/O 重定向或命令是管道的一部分,標準輸入未連接到使用者的 tty,則該輸入也會被捕獲並儲存在單獨的日誌檔案中。使用包含在正常 sudo 日誌行中的唯一會話 ID(以 .sudo 為前綴)將輸入記錄到該
iolog_dir
選項指定的目錄(預設) 。此選項可用於控制會話ID的格式。/var/log/sudo-io
TSID=
iolog_file
請注意,使用者輸入可能包含敏感訊息,例如密碼(即使它們沒有回顯到螢幕),這些資訊將以未加密的方式儲存在日誌檔案中。在大多數情況下,只需透過 log_output 記錄命令輸出即可。
log_output
如果設置,
sudo
將在偽 tty 中運行該命令並記錄發送到螢幕的所有輸出,類似於 script(1) 命令。如果由於 I/O 重定向或命令是管道的一部分,標準輸出或標準錯誤未連接到使用者的 tty,則也會捕獲該輸出並將其儲存在單獨的日誌檔案中。輸出使用包含在正常 sudo 日誌行中的唯一會話 ID
iolog_dir
(預設)記錄到該選項指定的目錄,前綴為.此選項可用於控制會話ID的格式。/var/log/sudo-io
TSID=
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
你的grep
while 操作sudo su -
失敗了,因為你沒有運行echo 1234567zz
,你正在運行su -
,這會啟動一個 shell。然後 shell 就會運行你的echo
.
這是故意的,記錄每個運行的命令會讓你的系統日誌充滿無用的信息(通常有大量的程式在幕後運行,你通常看不到)。
如果你將 grep 改為grep 'COMMAND=/bin/su -' *
你就會看到它。
sudo su -
也是無用之用su
。sudo -i
做同樣的事情。
答案3
隨著複雜性的增加,以下是記錄「sudo su -」中發出的命令的三種方法:
- 依賴 bash 命令歷史記錄
- 安裝 execve 日誌記錄包裝器
- 使用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
。
和的手冊頁中有更多資訊auditctl
。audit.rules
ausearch