sudo日志默认混入系统认证日志:debian/ubuntu在/var/log/auth.log,rhel系在/var/log/secure;要记录完整命令行需配置/etc/sudoers:添加defaults logfile="/var/log/sudo.log"和defaults log_input, requiretty。

确认日志源头在哪
sudo操作默认不写独立文件,而是混入系统认证日志:Debian/Ubuntu走/var/log/auth.log,RHEL/CentOS/Fedora走/var/log/secure。直接用tail -f /var/log/auth.log | grep sudo就能看到实时提权动作,但内容很简略——只记了谁、何时、执行了哪个命令路径(如/bin/ls),不带参数(-la /root这种就丢了)。
启用完整命令行记录
要让日志包含实际参数,必须改/etc/sudoers,用visudo安全编辑:
- 加Defaults logfile="/var/log/sudo.log",把sudo行为单独存到一个文件,避免和其它日志搅在一起
- 加Defaults log_input, requiretty(log_output按需选,它会录终端输出,占空间且需pty支持)
- requiretty是关键前提,没它log_input不生效;旧版sudo(
改完立刻测试:sudo ls -la /root,然后检查/var/log/sudo.log是否出现类似COMMAND=/bin/ls -la /root的整行记录。没看到参数?大概率是requiretty没启或终端非交互式。
防篡改:必须对接auditd
光有/var/log/sudo.log不安全——root权限者能删它、改它。真正审计级的做法是让操作落地到内核层:
- 确保auditd服务已启用:sudo systemctl enable --now auditd
- 在/etc/sudoers里加Defaults audit_log = yes(sudo ≥ 1.9.0才支持)
- 或手动加audit规则:sudo auditctl -a always,exit -F path=/usr/bin/sudo -F perm=x -k sudo_exec
- 查结果用:ausearch -m execve -i -ts recent | grep sudo,输出含完整argv,日志存在/var/log/audit/audit.log,权限600,仅root可读
集中分析与日常排查
单机看日志用命令组合最高效:
- 快速筛某人操作:grep "USER=username" /var/log/auth.log
- 统计高频命令:awk '/COMMAND=/ {print $NF}' /var/log/sudo.log | sort | uniq -c | sort -nr
- 查失败提权:grep "incorrect password\|authentication failure" /var/log/auth.log
- 结合journalctl(systemd系统):journalctl _COMM=sudo --since "2 hours ago"
多服务器环境别靠人工翻,应配置rsyslog或fluentd,把/var/log/audit/audit.log或/var/log/sudo.log加密发到远程日志中心,再用ELK或Grafana做聚合分析。











