开源软件创建SOC的一份清单

开源软件创建SOC的一份清单

作者:糖果

0×01 概要

现在各个公司都有自己的SOC安全日志中心,有的是自己搭建的,有的是买厂商的,更多的情况是,各种复合类的的组织结构。这些日志来自不同的服务器,不同的部门五花八门。如果是买的设备,设备可能是一整套的方案,有自己的流理量监听与安全日志中心,但因为成本的原因,不能所有地方都都部署商业产品,必然会有自己的SOC系统,商业系统也不可能去监听分析,太边界的日志,处理起来也力不从心,首先本地化的数据不通用,商用产品也没法构建安全策略。开源和自己构建的系统可以高度的定制化,但与商业产品不能有机的结合,就没办法发挥最大效用。

0×02 需求分析

抛出问题,我们首先要收集各种日志,监听流量,让设备去发现流量中的威胁,我们来汇总报告数据,结合我们收集来的所有数据,去溯源,去发现更多的历史痕迹。内网安全和外网不一样的地方是,内网有各种日志和设备,采用什么方式取,什么方式存,用什么工具,可能都不统一。但总来说,我们主要的手段监听危险行为:1.分析流量;2.分析日志。 像tenable这种工具,就是提供了全栈系列的解决方案。 她会把流量中各种协议解析出来配合自己的策略报警,还提供了与外部系统交互的方式,syslog和rest api都是典型变互手段,paloato的IDS也一样,有的是基于rest的,有的是基于xml的交互的。总体我们就是有自己的分析结果,还有厂商的分析果,如何整体到一起,威胁情报更准确,就是我们想要的。

0×03 日志收集流程

其实我们构建自己的SOC也是从流量和日志,还有策略方面考虑的, 用什么策略,又反过来也推动了工具的选择。这篇我们考虑不是如何存数据,而是我们采用一个什么的结构,可以从海量的日志来,取得我们想要的有用的数据,用机器和自动化的方式,代替人工甄别数据的工作量的耗时,提供一种思路。

1.png

0×04 日志种类

从大的粒度角度讲,我们的日志就是几类:

1.流量日志:典型的流量日志,比如我们网络镜像分光过来的日志,然后用snort或是pcap去监听流量中,我们最关注的数据,比如http报文,或是mysql的执行sql数据。

2.设备日志:厂商的设备,一般会去监听流量,通过监听流量,存储日志再分析,进行威胁报告,这些高中低威的威胁日志数据就是我们需要的,也是我们要重点过滤的。这个有一个误报的问题,如果设备知道自己是误报,就不报了,就不用我们过滤了,但误报也是正常,那有不误报的设备,如果真没用的,可以看看是不是设备断电了。

3.服务日志:比如云的HTTP的日志,路由器的日志,邮件服务日志,这种日志我们也可以分析收集,分析服务中可能存在的安全问题。

4.agent日志:agent的日志是大量的,比如zabbix这种模式收集了大量这种日志。(图上没画)

0×05 日志处理相关工具链

搭建这些服务器,有很多都通用的的工具,大家可以按方抓药,很多都是开源软件,主要的成本的是实践的时间成本。

流量监听类: dpdk:dpdk 为 Intel 处理器架构下用户空间高效的数据包处理提供了库函数和驱动的支持,它不同于 Linux 系统以通用性设计为目的,而是专注于网络应用中数据包的高性能处理。

也就是 dpdk 绕过了 Linux 内核协议栈对数据包的处理过程,在用户空间实现了一套数据平面来进行数据包的收发与处理。在内核看来,dpdk 就是一个普通的用户态进程,它的编译、连接和加载方式和普通程序没有什么两样。

netmap是一个高效的收发报文的 I/O 框架,已经集成在 FreeBSD 的内部了。 当然,也可以在 Linux 下编译使用 。

pcap:流量抓包基础工具,tcpdump等流理工具的底层包。

流量复制类: tcpycopy:流量监听和流量重放工具,可以实时,或是将记录下来的pcap文件重放。

http-miroor:http的镜像,是nginx的插件,可以将nginx,openresty流量,并发镜像一份。

开源IDS: suricata:Suricata是一个高性能的网络入侵检测(IDS)、入侵防御(IPS)和网络安全监控的多线程引擎,内置支持IPv6。可加载snort规则和签名,支持barnyard2。使用pcap提供的接口进行抓包,运行前电脑必须安装有pcap才可以使用。

snort:在1998年,Marty Roesch先生用C语言开发了开放源代码(Open Source)的入侵检测系统Snort.直至今天,Snort已发展成为一个多平台(Multi-Platform),实时(Real-Time)流量分析,网络IP数据包(Pocket)记录等特性的强大的网络入侵检测/防御系统(Network Intrusion Detection/Prevention System),即NIDS/NIPS.Snort符合通用公共许可(GPL——GNU General Pubic License),在网上可以通过免费下载获得Snort,并且只需要几分钟就可以安装并开始使用它。snort基于libpcap。

日志中心SOC: graylog:Graylog 是一个简单易用、功能较全面的日志管理工具,相比 ELK 组合, 优点:部署维护简单,查询语法简单易懂,内置简单的告警,可以将搜索结果导出为 json,提供简单的聚合统计功能,UI 比较友好。

splunk:Splunk 是机器数据的引擎。使用 Splunk 可收集、索引和利用所有应用程序、服务器和设备生成的快速移动型计算机数据 。 使用 Splunking 处理计算机数据,可让您在几分钟内解决问题和调查安全事件。监视您的端对端基础结构,避免服务性能降低或中断。以较低成本满足合规性要求。关联并分析跨越多个系统的复杂事件。获取新层次的运营可见性以及 IT 和业务智能。

服务日志:企业内部的服务日志太多了,邮件、网关、vpn、云日志,不一一介绍。

所以这些工作的第一步,就是将这些数据都放到合适的容器了里,数据库还是很多的,这里特别要说的是clickhouse,clickhouse是用来分析用户行为的,用于安全领域也是可以有的。

ElasticSearch:ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

ClickHouse:Yandex在2016年6月15日开源了一个数据分析的数据库,名字叫做ClickHouse,这对保守俄罗斯人来说是个特大事。更让人惊讶的是,这个列式存储数据库的跑分要超过很多流行的商业MPP数据库软件,例如Vertica。如果你没有听过Vertica,那你一定听过 Michael Stonebraker,2014年图灵奖的获得者,PostgreSQL和Ingres发明者(Sybase和SQL Server都是继承 Ingres而来的), Paradigm4和SciDB的创办者。Michael Stonebraker于2005年创办Vertica公司,后来该公司被HP收购,HP Vertica成为MPP列式存储商业数据库的高性能代表,Facebook就购买了Vertica数据用于用户行为分析。

mysql:开源关系型数据库,这个大家如果感到陌生,可以google一下。

日志收集工具: nxlog:nxlog 是用 C 语言写的一个开源日志收集处理软件,它是一个模块化、多线程、高性能的日志管理解决方案,支持多平台。

logstash:Logstash 是开源的服务器端数据处理管道,能够同时 从多个来源采集数据、转换数据,然后将数据发送到您最喜欢的 “存储库” 中。(我们的存储库当然是 Elasticsearch。)

kafkacat:是一个github上的开源项目,把落地的日志文本传到kafka队列上,但比其它的类似工具的特点就是效率强大。

0×06 过滤策略 我们收集了这么多数据,其实还是想从这些数据中,拿到我们想到的数据是,从威胁报警噪音中,去掉误报,得到最有价值的关键信息。

2.png

上面我们提到的数据的日志源,从威胁甄别,到日志字段存储策略都有自己方式,我们让所有的相关想要的数据都放到了我们的容器里,我们加入自己的过滤策略,得到我们想到的结果。其实有些开源日志工具已经想到了会有这种需求,所能他们在设计就实现了这个功能,我们通添加一些小的脚本在他们的系统中就可以实现数据的再过滤处理,但也只限于在他们自己的系统里,而我们的数据显然不在一个系统里,所以,最后还得我们自己来,下面图展示了大体的我们的容器使用的技术。

3.png

从”1.日志源“开始,到实际存数据的“2.容器”,就是基础数据持久层,然后我们通过实现一个“3.驱动”层来提供数据读取的可能。最后我们会把”4.过滤策略”应用到我们的数据上,通过编写算法策略来实现数据过滤和甄别,最后我们能得到什么数据呢?我们可以通过白名单和黑名单得到更准备的报警消息。 我们可以得有关行为的关联数据。我们可以建立一个数据反馈机制,沉淀威胁数据和安全策略。我们可能针对不同报警,做再次判断处理, 降低误报噪音,加强正确报警的识别度。

0×07 应用实例

比如说,我们已经构建了一个实际的复合性的SOC系统的雏形,我们可以取得我设备发过来的报警信息,比如,某个网段上的WEB相关的SQL注入的流量监听分析,我们如何做下一步的过滤策略呢, 如果这个设备的报警原则是针对字典的判断的,我们就可以加一个针对库判断的工具进行再次过滤,让报警的正确率更高。

有一个叫做libinjection的库,可以准确的判断中字符串中是否有注入: https://github.com/client9/libinjection

#include <stdio.h>
#include <strings.h>
#include <errno.h>
#include "libinjection.h"
#include "libinjection_sqli.h"

int main(int argc, const char* argv[])
{
    struct libinjection_sqli_state state;
    int issqli;
    const char* input = argv[1];
    size_t slen = strlen(input);
    /* in real-world, you would url-decode the input, etc */
    libinjection_sqli_init(&state, input, slen, FLAG_NONE);
    issqli = libinjection_is_sqli(&state);
    if (issqli) {
        fprintf(stderr, "sqli detected with fingerprint of '%s'\n", state.fingerprint);
    }
    return issqli;
}

$ gcc -Wall -Wextra examples.c libinjection_sqli.c$ ./a.out "-1' and 1=1 union/* foo */select load_file('/etc/passwd')--"sqli detected with fingerprint of 's&1UE'

这工具使用起来非常的简单,并且提供其它语言的工具驱动。还技持sql注入以外的检查。堆积代码不太好,而且现在使用一个django,flask,tornado的框架来实现一个后台系统的效率还是挺快的,问题并不只是代码,我们最主要的是让策略行之有效的执行下去,这样睡在库中的数据才有价值。我们现在使用openresty做网关很普通,有人可能会觉得整合日志和系统间的API是比较麻烦的,其实就是麻烦,我们为了简单一些,就封装了一些简单的SDK库,让工作更高效率,比如这个moonscript的库:https://github.com/shengnoah/fortress

0×08 总结

罗马城不是一天建立的,这种针对各种数据的过滤策略也是一个不断累积的过程,我们只是提供一种实现的思路和可能。更多的代码可以到以上给出的github的连接上去找。关键系统好用,还是要看我们对工具的驾驭能力,和策略制定的优良,按图索骥拿出实践,记住了,如果设备不报警,看看是不是断电了。

Tags: