Linux系统无sudo-log命令,非授权sudo行为日志实际存于/var/log/secure(RHEL系)或/var/log/auth.log(Debian系),关键识别字段为“NOT IN SUDOERS”“command not allowed”“NOT AUTHORIZED”,需通过grep+awk精准过滤并结合systemd timer实现轻量告警。

Linux 系统本身没有“sudo-log”命令,也不存在独立的 /var/log/sudo.log 文件——真正承载非授权 sudo 行为线索的日志,是 /var/log/secure(RHEL/CentOS/Fedora)或 /var/log/auth.log(Debian/Ubuntu)。所谓“非授权执行”,指用户越权运行了 sudoers 中未明确允许的命令,典型表现为日志中出现 command not allowed、NOT AUTHORIZED 或 authentication failure 等关键词。要从中提取并实时告警,需分三步走:确认日志结构、精准过滤异常、建立轻量触发机制。
看清 /var/log/secure 里哪些行代表非授权尝试
一条典型的失败提权记录长这样:
May 18 14:22:03 web01 sudo: bob : user NOT in sudoers ; TTY=pts/2 ; PWD=/home/bob ; USER=root ; COMMAND=/bin/bash
另一类是权限不足但用户在 sudoers 中(比如只被允许重启 nginx,却想删系统文件):
May 18 14:25:11 web01 sudo: alice : command not allowed ; TTY=pts/3 ; PWD=/tmp ; USER=root ; COMMAND=/usr/bin/rm -rf /etc
注意关键识别字段:NOT IN SUDOERS、command not allowed、authentication failure、NOT AUTHORIZED。这些不是普通登录失败,而是明确暴露策略绕过意图的信号。
用 grep + awk 快速筛出高危行为
不要只用 grep sudo——它会混入大量正常操作(如 sudo -l 查询权限),干扰判断。推荐组合过滤:
- 查所有明确拒绝的提权尝试:
sudo grep -E 'NOT IN SUDOERS|command not allowed|NOT AUTHORIZED' /var/log/secure - 查最近10分钟内新增的非授权记录(配合
tail -f实时监控):sudo tail -f /var/log/secure | grep --line-buffered -E 'NOT IN SUDOERS|command not allowed' - 提取用户+命令+时间,便于归档分析:
sudo awk '/NOT IN SUDOERS|command not allowed/ {print $1,$2,$3,$9,$13,$17}' /var/log/secure(字段位置依实际日志格式微调)
用 systemd timer 或简单脚本实现轻量级告警
无需部署 ELK 或商业 SIEM,一个每5分钟运行一次的 shell 脚本就能满足基础告警需求:
- 新建脚本
/usr/local/bin/check-sudo-deny.sh,内容如下:
#!/bin/bash
LOG="/var/log/secure"
ALERT_FILE="/tmp/sudo_deny_alert.tmp"
LAST_CHECK="/tmp/sudo_deny_last_check"
CURRENT_TIME=$(date +%s)
# 只检查上次检查时间之后的新记录
if [ -f "$LAST_CHECK" ]; then
SINCE=$(cat "$LAST_CHECK")
else
SINCE=$((CURRENT_TIME - 300)) # 默认查5分钟前
fi
# 提取新出现的非授权行
sudo awk -v since="$SINCE" '$1" "$2" "$3 {cmd="date -d \""$1" "$2" "$3"\" +%s 2>/dev/null"; cmd | getline ts; close(cmd); if (ts > since && /NOT IN SUDOERS|command not allowed/) print}' "$LOG" > "$ALERT_FILE"
if [ -s "$ALERT_FILE" ]; then
echo "【ALERT】检测到非授权 sudo 尝试:" | mail -s "SUDO DENY ALERT" admin@example.com
cat "$ALERT_FILE" | mail -s "SUDO DENY DETAILS" admin@example.com
fi
echo "$CURRENT_TIME" > "$LAST_CHECK"
- 赋予执行权限:
sudo chmod +x /usr/local/bin/check-sudo-deny.sh - 用 systemd timer 设置每5分钟运行一次(比 cron 更可靠,支持日志追踪)
进阶建议:补全上下文,避免误报
仅靠日志关键词可能漏掉伪装行为(例如通过 sudo sh -c 'xxx' 绕过简单匹配)。可配合以下手段提升准确性:
- 在
/etc/sudoers中启用Defaults log_input,使每次输入命令的原始字符串(含空格、引号)也被记录,便于还原真实意图 - 限制用户只能运行白名单命令,例如:
%dev ALL=(root) /bin/systemctl start nginx, /usr/bin/journalctl -u httpd,让“非授权”真正可定义、可收敛 - 对高频触发账号(如连续3次失败)自动加锁:
sudo usermod -L username,并写入告警正文

















