sudo日志默认不存于/var/log/sudo.log,而是通过syslog写入/var/log/auth.log(debian/ubuntu)或/var/log/secure(rhel/centos/fedora)。

sudo 日志默认存在哪?别瞎找 /var/log/sudo.log
Linux 默认不启用 sudo 专用日志文件,/var/log/sudo.log 通常根本不存在——这是最常踩的坑。真实日志默认走 syslog,写进 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(RHEL/CentOS/Fedora)。直接 tail -f /var/log/auth.log 看 sudo: 开头的行,才是最快验证方式。
如果你确实想用独立日志文件,得手动配 rsyslog 或 syslog-ng,把 authpriv.*(或 auth.*)重定向到自定义路径,再确保 sudoers 里没禁用日志设施。
怎么确认 sudo 实际记录了哪些字段?看 sudoers 的 logfile 和 log_input
sudo 的日志内容不是固定不变的,取决于 /etc/sudoers 里的配置项:
-
Defaults logfile="/var/log/sudo.log":只控制日志输出位置,不影响内容详略 -
Defaults log_input:记录用户输入的命令原始字节(含空格、转义),但会显著增大日志体积,且需终端支持pty -
Defaults log_output:记录命令输出(stdout/stderr),更重,一般生产环境禁用 -
Defaults !syslog:关掉 syslog 输出——这会让所有日志消失,除非你同时配了logfile
执行 sudo -V | grep "Default options" 可快速查看当前生效的默认选项;用 sudo visudo -c 检查语法,避免改错后提权失效。
普通用户提权行为怎么精准过滤?别只靠 grep sudo
grep sudo /var/log/auth.log 会混入 sudoers 语法检查、sudo -l 查询等噪音。真正反映“提权执行”的是带 COMMAND= 的行,例如:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
May 20 10:23:41 host sudo: alice : TTY=pts/2 ; PWD=/home/alice ; USER=root ; COMMAND=/bin/systemctl restart nginx
推荐这样筛:
-
awk '/sudo:.*COMMAND=/ {print}' /var/log/auth.log—— 排除权限查询类日志 -
journalctl _COMM=sudo --since "2 hours ago" | grep COMMAND=—— systemd 系统优先用 journalctl,更可靠 - 注意时区:
journalctl默认用本地时区,而auth.log时间戳可能受rsyslog配置影响
为什么有些提权操作完全没记录?检查 sudoers 中的 NOPASSWD 和 NOLOG
如果某条规则末尾加了 NOLOG,比如:
%devteam ALL=(ALL) NOPASSWD: NOLOG: /usr/bin/docker
那对应命令就彻底不记日志——连 auth.log 里都不会出现。同样,NOPASSWD 本身不抑制日志,但很多人误以为它等于“隐身”。另外,若用户通过 su -c 或直接 pkexec 提权,sudo 日志里当然找不到痕迹。
真正难排查的是那些被 include 进来的子配置文件(如 /etc/sudoers.d/ 下),它们可能悄悄覆盖主配置里的日志策略。逐个检查 ls /etc/sudoers.d/ && cat /etc/sudoers.d/* | grep -E "(NOLOG|Defaults.*log)" 才算到位。










