Linux sudo日志默认仅记录基本操作,需手动配置log_input/log_output等参数并结合auditd才能实现命令输入输出、退出码及系统调用的完整审计。

Linux 的 sudo 日志记录和命令审计不是“开了就能用”的功能,而是需要明确配置、分层启用、协同验证的一套机制。默认只记基本操作(谁、何时、执行了什么命令),但要真正满足安全合规要求——比如记录命令输出、退出码、输入内容、甚至子进程行为——必须手动增强配置。
默认日志在哪?怎么看?
系统默认将 sudo 操作写入认证日志,路径取决于发行版:
- Ubuntu/Debian 系统:/var/log/auth.log
- RHEL/CentOS/Fedora 系统:/var/log/secure
查看某用户最近的 sudo 行为,可直接 grep:
grep 'sudo.*username' /var/log/auth.log
注意:这里记录的是“执行请求”,不包含命令实际输出、返回值或键盘输入。仅靠它无法还原操作全过程。
启用详细日志:记录输入与输出
要捕获 stdin/stdout/stderr 和退出码,需在 /etc/sudoers 中添加两行(务必用 visudo 编辑):
Defaults log_input,log_output
Defaults logfile="/var/log/sudo.log"
同时确保目录存在且权限正确:
sudo mkdir -p /var/log/sudo-io
sudo chown root:root /var/log/sudo-io
sudo chmod 700 /var/log/sudo-io
启用后,每次 sudo 执行会生成一个带时间戳的会话目录(如 /var/log/sudo-io/00/0001),内含输入流(stdin)、输出流(stdout)、错误流(stderr)及 exit code 文件。可用 sudo sudoreplay -l 列出会话,sudo sudoreplay 00/0001 回放整个操作。
权限配置影响审计完整性
如果 sudoers 规则写得宽泛(例如允许 /usr/bin/systemctl *),攻击者可能绕过意图限制,执行非预期命令;而日志只会忠实记录“执行了 systemctl start evil.sh”,不会主动判断是否越权。
真正可控的写法是:
%webadmin ALL=(root) /usr/bin/systemctl restart nginx
并配合:
Defaults:/usr/bin/systemctl !NOEXEC
这样既锁定命令+参数,又防止通过 systemctl 启动交互式 shell,让日志记录的内容真实反映授权范围内的行为。
配合 auditd 实现深度行为追溯
sudo 日志回答“谁用什么权限运行了什么命令”,auditd 则回答“这个命令打开了哪些文件、调用了哪些系统调用、访问了哪些内存区域”。两者互补:
- sudo 日志适合运维审计、责任归属
- auditd 日志适合取证分析、异常行为检测(如敏感文件被读取、特权进程被注入)
开启 auditd 后,可通过规则监控 sudo 相关事件:
-a always,exit -F path=/usr/bin/sudo -F perm=x -k sudo_exec
再用 aureport -k sudo_exec 查看所有 sudo 二进制调用痕迹,结合 sudo 日志交叉验证,形成完整操作链。


















