要让sudo日志真正用于审计,关键在于确保记录完整、路径独立、内容防篡改、参数不丢失:需配置Defaults logfile="/var/log/sudo.log"指定专属路径,启用log_input/log_output和requiretty保障参数完整,结合auditd内核级捕获execve系统调用,并通过logrotate轮转与chattr +a/+i实现防篡改保护。

要让 sudo 日志真正用于审计,关键不是“开了日志”,而是确保记录完整、路径独立、内容防篡改、参数不丢失。
指定独立日志路径,避免混杂
默认 sudo 日志会写入系统认证日志(如 /var/log/auth.log 或 /var/log/secure),但运维操作容易被其他日志淹没。最稳妥的做法是强制 sudo 写入专属文件:
- 用 sudo visudo 编辑 /etc/sudoers,添加一行:
Defaults logfile="/var/log/sudo.log" - 创建日志文件并设权限:
sudo touch /var/log/sudo.log && sudo chown root:root /var/log/sudo.log && sudo chmod 644 /var/log/sudo.log - 验证是否生效:执行 sudo whoami 后运行 sudo tail -n 1 /var/log/sudo.log,应看到含用户、TTY、PWD 和完整 COMMAND 的条目
确保命令参数完整记录
旧版 sudo 或配置不当会导致日志只记命令路径(如 /bin/rm),漏掉关键参数(如 -rf /)。必须确认以下两点:
- sudo 版本 ≥ 1.8.15(推荐升级到 1.9.0+),否则 log_input 行为不可靠
- 在 /etc/sudoers 中启用:
Defaults log_input, log_output, requiretty
其中 requiretty 是 log_input 正常工作的前提 - 日志中应出现类似这样的行:
alice : TTY=pts/0 ; PWD=/home/alice ; USER=root ; COMMAND=/bin/ls -la /root
用 auditd 实现内核级防篡改审计
仅靠 /var/log/sudo.log 不够安全——获得 root 权限的用户可直接清空或修改它。auditd 将日志写入 /var/log/audit/audit.log,权限为 600 且仅 root 可读,更符合合规要求:
- 安装并启用:
sudo systemctl enable --now auditd - 添加规则(保存为 /etc/audit/rules.d/sudo-exec.rules):
-a always,exit -F arch=b64 -S execve -F auid!=-1 -k sudo_cmd
-a always,exit -F arch=b32 -S execve -F auid!=-1 -k sudo_cmd - 重载规则:
sudo augenrules --load - 查看结果:
sudo ausearch -k sudo_cmd -ts recent | aureport -f -i
输出中将包含完整 argv 数组,例如 sudo rm -rf /tmp/* 的每个参数都单独列出
保护日志生命周期,防止丢失或覆盖
日志写进去了,还要能长期留存、轮转有序、不可删改:
- 配置 logrotate(新建 /etc/logrotate.d/sudo):
/var/log/sudo.log {
daily
missingok
rotate 30
compress
delaycompress
create 644 root root
sharedscripts
postrotate
systemctl kill --signal=USR1 rsyslog.service >/dev/null 2>&1 || true
endscript
} - 对当前活跃日志加追加锁:
sudo chattr +a /var/log/sudo.log(禁止修改/删除,仅允许追加) - 对已归档的旧日志,可进一步加不可变锁:
sudo chattr +i /var/log/sudo.log-20260827.gz(需先 chattr -i 才能解压查看)


















