1.1 背景与痛点
在政务、企业内网等安全运营环境中,部分安全设备(如防火墙、IDS、WAF、主机安全等)每天产生大量告警信息,但这些设备普遍缺乏实时告警推送能力,导致安全团队面临以下核心问题:
- 安全设备缺乏告警推送功能:部分安全设备,只提供本地日志存储,无法直接对接即时通讯工具(如钉钉、企业微信),运维人员需要频繁登录设备查看,响应滞后。
- 重保期间告警响应慢:重大活动保障期间,需要7x24小时盯着设备告警,稍有疏忽就可能漏掉关键告警
- 外发告警噪声严重:由于外发日志无法进行筛选和去重,相同事件反复推送,导致消息列表过长运营人员检索起来困难。
1.2 解决方案
Syslog2Bot 是一款跨平台的 Syslog 日志接收与告警推送系统,核心功能:
- Syslog接收:UDP/TCP 5140端口接收日志,兼容标准Syslog协议
- 灵活解析:支持JSON、分隔符、正则等多种解析方式
- 精准筛选:多条件组合筛选,支持告警去重
- 钉钉推送:实时推送告警到钉钉群机器人
- 本地存储:SQLite数据库存储,支持日志清理策略
1.3 技术栈
- 后端:Go + Wails v2
- 前端:Vue 3 + TypeScript + Element Plus
- 数据库:SQLite (纯 Go 实现)
- 桌面框架:Wails
2.1 快速部署
Windows系统:
- 下载
Syslog2Bot.exe - 双击运行即可,无需安装
macOS系统:
- 下载
Syslog2Bot.app - 首次运行:右键 → 打开 → 仍要打开
- 如果提示"已损坏,无法打开",执行以下命令:
xattr -cr /Applications/Syslog2Bot.app
2.2 配置流程
- 添加设备:进入「设备管理」,添加安全设备信息(名称、IP地址),用于标识日志来源。
- 配置解析模板:进入「日志解析」,选择预设模板或手动配置解析参数。系统提供云锁、天眼等预设模板,一键配置即可使用。
- 配置筛选策略:进入「筛选策略」,设置告警过滤规则。可以按威胁等级、攻击类型、目标IP等条件筛选,避免告警风暴。
- 配置钉钉机器人:
- 在钉钉群中添加自定义机器人,获取Webhook地址
- 进入「机器人配置」,添加机器人信息
- 创建告警策略:进入「数据推送」,创建告警策略,关联筛选策略、机器人和消息模板。
- 启动服务:在「系统状态」页面启动Syslog服务,配置安全设备发送Syslog到本机5140端口。
3.1 Syslog + JSON 解析
适用场景:日志格式为 Syslog头部 + JSON内容
日志示例:
<142>Mar 5 14:41:44 hostname SyslogWriter[123]: {"attackIp":"192.168.1.100","threatType":"暴力破解","level":3,"description":"SSH暴力破解攻击"}
配置方法:
- 解析类型:Syslog + JSON
- 头部正则:
<(?P<priority>\d+)>(?P<timestamp>\w+\s+\d+\s+[\d:]+) - 字段映射:自动提取JSON中的字段
解析结果:
{"priority": "142","timestamp": "Mar 5 14:41:44","attackIp": "192.168.1.100","threatType": "暴力破解","level": 3,"description": "SSH暴力破解攻击"}
值转换功能:可以将数字代码转换为可读文本
{"level": {"1": "低危","2": "中危","3": "高危","4": "危急" }}
3.2 分隔符解析(智能分隔符)
适用场景:日志使用特殊分隔符,且同一设备有多种告警类型
日志示例:
<142>Mar 5 16:28:31 hostname SyslogWriter[123]: webids_alert|!serial001|!rule_123|!SQL注入攻击|!...
配置方法:
- 解析类型:智能分隔符
- 分隔符:
\|! - 类型字段位置:0(第一个字段标识告警类型)
- 跳过头部:开启(跳过Syslog头部)
解析逻辑说明: 天眼设备的Syslog日志包含多种告警类型(webids_alert、ips_alert、ioc_alert、webshell_alert),每种类型的字段排列顺序不同。智能分隔符解析通过以下逻辑处理:
- 识别告警类型:根据类型字段位置(默认第0个字段)识别当前日志属于哪种告警类型
- 选择子模板:根据告警类型自动选择对应的子模板配置,每个子模板定义了关键字段的位置索引
- 字段映射处理:
- 原始字段按分隔符切分后,根据子模板中定义的位置索引提取对应值
- 将提取的值存入统一的标准化字段名(alertName、attackIP、victimIP、alertTime、severity、attackResult)
子模板配置示例:
{"webids_alert": {"alertNameField": 3,"attackIPField": 6,"victimIPField": 8,"alertTimeField": 4,"severityField": 10,"attackResultField": 26 },"ips_alert": {"alertNameField": 3,"attackIPField": 6,"victimIPField": 8,"alertTimeField": 4,"severityField": 10,"attackResultField": 24 },"ioc_alert": {"alertNameField": 18,"attackIPField": 6,"victimIPField": 8,"alertTimeField": 10,"severityField": 12,"attackResultField": -1 }}
处理流程示意:
原始日志: webids_alert|!field_1|!field_2|!SQL注入|!field_4|!...|!192.168.1.100|!...
↓识别类型: webids_alert
↓选择子模板: webids_alert配置
↓字段提取映射:
field_3 → alertName = "SQL注入"
field_6 → attackIP = "192.168.1.100"
field_8 → victimIP = "目标IP"
field_4 → alertTime = "告警时间"
field_10 → severity = "威胁等级"
↓输出标准化字段供筛选和推送使用
支持的告警类型:
- webids_alert:网页漏洞利用告警
- ips_alert:入侵防御告警
- ioc_alert:威胁情报告警
- webshell_alert:Webshell告警
3.3 筛选策略详解
为什么需要筛选策略? 安全设备每天可能产生成千上万条日志,如果全部推送会造成告警疲劳。筛选策略可以精准过滤,只推送需要关注的告警。
支持的操作符:
- ==:等于
- !=:不等于
- contains:包含
- in:在列表中
- regex:正则匹配
-
= < <=:数值比较
实战配置示例: 场景1:只推送高危及以上告警
字段:level操作符:in值:高危,危急
场景2:过滤内网IP攻击
字段:attackIp操作符:regex值:^(?!10\.|172\.(1[6-9]|2[0-9]|3[01])\.|192\.168\.).*
场景3:多条件组合
条件1:level in "高危,危急"条件2:attackResult == "成功"逻辑:AND
告警去重功能: 同一攻击在短时间内可能产生大量重复告警,开启去重后,在指定时间窗口内相同告警只推送一次。 配置项:
- 去重开关:是否启用去重
- 去重窗口:去重时间范围(秒)
- 去重依据:设备ID + 策略ID + 攻击IP + 威胁类型 + 事件描述
告警推送效果
钉钉消息示例:
安全告警告警时间:2024-03-15 10:30:00设备名称:云锁-生产服务器威胁类型:SSH暴力破解攻击者IP:203.0.113.50威胁等级:高危攻击结果:失败描述:检测到SSH暴力破解攻击,已自动拦截
项目地址
GitHub:https://github.com/Jach1n/Syslog2Bot
问题反馈
使用过程中遇到问题,欢迎提交 Issue:
- 功能建议
- Bug反馈
- 设备适配需求
后续规划
- 多平台告警支持(企业微信、飞书、邮件)
- 日志统计分析
- 告警聚合功能
- 支持更多安全设备
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)


