sudo日志默认仅记录提权行为框架,不记录完整命令行;需配置Defaults logfile或syslog并配合rsyslog才能捕获如“sudo ls -la /root”等带参数的详细操作。

sudo 日志默认不记录命令执行内容,得先确认日志是否开启
Linux 默认的 sudo 不会把用户实际执行的命令行完整记进日志,只记录“谁在什么时候调用了 sudo”——比如 user1 : TTY=pts/0 ; PWD=/home/user1 ; USER=root ; COMMAND=/bin/ls 这种。真正想看到 sudo ls -la /root 这种带参数的完整命令,必须启用 log_input 或(更常用、更轻量的)log_output + syslog 配合 sudoers 的 logfile 或 syslog 设置。
先检查当前配置:
sudo grep -E "^(Defaults.*log|logfile)" /etc/sudoers /etc/sudoers.d/* 2>/dev/null
常见缺失项包括:Defaults logfile="/var/log/sudo.log" 或 Defaults syslog=local2(后者需配合 rsyslog 配置)。
启用详细命令日志的两种可靠方式
推荐优先用 logfile 方式,简单直接、无需动 syslog:
- 运行
sudo visudo,在文件末尾添加一行:Defaults logfile="/var/log/sudo.log" - 确保日志目录可写:
sudo mkdir -p /var/log/sudo&&sudo chown root:root /var/log/sudo.log&&sudo chmod 600 /var/log/sudo.log - 重启 sudo 服务不是必须的,但建议测试:执行
sudo echo test后立刻查日志:sudo tail -n 1 /var/log/sudo.log,应看到类似Mar 15 10:22:34 host user1 : TTY=pts/0 ; PWD=/home/user1 ; USER=root ; COMMAND=/bin/echo test
如果已用 syslog(如 Defaults syslog=local2),则还需检查 /etc/rsyslog.d/50-sudo.conf 是否存在并包含:local2.* /var/log/sudo.log,然后重启 rsyslog:sudo systemctl restart rsyslog。
为什么 sudo -l 或 journalctl 看不到命令详情
sudo -l 只显示用户被允许执行的命令列表,和日志无关;journalctl _COMM=sudo 默认只捕获标准输出/错误,不记录命令行本身——除非启用了 log_input 并配置了 sudoers 中的 Defaults log_input(这会记录 stdin/stdout/stderr 到二进制文件,调试用,不推荐日常审计)。
真正能稳定回溯每条提权操作的,只有上面配好的 logfile 或 syslog 输出。注意:log_input 会显著增加 I/O 和磁盘占用,且需额外工具(如 sudo_logsrvd)解析,普通审计场景没必要启用。
查看与排查日志时容易忽略的关键点
日志内容看似全,但几个细节常导致“查不到”:
-
sudo su -或sudo -i启动的交互式 shell,后续所有命令都不会被sudo记录——因为它们是在 root shell 里直接执行的,没经过 sudo 调度 - 如果用户用
sudo bash -c "cmd1; cmd2",日志里只会记成一条:COMMAND=/bin/bash -c cmd1; cmd2,参数里的分号、引号会被截断或转义,原始语义可能丢失 - 日志时间戳依赖系统本地时间,若机器未同步 NTP,多台服务器间日志对不上时间线
-
/var/log/sudo.log默认不轮转,长期运行后可能撑爆磁盘,建议配合logrotate配置
真实环境里,最常漏掉的是交互式 shell 场景——以为开了日志就能看到用户在 root 下干了什么,其实那部分完全不在 sudo 日志覆盖范围内。


















