一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何借助调优rsyslog的OMProg模块联动外部Shell脚本实现特定高危syslog的秒级自愈

时间:2026-06-18 09:37:52 编辑:袖梨 来源:一聚教程网

OMProg 是 rsyslog 输出模块,通过 stdin 将日志行转发至外部脚本,需配置 queue.type="direct"、batchsize="1"、imjournal 直连及超时控制以实现秒级自愈;脚本须轻量幂等、输入清洗、限频降级,并全程可观测。

理解 OMProg 模块的核心机制

OMProg 是 rsyslog 的输出模块,用于将匹配的日志事件通过标准输入(stdin)传递给外部可执行程序(如 Shell 脚本),并支持同步/异步模式。关键点在于:它不解析日志内容,只做管道转发;自愈动作是否“秒级”,取决于脚本执行效率、rsyslog 队列配置及日志触发路径是否绕过缓冲。

确保日志从产生到脚本执行的低延迟链路

默认 rsyslog 会批量处理或启用磁盘队列,这会导致几十毫秒至数秒延迟。需针对性调优:

  • 禁用磁盘队列:在 `action()` 中显式设置 `queue.type="direct"` 和 `queue.filename=""`,避免落盘开销
  • 关闭批处理:添加 `queue.batchsize="1"` 和 `queue.dequeuebatchsize="1"`,确保每条日志单独触发脚本
  • 使用 imuxsock + imjournal 直连内核日志源:避免 syslog 协议解析和网络层延迟;若用 journald,启用 `imjournal` 并设 `StateFile="/var/lib/rsyslog/imjournal.state"` 保证位置追踪不丢日志
  • 限制脚本执行超时:在 `omprog` 配置中加入 `timeout="2"`(单位秒),防脚本卡死阻塞后续日志

Shell 脚本设计要点:轻量、幂等、可追溯

脚本必须在 100ms 内完成核心动作,否则拖慢整个 pipeline。推荐结构:

  • 仅读取 stdin 一行(rsyslog 默认逐行传入),用 `read -r line` 获取原始日志,避免 `while read` 循环等待 EOF
  • 用 grep -q 或 awk 快速提取关键字段,例如检测 `sshd.*Failed password` 或 `kernel:.*Hardware error`,不建议全量 JSON 解析
  • 自愈动作限定为原子操作:如 `iptables -I INPUT -s $(echo "$line" | awk '{print $NF}') -j DROP` 封禁源 IP;或 `systemctl restart nginx` 重启异常服务——动作前加 `pgrep -f "nginx" > /dev/null || systemctl start nginx` 做状态兜底
  • 记录执行痕迹到独立文件(不走 syslog),例如 `echo "$(date -Iseconds) HIT: $line" >> /var/log/rsyslog-omprog-audit.log`,便于事后审计,避免形成日志循环

安全与稳定性加固措施

OMProg 直接执行外部脚本存在提权与注入风险,不可忽略:

  • 脚本属主设为 `syslog` 用户,权限 `750`,禁止 world-writable;rsyslog 主进程以 `syslog` 身份运行(非 root),降低危害面
  • 输入清洗强制生效:对 `$line` 中的 IP、端口、进程名等字段,用正则白名单过滤,例如 `ip=$(echo "$line" | grep -oE '([0-9]{1,3}.){3}[0-9]{1,3}' | head -1)`,再校验四段是否 ≤255
  • 限频保护:用 `rate-limit` 配合 `omprog`,例如 `rate.limit.interval="60" rate.limit.burst="5"`,防止高频攻击日志反复触发脚本耗尽资源
  • 失败降级策略:脚本 exit code 非 0 时,rsyslog 默认丢弃该条日志;可在脚本末尾加 `logger -t "omprog-fallback" "Failed to handle: $line"` 记入本地 syslog 备查

验证与可观测性配置

上线前必须闭环验证“日志→触发→动作→结果”全链路:

  • 用 `logger "sshd[1234]: Failed password for root from 192.168.1.100 port 22"` 手动注入测试日志
  • 监控 `/var/log/rsyslog-omprog-audit.log` 是否实时写入,`ps aux | grep your_script.sh` 确认进程瞬时存在
  • 检查自愈动作效果:如 `iptables -L INPUT -n | grep 192.168.1.100` 或 `systemctl is-active nginx`
  • 开启 rsyslog 调试:临时加 `rsyslogd -dn2 |& grep -i omprog` 查看模块调度日志
不复杂但容易忽略

热门栏目