综合NIDS及ELK开源类产品,打造SOC解决方案

前言

在一个成熟的安全体系保障中,对风险的评估、分析、处置、监控能力是保障中不可或缺的一环,在现代化的 DevSecOps 生命周期管理中也占有重要的比重。大多数企业在进行安全建设时,往往是通过购买第三方安全产品来实现对风险的覆盖,一部分节省了安全部门在人力成本上的投入。

但在中、小型企业中,优先保障的均是应用产品的可持续运维、业务稳定性,用于评估、监控的环节也均是来自各中间件日志、产品业务日志、服务器操作日志等。

虽然也会通过采购必要的 WAF 类安全产品进行防护,如果没有正确配置或存在绕过依然会产生安全风险。当发生安全入侵风险事故时,往往也不是第一时间到达“案发现场”,存在滞后性。后续复盘均需要人工登录到各服务器进行日志分析,这个步骤进一步增加了安全工作难度,依赖安全运维人员的经验技术。

综上所述,在进行安全建设时需要考虑对上述日志进行统一汇总,并且能够用于对高危事件、异常操作等进行及时预警。接下来将通过使用开源安全产品进行组合,对上述存在的风险问题进行的覆盖,增强事前安全建设工作的整体性便于后续事件分析。

工具&环境

考虑到高效、跨平台部署等问题,文中相关环境均是优先选用支持虚拟化 Docker 技术进行构建的工具,不会去过多撰写基础类安装内容,请酌情阅读。
文中涉及环境:

  • CentOS Linux(7)
  • Docker version 20.10.8
  • docker-compose version 1.29.2

文中涉及开源软件:

  • Suricata(6.0.4)
  • Wazuh & ELK
  • Arkime (可选添)

简述下整体架构图:

image

Suricata

Suricata 是一款开源的威胁检测引擎,它是基于网络的攻击检测,检测 TCP/IP 模型所有层中的攻击,以预防和缓解入侵活动威胁并阻止网络级别的恶意流量。支持入侵检测 (IDS)、入侵防御(IPS)、网络安全监控(NSM)模式和 PCAP 分析,可以在多种不同环境中安装部署,它能够监视和检测来自企业环境中存在的端点的活动威胁。

在部署时,可以采用官方开源镜像进行快速构建,Suricata 的生态也很成熟可以和许多开源工具进行集成。但在此之前需要确保网络模式改为混杂模式(promisc)。

Suricata 如果监听接入镜像流量的网卡,默认会自动设置此网卡为混杂模式。如果没有则需要通过 ip link set 进行设置。

# 设置网卡 ip link set <INTERFACE> multicast off ip link set <INTERFACE> promisc on ip link set <INTERFACE> up # 可以通过监听验证网卡通信是否正常 tcpdump -i $INTERFACE port 80

实例场景构建:

假设当前我的容器中存在一个不安全的服务:

https://github.com/vulhub/vulhub/tree/master/log4j/CVE-2021-44228

通过容器启动它:

cd ./<CVE-2021-44228> docker-compose up -d

接着启动 Suricata 检测容器:

cd <suricata_dir> # 此处 eth1 对应靶机所在虚拟机的 host-only 网卡 IP docker run -d --network=host --cap-add=net_admin --cap-add=net_raw --cap-add=sys_nice --hostname=suricata --name=suricata -e SURICATA_OPTIONS="-i eth1" -it jasonish/suricata:6.0.4 # 更新 suricata 规则,更新完成测试完规则之后会自动重启服务 docker exec -it suricata suricata-update -f # 重启 suricata 容器以使规则生效 docker restart suricata

这样我们就获得了通过 Suricata 检测运行中应用容器的场景,可以直接在容器命令进行查看:

# 监视 suricata 日志 docker exec -it suricata tail -f /var/log/suricata/fast.log

image

suricata配置文件简要说明

Suricata 使用 yaml 格式进行配置,文件存储路径默认为:/etc/suricata/suricata.yaml,其中涵盖运行模式、数据包处理大小、运行用户及组、日志记录目录及扩展等相关配置。

在使用 suricata-update 进行规则更新后,Suricata 默认将所有规则合并至一个文件夹中,默认路径为:/var/lib/suricata/rules/suricata.rules。

同时默认会将告警日志以行的方式,推送至 /var/log/suricata/fast.log 文件,一般只需要重点关注这个文件里的消息就可以了。如果需要更加详细的内容,则需要关注 /var/log/suricata/eve.json 里的JOSN内容,它是警报和事件的JSON内容日志。

  • fast.log记录了流量中匹配到签名的告警信息,包括时间,五元组信息,告警id,告警信息。
  • eve.json则是记录了告警信息,flow流信息,协议解析的信息(例如http,dns等),以及攻击的payload等。
    一般我习惯对 eve.json 进行扩展,使其可以记录更多内容便于后续分析,比如增加对HTTP请求Body内容的配置:
# vim 编辑 suricata.yaml ,修改配置文件内容成下面内容: ...snip... outputs: fast: enabled: yes eve-log: enabled: yes types: - alert: payload-buffer-size: 6kb #paylaod大小限制 payload-printable: yes #记录原始payload http-body-printable: yes #记录http 原始响应系想你 ...snip...

接下来看攻击实例,当有攻击者对容器中运行的应用进行 log4j 攻击利用时,会触发 logj4 规则事件,告警信息会记录 fast.log 文件中。

image

如果和我一样优化过 suricata.yaml 配置,则可以在 eve.json 找到更具体的事件内容:

...snip.. {"timestamp":"2022-03-15T04:02:52.782462+0000","flow_id":2015254757014294,"in_iface":"br-e0bafc678706","event_type":"alert","src_ip":"172.18.0.1","src_port":35434,"dest_ip":"172.18.0.2","dest_port":8983,"proto":"TCP","alert":{"action":"allowed","gid":1,"signature_id":2034783,"rev":2,"signature":"ET HUNTING Possible Apache log4j RCE Attempt - Any Protocol TCP (Outbound) (CVE-2021-44228)","category":"Misc activity","severity":3,"metadata":{"attack_target":["Server"],"created_at":["2021_12_17"],"cve":["CVE_2021_44228"],"deployment":["Internal","Perimeter"],"former_category":["HUNTING"],"signature_severity":["Major"],"tag":["Exploit"],"updated_at":["2021_12_17"]}},"http":{"hostname":"10.0.0.13","http_port":5555,"url":"/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.localhost/}","http_user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Firefox/91.0","http_content_type":"application/json","http_method":"GET","protocol":"HTTP/1.1","status":400,"length":303,"http_response_body_printable":"{\n \"responseHeader\":{\n \"status\":400,\n \"QTime\":5},\n \"error\":{\n \"metadata\":[\n \"error-class\",\"org.apache.solr.common.SolrException\",\n \"root-error-class\",\"org.apache.solr.common.SolrException\"],\n \"msg\":\"Unsupported operation: ldap://${sys:java.version.localhost/}\",\n \"code\":400}}\n"},"app_proto":"http","flow":{"pkts_toserver":4,"pkts_toclient":3,"bytes_toserver":724,"bytes_toclient":968,"start":"2022-03-15T04:02:52.555798+0000"},"payload":"R0VUIC9zb2xyL2FkbWluL2NvcmVzP2FjdGlvbj0ke2puZGk6bGRhcDovLyR7c3lzOmphdmEudmVyc2lvbn0ubG9jYWxob3N0L30gSFRUUC8xLjENCkhvc3Q6IDEwLjI0MS4xMTUuMTM6NTU1NQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTAuMTU7IHJ2OjkxLjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvOTEuMA0KQWNjZXB0OiB0ZXh0L2h0bWwsYXBwbGljYXRpb24veGh0bWwreG1sLGFwcGxpY2F0aW9uL3htbDtxPTAuOSxpbWFnZS93ZWJwLCovKjtxPTAuOA0KQWNjZXB0LUxhbmd1YWdlOiB6aC1DTix6aDtxPTAuOCx6aC1UVztxPTAuNyx6aC1ISztxPTAuNSxlbi1VUztxPTAuMyxlbjtxPTAuMg0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlDQpDb25uZWN0aW9uOiBjbG9zZQ0KVXBncmFkZS1JbnNlY3VyZS1SZXF1ZXN0czogMQ0KDQo=","payload_printable":"GET /solr/admin/cores?action=${jndi:ldap://${sys:java.version}.localhost/} HTTP/1.1\r\nHost: 10.0.0.13:5555\r\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Firefox/91.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2\r\nAccept-Encoding: gzip, deflate\r\nConnection: close\r\nUpgrade-Insecure-Requests: 1\r\n\r\n","stream":1} ...snip..

详细的包含攻击来源、触发攻击类型、HTTP接收与返回等内容。到此就可以结合第三方工具来进行扩展,使用 filebeat 或者 logstash 将 eve.json、fast.log 文件内容推送至 elasticsearch。

当然你也可以通过自己手写规则,实现对规则库的扩展,比如添加监听回传敏感信息的WebShell请求告警:

  1. 通过Wireshark抓去含有敏感通信的数据请求,将其保存为如 shell.cap 文件,随后通过追踪流量发现回传 cmd shell 信息
  2. 假设已windows的版权信息 “2009 Microsoft Corporation” 来作为特征将他们转换成16进制,由于是发送请求所以添加 to_server 与 established
  3. alert tcp any any -> any any (msg: "Hacker backdoor or shell Microsoft Corporation"; flow:to_server,established; content:"|20 4d 69 63 72 6f 73 6f 66 74 20 43 6f 72 70 6f 72 61 74 69 6f 6e|"; depth:200; sid:3030303; rev:1;)

如果目前所涉及的场景不需要高消耗性能的实时性告警,也可以借助 Suricata 实现异步分析,只需要结合简单的定时任务就可以实现。如果还需要记录对文件的存储,也可以通过开启 suricata.yaml 文件里面开启文件存储功能(file-store)来实现。

Wazuh & ELK

检测与告警部分已经做好了,接下来我们优化安全分析这块。上面做到了对事件的告警记录,但在命令行下不便于我们进行安全分析,特别是存在许多不同终端的场景下。这里我的方案是借助 Wazuh 安全平台的能力,帮助我们对多终端的日志数据进行汇总分析,帮助我们深度挖掘安全威胁。

Wazuh 是一款很好的开源工具,借助 ELK 的大数据存储还可以和多种开源组件进行组合,并且它实现了各种跨环境的 agent 代理,能帮助我们进行不同终端的安全分析,涵盖安全分析、入侵检测、日志分析、文件完整性监控、漏洞检测、配置评估、合规和容器安全等。

详细安装方式可以见官方文档:

https://documentation.wazuh.com/current/docker/wazuh-container.html
安装完成后能够进入控制面板则说明正常:

image

此时我们就可以将先前的 Suricata 日志及告警接入到 Wazuh 平台中,可以参考官方的文档进行操作。

https://documentation.wazuh.com/current/learning-wazuh/suricata.html

打通容器之间的 network 配置,并在 Suricata 容器中安装 linux-agent 进行日志推送。安装成功后我们可以在控制台中的 Agents 页面看到监听机器:

image

随后在 Suricata 容器中增加 wazuh-agent 对 eve.json 文件的解析,完成后保存重启 wazuh-agent

因为各版本存在差异,建议查看文档并进行配置 https://documentation.wazuh.com/current/learning-wazuh/suricata.html#set-up-suricata-on-both-elastic-server-and-linux-agent

当攻击者再次攻击应用服务时,就可以在 Wazuh Kibana 中看到可视化的安全事件告警:

image

这里也可以参考官方的安全平台整体架构对现有业务进行合理的部署,补全自身业务对安全分析、预警的功能缺失:

image

到此我们已经实现了基于网络的攻击监控和检测,后续在不同PC及服务器上安装 wazuh-agent 并开启各项安全检测,就实现了基于主机的攻击监控和检测,接入事件告警机制也能让安全建设防范未然。

Arkime(可选增)

通过对上面介绍的产品进行部署组合,一个基础的SOC平台就完成了,如果需要对其增加可以再引入一个产品 Arkime。Arkime(以前称为 Moloch)是一个大规模、开源、索引数据包捕获和搜索工具,可以用来增强当前的安全基础设施,以标准 PCAP 格式存储和索引网络流量。

这样做的好处是无容置疑的,比如可以用来挖掘异常的网络通信请求、回看安全事件前后操作链、通过附带的网络图验证通信节点是否安全。同样也是存在弊端,需要大量的数据磁盘来进行存储。

比如我们可以通过索引来查询FTP登录的网络数据,并且可以下载该网络的 PCAP 至本地:

image

部署该工具不失为增强企业安全防护能力的一种有效手段。


总结

这类工具平台的优缺点相对也很明显,它虽然能解决基本的安全保障问题,但对人员的安全技能要求较高。需要专人专职去整理编写安全告警、监测规则,出现技术问题需要自行去攻克及二开。同样的,对于上述平台影响到企业正常业务运行故障,安全运维人员面临的就是对事件结果负责。

在面临预算不充足、业务场景优先级不高且需要进行安全保障时,可以折中选择此方案。这里给大家推荐几种可供组合的其工具:

  • 如果仅需要NIDS能的安全告警,ELK 加 Suricata 就能满足,ELK已经支持对 Suricata 的模块集成。商业产品的话也可以用 splunk 来取代ELK。
  • 不想使用Docker进行上述场景产品的部署,除了使用上面介绍的到 Wazuh ,也可以改用 Security Onion 2(用于威胁追踪、企业安全监控和日志管理的 Linux 发行版)。它的最大特色就是集成度高、用户安装和使用管理控制简便,在最新版本中还增加了多因素身份验证(MFA),使用它也能接收Wazuh-Agent传递过来的数据并进行统一分析。
    面对预算充足的建议优先采用商业化产品进行建设,不仅仅可以将安全风险转移给第三方承包,也能让安全运维人员脱离繁琐的事件告警等处理工作,将精力放在其他的重点工作内容上。

参考:


版权声明

除非另有说明,本网站上的内容均根据 Creative Commons Attribution-ShareAlike License 4.0 International (CC BY-SA 4.0) 获得许可。