ompipe 不适合入侵检测触发通道,因其仅支持无反馈管道写入,缺乏进程管理、错误重试、消息确认、结构化解析及上下文传递能力,无法满足高可靠、低延迟、可审计的安全要求。

rsyslog 的 ompipe 模块本身不适用于“实时流同步推送至本地安全探针执行自动化黑客入侵检测”这一目标,因为它仅支持单向、无反馈的管道写入(即把日志行直接 write() 到一个已打开的 FIFO 或普通文件),不具备进程生命周期管理、错误重试、消息确认或结构化解析能力。它无法保证探针持续运行、不丢日志、可重启恢复,也不提供任何协议协商机制——而入侵检测这类关键安全场景要求高可靠、低延迟、可审计、可中断恢复。
为什么 ompipe 不适合做入侵检测触发通道
ompipe 是最轻量的输出模块之一,设计初衷是对接 shell 脚本或简单日志归档工具(如 gzip、logger),其本质等价于:echo "$logline" > /path/to/fifo。
它不具备以下入侵检测必需能力:
- 不检查下游进程是否存活:若探针崩溃或未启动,ompipe 会静默失败(默认行为),日志直接丢失;
- 不缓冲或重试:写入失败(如管道满、EPIPE)时,rsyslog 默认丢弃该条日志,无队列回退机制;
- 无消息格式约定:只传原始日志行(含 PRI、timestamp 等),不带 JSON 结构、字段提取或时间戳标准化,探针需自行解析,易出错;
- 无法传递上下文:比如无法附带日志来源 IP、TLS 客户端证书信息、原始套接字元数据等高级取证字段;
- 不支持多实例并行:不能为不同规则路由到不同探针进程,灵活性差。
真正可行的替代方案:用 omprog + 长驻 Python 探针
推荐改用 omprog 模块(需 rsyslog ≥ 8.19.0),它专为与外部程序协同设计,能实现稳定、可控、可调试的入侵检测流水线:
- rsyslog 启动并守护你的 Python 探针进程,崩溃后自动拉起;
- 使用标准行协议通信:每行一条完整 syslog 消息(PRI TIMESTAMP HOST TAG CONTENT),格式稳定、无需额外解析库;
- 探针从 stdin 实时读取,逐行处理,匹配 SSH 暴力破解、sudo 提权、异常 crontab 修改、可疑进程注入等模式;
- 可内嵌轻量规则引擎(如
re+fnmatch)、调用 YARA 规则扫描 content 字段、或转发给本地 Suricata Unix socket; - 处理完立即输出一行响应(如
OK或ALERT:SSH-brute-10.0.2.15),rsyslog 可记录成功/失败状态到 internal.log。
最小可行配置示例
在 /etc/rsyslog.d/50-ids.conf 中:
module(load="omprog")
template(name="IDSFormat" type="string" string="%pri% %timestamp:::date-rfc3339% %hostname% %syslogtag% %msg%\n")
if $programname == 'sshd' and ($msg contains 'Failed password' or $msg contains 'Invalid user') then {
action(
type="omprog"
binary="/opt/bin/ids_probe.py"
template="IDSFormat"
input="pidfile=/var/run/ids_probe.pid"
queue.type="linkedlist"
queue.size="10000"
queue.dequeuebatchsize="100"
action.resumeRetryCount="-1"
)
}
其中 /opt/bin/ids_probe.py 是长运行脚本,持续读 stdin、正则匹配、调用 iptables -I INPUT -s ... -j DROP 或写入 /var/log/ids/alerts.log。
若坚持用管道,必须加一层可靠封装
如因历史原因必须走 FIFO,务必引入中间守护层,例如:
- 用
systemd --scope启动一个带重启策略的服务,监听 FIFO 并转发至真正探针; - 用
inotifywait + while read循环消费 FIFO,并捕获 exit code,失败时发告警; - 在 FIFO 前加
buffer工具(如mbuffer -m 128M)防阻塞,但无法解决进程崩溃问题。
这些做法绕过了 rsyslog 的可靠性机制,增加了运维复杂度,不推荐作为生产首选。










