当前位置: 首页 > 科技观察

如何做Nginx安全日志分析和可视化,就看这篇文章

时间:2023-03-16 00:14:11 科技观察

我介绍了ModSecurity,一个优秀的开源WAF,它是一个入侵检测和防御引擎。它原本是Apache的一个模块,现在可以作为一个单独的Module编译加入到Nginx服务中。虽然这个WAF很优秀,但它并不是那么好用。之前我曾经整理过文章介绍它的原理和规则。但是,还有一个问题,就是它的日志分析。之前介绍原理和规则的时候,我也介绍过。日志规则,但是在使用过程中,纯文本的记录方式对于入侵分析来说太不友好了。那么今天就来介绍一下管理ModSecurity日志的开源项目WAF-FLE。WAF-FLE是专门用于处理ModSecurity日志和事件的控制台。管理员可以通过WAF-FLE查看和搜索ModSecurity记录的日志。WAF-FLE是一个用PHP编写的开源项目,需要LNMP/LAMP环境搭建。环境要求:Apache/NginxPHP5.3+php-pdophp-mysqlphp-apcphp-geoipMySQL5.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,关闭安装,重新访问。使用默认用户密码登录后,需要修改用户名和密码。设置好新密码后,会跳转到主界面。目前没有数据,现在开始访问日志数据,点击菜单栏中的管理,添加传感器。保存后,创建一个传感器来接收日志。创建后,开始在传感器上配置事件接收器。这里我们选择使用mlog2waffle接收日志,然后选择servicedeamon查询日志。这是一个实时查询。WAF-FLEcontrollerURL是配置waf-fle的控制器地址,mlog2waffle通过put请求向该接口发送数据。地址,下面是配置ModSecurity日志的配置路径。配置完成后,单击“下一步”。系统会给出提示配置,你需要根据给出的配置配置这些配置文件。在这里,您可以按照配置提示进行操作。需要的mlog2waffle配置文件和启动脚本都在extra目录下。配置完成后,启动mlog2waffle。mlog2waffle通过put方法向waf-fle发送日志,但是Nginx默认不允许put请求,所以启动时会报错,需要通过nginx中的dav方法允许put请求。在启动mlog2waffle的过程中,遇到了很多问题。记录如下:$CHECK_CERT="TRUE"在mlog2waffle中配置检测SSL。使用http时,这里一定要改成False,否则会握手失败。mlog2waffle中的配置$CHECK_CONNECTIVITY="TRUE",这里是开始,检测mlog2waffle和waffle之间的连接,通过check_conn方法,这里通过PUT方法,发送一个检测请求,这里比较可怜的是,有noURI发送PUT请求,但是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获取的()传感器的名称被复制到Apache的“REMOTE_USER”。这里没有使用Apache,所以注释掉即可。修改完这些后,就可以通过脚本启动mlog2waffle了。启动后,通过waf的accesslog,可以看到mlog2waffle已经开始将log通过put方法解析成events,传递给waf-fle。在mlog2waffle的readIndex方法中,由于需要读取和解析日志索引文件,所以有正则匹配如图:这里需要修改匹配自己记录的日志格式。完全匹配后,可以正确读取日志。解析后,通过send_event方法将解析后的内容通过PUT方法传输到waf-fle进行展示。waf-fle的接收文件是一个index.php,通过正则解析所有的步骤。有兴趣的可以看看源码。至此,waf-fle部署完毕。来看看效果:waf-fle虽然是比较老的开源项目,但是对于modsecurity日志分析来说完全够用了。