大量 “sudo: pam_unix(sudo:session): session opened” 日志刷屏的限流

13次阅读

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

大量 “sudo: pam_unix(sudo:session): session opened” 日志刷屏的限流工具、错误配置的定时任务等),触发 PAM 会话记录。直接删日志或关 PAM 日志不推荐,应从源头限流 + 合理过滤。

定位高频触发源

先确认谁在频繁调用 sudo:

  • journalctl -u systemd-journald --since "1 hour ago" | grep "pam_unix.*session opened" | tail -50 查最近记录,看用户名、终端(tty)、命令路径
  • 检查可疑进程:ps auxf | grep sudoauditctl -l | grep sudo(若启用了 auditd)
  • 排查定时任务:crontab -l(当前用户)、sudo crontab -lsystemctl list-timers --all
  • 特别注意 ansiblesaltstackzabbix Agent、自定义健康检查脚本等——它们常静默调用 sudo 且未做节流

限制 sudo 调用频率(PAM 层)

通过 PAM 的 pam_faildelaypam_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 调用

text=ZqhQzanResources