原标题:基于golang+lua的Web日志安全分析系统
FBI-Analyzer
FBI-Analyzer是一个灵活的日志分析系统,基于golang和lua,插件风格类似ngx-lua。
使用者只需要编写简单的lua逻辑就可以实现golang能实现的所有需求,跳转实现原理。现实中可作为WAF的辅助系统进行安全分析,跳转实例。
可快速迁移waf中行为分析插件(非实时拦截需求,需要缓存计算数据的逻辑)至本系统,避免插件在处理请求时发起过多对数据缓存(redis等)的请求而导致WAF性能下降,帮助waf减负。
实现这个项目的目的其实也是加深下对lua虚拟机的认识,以及其他语言通过插件的方式调用lua脚本的工作原理,本项目因为只是单纯的lua虚拟机,不是luaJIT,所以不能使用ffi也不能引用三方so的方法。
当然使用lua插件化的性能最佳的语言肯定是C,但是因为太菜了,所以只能以golang来实现,但是就目前观察看下来,处理性能还是可以的。
跳过介绍,使用说明点击跳转。
特点 插件编写灵活
简单的需求在配置文件中完成其实挺不错的,但是在一些较为复杂的需求面前,配置文件写出来的可能比较抽象,或者说为了简化配置就要为某个单独的需求专门在主项目里写一段专门用来处理的逻辑,可以是可以,但没必要。
在使用openresty一段时间后,发现灵活的插件真的会减轻不少的工作量。接下来基于一个相对复杂的小需求来进行插件编写,点击跳转插件示例。
需求:对5分钟内的访问状态码40x的ip进行针对统计,5分钟内超过100次的打上标签锁定10分钟,供WAF进行拦截。
这种肯定也可以在waf中写插件,但是当类似需求多了,那么一条请求处理就可能会产生多次请求,影响waf性能。
这样的话只让waf发起一条请求读取下分析结果就可以直接进行拦截,将工作量转移给旁路系统,不影响线上服务。插件秒级生效
在线上环境运行示例风控插件,能涉及到的业务总QPS高峰大概有十万。(虽然是背着领导偷偷跑的,但是因为完全旁路于业务,所以问题不大。
插件目前使用主动监测的方式进行更新(说白了,for循环),但是其实可以使用inotify通过修改事件来驱动插件更新,我这里没写是因为我还没写完服务端更新的操作,vim编辑保存文件会删除旧文件创建新文件导致文件监控失败,有点憨批所以没搞。LogFarmer中实时传日志的方式就是使用事件驱动,实现比较简单。
插件更新时会自动编译缓存,供协程调用,避免每次都会要编译脚本运行。
动图中演示注释和运行打印日志方法来检测插件生效的速度。
灵活自定义的函数库
以打印日志为例
func logging(L *lua.LState) int { buf := new(bytes