前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >企业安全体系架构分析:开发架构之开源WAF延申

企业安全体系架构分析:开发架构之开源WAF延申

作者头像
FB客服
发布2019-07-31 17:33:44
9630
发布2019-07-31 17:33:44
举报
文章被收录于专栏:FreeBuf

在前几期过多的介绍体系化方面的事情,让大家有个基本的概念,能将一些安全设备、安全理念相关联起来,这一期准备给干货——开源WAF的搭建。

其实网上开源WAF是有很多的,搭建方式比较简单,但只限于搭建,而没有分析调整的后续使用方法,这一点其实是实际使用中大家最关心也是最迫切需要的,下面就分享一下我的开源WAF构建与使用。

一、选用

其实在选用方面是需要进行多方面对比的,有业务需求方面的,有安全本身的,出于我们业务和架构的考虑,在这里我们使用的是modsecurity V3作为主体WAF框架,OWASP TOP 10作为主要策略,同时还覆盖自定义策略,当然这里就不放开了。

二、评估

评估modsecurity主要是评估服务器性能、安全性、速率、误报率。

服务器性能方面由于WAF的特性是需要串联到链路中的,所以在这里是放在nginx代理服务器上,4核8G的服务器,对于量不大的nginx来说已经是高配了。

从安全性角度来说,为什么使用V3,而不是V2.9,实际上我在搭建的时候V3是才推出的,稳定性来说是V2.9更胜一筹,但是考虑到V2.9本身的漏洞(I/O DoS)以及后期日志分析(不支持json),最终是使用了V3。

从速率的角度考虑,由于是挂在nginx的模块,所以速率方面不需要太担心。

从误报率的角度来说,任何的WAF都会存在误报,但是modsecurity的高自由调整策略是我特别习惯的一个特性。

综上选用modsecurity V3作为WAF主体。

在这里每位安全工程师、架构师都应该根据自己业务特性、业务逻辑、自身需求去选用WAF,不要盲从。我写这篇文章只是想给没有任何思路做开源安全的人一些思路。

三、搭建

搭建环节我就不再阐述了,请大家仔细阅读GitHub:https://github.com/SpiderLabs/ModSecurity

四、分析

这块是我重点想说的,由于modsecurity原先是apache的组件,后应广大网友要求,增加了nginx版的modsecurity,但是原先的waffle(效果展示)却并没有适配nginx,我曾研究过nginx的waffle,虽然最终可以使用,但是体验并不是特别好,在这里我将介绍我的日志分析体系构建。

1.了解modsecurity日志记录机制

Modsecurity V3的日志支持分布式日志记录和集中式日志记录,支持json格式的记录,详见GitHub。

2.选用日志传输工具

由于需要传输json日志,并考虑性能问题,这里使用filebeat作为日志传输工具。

3.选用日志展示工具

由于考虑到性能问题,这里采用分布式部署ELK(elasticsearch、logstash、kibana)作为展示工具

4.落实

首先调整Modsecurity V3记录分布式json日志,代码如下:

代码语言:javascript
复制
# -- Audit log configuration -------------------------------------------------
# Log the transactions that are marked by a rule, as well as those that
# trigger a server error (determined by a 5xx or 4xx, excluding 404,  
# level response status codes).
#
SecAuditEngine On
SecAuditLogRelevantStatus "^[0-9]+"
#SecAuditLogRelevantStatus "^(?:5|4(?!04))"
# Log everything we know about a transaction.
SecAuditLogParts ABCDEFGHIJKZ
SecAuditLogFormat JSON
# Use a single file for logging. This is much easier to look at, but
# assumes that you will use the audit log only ocassionally.
#
SecAuditLogType Concurrent
SecAuditLog /opt/modsecurity/audit.log
# Specify the path for concurrent audit logging.
SecAuditLogStorageDir /opt/modsecurity/data

详细解释每个参数:

代码语言:javascript
复制
SecAuditEngine //日志引擎,on为开启日志记录,off为关闭日志记录
SecAuditLogRelevantStatus //日志状态记录,”^[0-9]+”为记录所有响应码的日志,"^(?:5|4(?!04))"为只记录400-599响应码的日志,不包括404日志
SecAuditLogParts //日志体,详见github
SecAuditLogFormat //日志格式,这里启用json格式,如果记录普通格式删除该参数
SecAuditLogType //日志存储类型,concurrent为分布式存储
SecAuditLogStorageDir //分布式日志存储路径
SecAuditLog //集中式存储路径

之后我们安装ELK,详细安装方法与介绍详见:

https://www.jianshu.com/p/e7362ccfe7e3?tdsourcetag=s_pctim_aiomsg

将filebeat传输指向logstash集群服务器,通过logstash筛选规则放入elasticsearch中,通过kibana查询展示WAF日志:

Filebeat配置参数:

代码语言:javascript
复制
filebeat.prospectors:
# Each - is a prospector. Most options can be set at the prospector level, so
# you can use different prospectors for various configurations.
# Below are the prospector specific configurations.
- input_type: log 
  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /opt/modsecurity/data/*/*/*
  json.keys_under_root: true
  encoding: utf-8
  document_type: mod_security
  close_eof: true
  scan_frequency: 5s
  clean_*: true
代码语言:javascript
复制
详细解释每个参数:
input_type //输入类型为log
Paths //传输的日志路径
json.keys_under_root //json值放于根节点上
Encoding //编码类型,这里UTF-8到日志展示时基本不会出现乱码,如果为GBK极有可能出现乱码情况
document_type //文档类型,这里自定义
close_eof //关闭文件处理程序
scan_frequency //配置扫描文件频率
clean_* //清除缓存

将日志传输到logstash服务器。

Logstash配置:

这里使用3个配置文件,input是定义输入,output是定义输出,filter是定义日志过滤,我们先从input看:

Input定义很简单,只是单纯监听本机5044端口作为logstash的输入口,与filebeat传输配置中的端口对应。

Output中设置elasticsearch服务器的信息与主键的定义,在这里特别提示,主键名称要带logstash-,因为kibana展示中如果要展示ip定位的话,只有开头带logstash的键才可以用这个功能。

Filter文件中定义message为json格式,定义geoip(用于展示ip定位)

传递到kibana展示效果如下:

5.根据机制分析日志

自带的kibana日志比较乱,这时候我们自己搭建日志的分析模板,选择上图左侧参数可以只展示参数值,全部建立好模板后如下:

其中几个参数需要进行解释:

代码语言:javascript
复制
Time   //传输时间
geoip.city_name   //ip定位城市名
geoip.country_name   //IP定位国家
transaction.host_ip   //访问者ip
transaction.host_port  //访问端口
transaction.messages   //触发阻断规则信息
transaction.request.body   //请求体(POST)
transaction.request.headers.Host   //访问域名或IP
transaction.request.method   //请求方式
transaction.request.uri   //请求URI
transaction.response.http_code  //响应码

6.建立展示模板

建立一个dashboard,详细见Kibana使用:

五、监控告警

Kibana可以接收邮件告警与zabbix告警联动,因为我的zabbix告警绑定了企业微信与微信,zabbix触发告警内容时微信会收到消息,比邮件告警更加直接,所以采用的是kibana zabbix联动告警的方式,详细配置见:https://github.com/Yelp/elastalert

触发告警搜索规则:

代码语言:javascript
复制
transaction.messages:*   //有告警信息
transaction.messages:* & transaction.response.http_code:403  //有阻断信息

以上是我的搭建分析分享。后期带来关于自动化安全扫描的分享。

*本文原创作者:煜阳yuyang,本文属于FreeBuf原创奖励计划,未经许可禁止转载

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、选用
  • 二、评估
  • 三、搭建
  • 四、分析
    • 1.了解modsecurity日志记录机制
      • 2.选用日志传输工具
        • 3.选用日志展示工具
          • 4.落实
            • 6.建立展示模板
            • 五、监控告警
            相关产品与服务
            云服务器
            云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档