最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何借助调优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` 查看模块调度日志
相关文章
- Grok团队协作权限配置:成员角色、共享范围与数据隔离说明 06-18
- Grok插件配置要点:密钥、权限与接口设置 06-18
- 2026年Perplexity使用说明:搜索配置、文件上传与账户权限 06-18
- 抖音神龙召唤游玩教程 06-18
- 2026年Perplexity访问入口与账号配置说明 06-18
- Perplexity版权风险说明:引用来源与生成内容的使用边界 06-18