写点什么

如何做 Nginx 安全日志分析可视化

发布于: 2021 年 04 月 05 日

之前介绍过ModSecurity这款优秀的开源 WAF,它是一个入侵检测与阻止的引擎,原本是 Apache 的一个模块,现在可作为单独模块编译添加到 Nginx 服务中


虽然这款 WAF 很优秀,但是使用起来并没有那么容易,之前也整理了文章介绍它的原理和规则,然而还有一个问题,就是它的日志分析,之前介绍原理规则的时候,也介绍了它的日志规则,但是在使用过程中,纯文本的记录方式,对于入侵分析太不友好了



所以今天介绍一款管理 ModSecurity 日志的开源项目 WAF-FLE



WAF-FLE 是专门用来处理 ModSecurity 日志和事件的控制台,管理员可以通过 WAF-FLE 查看和搜索 ModSecurity 记录的日志


WAF-FLE 是 PHP 写的开源项目,搭建需要 LNMP/LAMP 环境

环境需求:

  • Apache/Nginx

  • PHP5.3+

  • php-pdo

  • php-mysql

  • php-apc

  • php-geoip

  • MySQL5.1+


安装环境不赘述,只说一个 GeoIP 库的安装,这里要通过 GeoIP 库去展示入侵 IP 信息,所以需要用到这个库,安装很简单,其实就是下载一个 dat 数据库,从https://www.maxmind.com/en/geoip-demo下载



下载后解压出 dat 文件即可


环境准备好之后,从 github 下载 WAF-FLE:https://github.com/klaubert/waf-fle



在 waf-fle 的 extra 目录下,存放了数据库 sql 文件,以及 Apache 的配置文件,如果是用的 Apache,直接将这个配置复制到 apache 配置目录下即可,如果用 Nginx,参考下面的配置



修改 config.php 的时候,因为我没有安装 apc 的缓存扩展,这扩展很老了,所以直接设置 APC_ON=false,关闭这个缓存


完成上面之后,通过域名访问,即可访问到安装界面



这里检查 php 扩展的时候,如果你不是 Apache 的话,会有个问题,就是在 setup.php 的 499 行,它用 apache_getenv 检测是否用 Apache 运行的,如果没运行 Apache,这里过不去,我这里是 Nginx 运行的,所以打开 setup.php 文件 499 行,把这部分代码注释掉即可



接着点击运行创建数据库



这里创建数据库的时候又有个问题,在 setup.php 代码 28 行的地方,执行创建函数的时候,引用一个 $databaseSchema,这里修改定义了一个位置,但是我放置的是我的位置,所以这里需要根据自己情况进行修改



修改完成后,继续通过页面执行创建数据库操作,创建完成如下:



安装完成,默认用户名密码是 admin/admin,之后,在 config.php 中配置 $SETUP=false,关闭安装之后,重新访问



默认用户密码登录之后,就需要修改用户名密码



设置完新密码之后,就会跳转到主界面了



目前没有数据,现在开始接入日志数据,点击菜单栏的 management,添加 sensor



保存后,即创建好一个 sensor,用来接收日志



创建好之后,在这个 sensor 上面,开始配置事件接收器



这里选着用 mlog2waffle 的方式接收日志,然后选着 service deamon 的方式查询日志,这种是实时查询,WAF-FLE controller URL 是配置 waf-fle 的控制器地址,mlog2waffle 是通过 put 请求发送数据到这个接口地址,下面就是配置 ModSecurity 日志的配置路径,配置完成后,点击 Next



系统会给出提示配置,需要按照给出的配置,配置这几个配置文件,这里按照提示的配置操作即可,需要的 mlog2waffle 配置文件及启动脚本都在 extra 目录下



配置完成后,启动 mlog2waffle


mlog2waffle,是通过 put 方法发送日志到 waf-fle 的,但是默认 Nginx 是不允许 put 请求的,所以启动会报错,需要在 nginx 中,通过 dav 方法,允许 put 请求



启动 mlog2waffle 过程中,遇到不少问题,记录如下:

  • mlog2waffle 中配置了 $CHECK_CERT = "TRUE",用来检测 SSL 的,当用 http 的时候,这里要改成 False,否则会握手失败

  • mlog2waffle 中配置了 $CHECK_CONNECTIVITY = "TRUE",这里是启动,检测 mlog2waffle 和 waffle 的连通信的,通过 check_conn 方法



这里通过 PUT 方法,发送了一个检测请求,这里比较坑的是,发送 PUT 请求,没有 URI,但是 Nginx 在检测到 PUT 请求没有 URI 的时候,会报 409,认为资源有冲突



所以,不管怎么做,这里检测就不会通过,两种方法处理,一种是直接关闭这个检测,mlog2waffle 就可以正常启动,另外一种方法就是修改这个检测的方法,将 uri 带上,mlog2waffle 是 perl 脚本,很简单


  • waf-fle 中使用了不少 Apache 专用内置函数,比如 apache_getenv()、getallheaders()、apache_setenv(),因为这里用的 Nginx,所以这几个函数都没有,



这里需要手动替换下,通过 $_SERVER 去获取客户端 IP,而 getallheaders()方法,需要手动写一个,如下:



另外在 index.php 中,65 行的位置,原本是通过 apache_setenv()将获取到的 sensor 的名称,复制给 Apache 的"REMOTE_USER",这里不用 Apache,所以直接注释掉即可



修改完这些,就可以通过脚本启动 mlog2waffle 了



启动后,通过 waf 的 access 日志就可以看到 mlog2waffle 已经开始通过 put 方法将日志解析成 event,传输到 waf-fle



在 mlog2waffle 的 readIndex 方法中,因为要读取并解析日志索引文件,所以有一个正则匹配如图:



这里需要你更具自己记录的日志格式进行修改匹配,完全匹配后,才能正确读取到日志,并解析后通过 send_event 方法将解析后的内容通过 PUT 方法传输到 waf-fle 进行展示


waf-fle 的接收文件就一个 index.php,它将所有步骤通过正则解析,有兴趣的可以看下源码,到此 waf-fle 就部署完成了,看下效果



虽然 waf-fle 是比较老的开源项目,但是对于 modsecurity 的日志分析完全够用

发布于: 2021 年 04 月 05 日阅读数: 28
用户头像

运维技术社区,坚持运维技术研究与分享 2020.07.14 加入

「运维研习社」技术社区发起人,同名公众号「运维研习社」、知识星球,专注运维技术研究分享,坚持原创,希望能和大家在运维路上结伴而行!

评论

发布
暂无评论
如何做Nginx安全日志分析可视化