Linux无sudo-log命令,实际需通过sudoers配置与syslog(如/var/log/auth.log)审计提权命令;默认启用时,日志含认证、授权、执行三类记录;可启用log_input/log_output捕获完整会话并回放。

Linux 系统本身没有名为 sudo-log 的原生命令。你提到的“sudo-log”可能是对 sudo 日志机制的误称,实际应通过分析 sudoers 配置 + syslog(通常是 /var/log/auth.log 或 /var/log/secure) 来审计普通运维人员提权后执行的每条命令。
确认 sudo 日志是否已启用
默认情况下,sudo 会将提权行为写入系统日志,但需确保以下两点生效:
-
sudoers 中启用了 log_output 或 logfile(推荐用 syslog):运行
sudo visudo,检查是否有类似Defaults logfile="/var/log/sudo.log"—— 若存在,日志会单独写入该文件;若无,则依赖系统日志服务(rsyslog/syslog-ng)接收 sudo 的 syslog 消息。 -
rsyslog 正确捕获 authpriv.* 级别日志:查看
/etc/rsyslog.conf或/etc/rsyslog.d/50-default.conf,确认包含类似auth,authpriv.* /var/log/auth.log(Debian/Ubuntu)或authpriv.* /var/log/secure(RHEL/CentOS)的规则。
从系统日志中提取提权指令流
sudo 执行命令时,会在日志中记录三类关键行:用户认证(authentication)、命令授权(command allowed)、实际执行的命令(executed command)。以 Ubuntu 为例:
在 /var/log/auth.log 中查找:
-
sudo: pam_authenticate: Authentication failure—— 认证失败(可定位暴力尝试) -
sudo: username : TTY=pts/1 ; PWD=/home/username ; USER=root ; COMMAND=/bin/ls /tmp—— 成功提权并执行的具体命令(含用户、终端、路径、目标用户、完整命令) -
sudo: username : command not allowed—— 权限拒绝(反映 sudoers 限制效果)
常用筛选命令:
sudo grep 'COMMAND=' /var/log/auth.log | tail -50sudo awk '/COMMAND=/ && /username/ {print $0}' /var/log/auth.log | tail -20增强审计:启用 exec 日志(记录子命令与输出)
仅靠默认日志无法看到命令执行结果或内部调用(如脚本内嵌的 curl、rm -rf)。要捕获完整指令流,需启用 sudo 的 log_input/log_output 功能:
- 编辑 sudoers:
sudo visudo - 添加行:
Defaults log_input, log_output(全局)或针对用户:Defaults:username log_input, log_output - 指定日志目录(需提前创建并设权限):
Defaults iolog_dir="/var/log/sudo-io",并确保目录属主为 root:root,权限为 755 - 重启 rsyslog:
sudo systemctl restart rsyslog
启用后,每次 sudo 命令会生成一个带时间戳的会话目录(如 /var/log/sudo-io/20240510-142345),内含:log(命令元数据)、stdin(输入内容)、stdout(标准输出)、stderr(错误输出)。可用 sudo scriptreplay 回放整个终端会话。
日常监控与告警建议
人工翻日志效率低,建议结合以下方式持续跟踪:
-
定时归档与压缩:避免日志膨胀,用 logrotate 管理
/var/log/auth.log和/var/log/sudo-io/ -
关键词告警:用
swatch或自定义脚本监控COMMAND=/bin/bash、COMMAND=/usr/bin/python、COMMAND=/usr/bin/find ... -exec等高危模式 - 集中日志平台:将 auth.log 推送到 ELK(Elasticsearch+Logstash+Kibana)或 Graylog,支持按用户、命令、时间范围、TTY 终端多维检索与可视化
-
最小权限原则:在 sudoers 中明确限定可执行命令(如
username ALL=(root) /usr/bin/systemctl start nginx),而非开放ALL,大幅缩小审计范围


















