题图随便找的,跟本产品、本系统、本文没什么关系的。
做了一套Syslog服务器。
目前主要自用,开发语言为Go。
主要介绍:
1,自动兼容rfc3164与rfc5424
2,全平台兼容,包括i386/amd64/arm64的FreeBSD/Linux/Windows,但不支持win7/win2008R2以及更早版本
3,目前支持自动写文件、写mariadb/mysql库、基于tcp的转发以及扩展命令发布
4,支持lua扩展,lua环境可自由控制是否进行默认处理流程,可以在lua内控制写文件、写库、转发日志以及发布命令等,后面会详细介绍
5,支持基于ip/cidr的acl控制,且支持入、出分别设置
6,支持连接数、超时、最大消息大小等设置
7,各功能模块可分别开启与关闭
8,支持日志的自动轮转与自动压缩
9,理论上支持许多种类的数据库,但我只用mariadb/mysql,别的没测试过,可以通过配置文件自行调整
10,各模块各项性能指标可设置
11,运行状态报表自动刷新到文件
12,支持自动加载规则文件或者其他文件交给lua
13,外发命令可配置持久化
14,性能很猛
15,功能在一段时间内会持续扩展
其他的都是细节了,性能应该不输任何一个现有syslog服务器,功能上现阶段主要先满足自用,然后再去搞各种消息队列支持之类的外围扩展。
性能方面我做的压测,在普通13代CPU上每分钟不低于1500万入库+写文件+tcp转发,cpu使用率不高于4%,内存不高于10M。测试环境是win10,14字段的json格式web日志解析后入库操作,表引擎aria,只有一个自增主键(当然你的表结构要合理,不能刻意降低性能,且存储性能要跟得上)。
主要是lua部分,这个是我要求比较多的地方,也算是个亮点吧。
我自用需求是这样的,经常看我博客的都知道,我从最早的cron入库到后来的rsyslog,再到syslog-ng,借着自己基于syslog-ng做扩展来实现需求,但一直都有很别扭的地方,最后的一次扩展用python,这玩意扩展很方便,但是性能真的不太行,而且占内存很多。
所以最近下狠心自己干了。首先系统自身性能绝对不能差,然后一个灵活且绝对高效的编程环境是必须的,我需要能够在不重新编译程序的情况下灵活调整数据的处理流程和处理结果。且整体性能不能低,因为有过被针对的经历,半小时我不记得是500万还是5000万数据量,作为数据接收与分析处理的环节,这部分性能一旦跟不上,那外围的自动防御系统也就嘎了。
自动加载规则文件是这样,比如我是需要根据规则文件来对日志内容进行分析与评判,即时判断哪些请求是恶意行为,然后第一时间通知各个成员节点进行处置,比如封锁该IP,或者根据行为来给该IP计分,或者必要的时候封锁整个/24和/64段。所以这里就有个小问题了,规则文件是需要每次调用的时候都从文件加载的,为了方便各平台统一,我这规则文件是json格式,解析以后分解成若干个table,然后根据这些table来进行URL是否有恶意行为,是否由恶意的UA发起请求,等等等等。所以呢,由系统启动时加载(其实可以热加载,也就是文件有变动则自动重载),然后lua可以通过一个调用就获取规则文件的内容,这样可以大幅度减少IO请求,也就大幅度提升了性能。
当然了,这里并不必然是我的规则文件这样的操作,你也可以让系统加载任何文件,只要你需要。
在lua环境中,可以控制写文件的内容、写到哪个mariadb/mysql表,写入什么字段以及内容,写几个表,写几次,sql语句是什么、转发什么格式什么内容的日志、发布什么样的命令等等等等。简而言之,系统现有的4种默认处理流程与lua互相独立,lua可以使用这4种以及后面扩展的其他模块,而这些功能模块的默认处理行为可以由设置文件关闭,也可以由lua直接跳过。
两个tcp通道对外发布,其实技术上是一样的,只是这样可以方便区分不同的内容,但若你把输出的格式和标记进行区分,则只用一个通道也是可以的。
整套系统的设计都考虑了现实需求,比如有些目标的接收比较死板,而又无法更改,那么这样区分为两个发布通道是很有用的,再比如,你想让另一个机器来做日志的备份入库、落地节点,同时又需要其他节点来接受处理输出,那我这样的设计是个很好的方案。如果不需要就不使用即可,并不会增加系统压力。底层的tcp保活是使用了操作系统的keep alive,稳定性绝对一流。
后续的扩展自然是很多的,我自己也有需求。
逻辑上来说,可以视为做了一个syslog协议的壳子以及外围扩展,而数据处理的流程以及内容和结果则由你自己编程决定。举个例子,如果你编程方面过关的话,你可以在某人登录你网站后台的时候,给你微信发消息。当然这需要继续扩展了,你自己搞点边角料实现起来也不会麻烦的。就像经典的流程那样,输入是各系统发过来的日志,处理是一个编程环境,你自己决定,输出则是各种外围模块。
简而言之,如果只是需要一个高性能、跨平台的syslog服务器,那默认的处理行为就足够了。
如果需要在高性能、跨平台之外需要一个自由灵活的编程环境,那么用lua就可以了。
或者,来源日志的格式并不统一,需要一个能够灵活编程处理的环境;或者,想找一个多平台兼容,不需要为了部署而费精力;再或者,你仅仅是看不惯那些自诩“下一代syslog服务器”的有识之士;又或者从现有那些开源或者商业软件里找不到一个完全符合自己需求的,那选这个没错的。
再次啰嗦一句,这不是waf,也跟waf没有直接关系。我的整套自动防御系统面向的是公网服务器所有应用层以及部分网络层的安全风险,而web只是其中很小一部分,waf也只是我系统中一个很小的子集,这不是一个层次的事物,不要再问我了,谢谢。
这种系统不是中小企业和个人玩家能买得起的,价格不低的,别轻易问,大家都有各自的事。