应从源头限流+合理过滤:定位高频sudo源→用pam_exec脚本实现速率控制→rsyslog过滤降噪→合并/免密/探测替代频繁调用。

这类日志频繁刷屏,通常是因为有程序或用户反复执行 sudo 命令(比如脚本轮询、监控工具、错误配置的定时任务等),触发 PAM 会话记录。直接删日志或关 PAM 日志不推荐,应从源头限流 + 合理过滤。
定位高频触发源
先确认谁在频繁调用 sudo:
- 用
journalctl -u systemd-journald --since "1 hour ago" | grep "pam_unix.*session opened" | tail -50查最近记录,看用户名、终端(tty)、命令路径 - 检查可疑进程:
ps auxf | grep sudo或auditctl -l | grep sudo(若启用了 auditd) - 排查定时任务:
crontab -l(当前用户)、sudo crontab -l、systemctl list-timers --all - 特别注意 Ansible、SaltStack、Zabbix Agent、自定义健康检查脚本等——它们常静默调用 sudo 且未做节流
限制 sudo 调用频率(PAM 层)
通过 PAM 的 pam_faildelay 或 pam_limits 无法直接限频,但可用 pam_tally2(旧系统)或 pam_faillock(推荐)配合策略间接抑制。更直接有效的是用 pam_exec + 自定义脚本做速率控制:
- 编辑
/etc/pam.d/sudo,在第一行加入:auth [default=ignore] pam_exec.so quiet /usr/local/bin/sudo-rate-limit.sh - 创建脚本
/usr/local/bin/sudo-rate-limit.sh,用简单时间戳文件控制(例如:5 秒内同用户最多 2 次):#!/bin/sh
USER=$PAM_USER
DIR="/var/run/sudo-rate-limit"
mkdir -p "$DIR"
FILE="$DIR/$USER"
NOW=$(date +%s)
if [ -f "$FILE" ]; then
LAST=$(cat "$FILE")
ELAPSED=$((NOW - LAST))
if [ $ELAPSED -lt 5 ]; then
exit 1 # 拒绝本次 sudo
fi
fi
echo "$NOW" > "$FILE"
chmod 600 "$FILE"
- 给脚本加执行权限:
chmod +x /usr/local/bin/sudo-rate-limit.sh
日志层面降噪(不影响审计合规)
不关闭 session 记录,而是过滤掉高频但无风险的条目:
- 修改 rsyslog 配置(如
/etc/rsyslog.d/10-sudo-noise.conf)::msg, contains, "pam_unix(sudo:session): session opened for user" ~
:msg, contains, "session opened" and not (contains, "cmd=" or contains, "sudo -u") ~
(注意:第二行示例需根据实际日志格式微调,目标是保留带具体命令的记录,过滤纯登录类) - 重启服务:
sudo systemctl restart rsyslog - 或改用 journalctl 动态过滤:
journalctl -t sudo | grep -v "session opened for user root"(适合临时排查)
替代方案:避免非必要 sudo
很多场景其实无需每次开新 session:
- 将重复 sudo 命令合并为单次执行(如用
sudo sh -c 'cmd1 && cmd2') - 对可信脚本配置免密 sudo(
visudo中加%wheel ALL=(ALL) NOPASSWD: /path/to/script),并确保脚本内部不频繁 fork sudo - 用
sudo -n非交互模式提前探测权限,失败则跳过后续 sudo 调用










