Linux默认不记录sudo完整命令参数是出于安全策略,需配置Defaults logfile=/var/log/sudo.log和Defaults log_input,log_output才能实现完整审计。

Linux 默认不会记录 sudo 命令的完整参数,比如执行 sudo cp /tmp/a.conf /etc/nginx/nginx.conf,日志里可能只显示 COMMAND=/bin/cp,路径全被截断。这不是遗漏,而是 sudo 的默认安全策略——防止密码、密钥路径等敏感信息写入系统日志。要真正实现完整命令审计,必须主动配置两项关键设置。
启用独立 sudo 日志文件
系统默认把 sudo 日志发给 syslog(如 auth.log 或 secure),而 syslog 会截断长字段。绕过这层限制,得让 sudo 自己写日志:
- 用
visudo编辑/etc/sudoers(切勿直接用 vim/nano) - 在文件末尾添加一行:
Defaults logfile=/var/log/sudo.log - 保存后,sudo 会自动创建并写入该文件,内容包含完整命令路径和所有参数
开启输入输出记录(可选但推荐)
仅记录命令还不够,有时需还原操作上下文(比如谁输错了什么、脚本实际输出了什么)。这时需要额外启用 I/O 记录:
- 仍在
/etc/sudoers中追加:Defaults log_input,log_output - 该配置会让 sudo 记录 stdin/stdout/stderr 到二进制日志文件(默认存于
/var/log/sudo-io/) - 配合
sudo_logsrvd服务,还能回放操作过程(适合高合规要求场景)
验证日志是否生效
配置完别急着上线,先手动测试并确认日志内容准确:
- 执行一条带参数的命令,例如:
sudo ls -l /root - 查看
/var/log/sudo.log,应看到类似:Oct 08 20:05:12 host user : TTY=pts/1 ; PWD=/home/user ; USER=root ; COMMAND=/bin/ls -l /root - 注意:如果仍只看到
/bin/ls没参数,说明logfile未生效或配置位置有误(比如写在了被注释掉的区域)
补充说明:系统日志里为什么看不到完整命令
Debian/Ubuntu 的 /var/log/auth.log 和 RHEL/CentOS 的 /var/log/secure 都受 syslog 截断机制影响。即使你改了 sudoers,只要没设 logfile,这些文件依然只会记录元信息(用户、时间、是否成功),COMMAND= 后面的内容大概率被省略。所以不能只依赖 grep auth.log 来做审计。


















