一、NetSA SiLK简介

NetSA SiLK是美国CERT使用的网络流统计信息分析工具,延续美国人做事的科学体系特点,围绕这个工具的开发运用,采用了思科公司的NetFlow V9标准,并由NIST发展成为IPFIX标准,规范了流统计信息的析取、传输和存储使用。可贵的是,US-CERT将NetSA整套网络取证工具开源,包括SiLK在内;糟糕的是,不知是因为发展时间过长还是版本太多,异或是维护人员的马大哈特性,关于SiLK安装方面的官方说明错漏不少,搭建过程可谓是坎坷崎岖。

        官方安装说明可以参考这篇文档,大体没错的,但是一步一步坐下来,估计是难以顺畅运转起来的。

二、离线环境准备

        因为是离线安装,所以仍然需要像之前一样,准备与离线环境一模一样的在线操作系统,以下载正确的依赖用于构建repo库。构建过程略去,需要的话可以参考我们之前的文章,再次提醒一定要一样,不要偷懒。比如我是在CentOS7上构建的库,在CentOS8上安装的时候就遇上不少冲突,有的能解决,有的很难解决,好在不妨碍我把这篇文章记录完毕。末了搞明白一个问题:为啥Linux系统上装个东西这么费劲,不想Windows绝大多数情况下只需要双击——实在是因为版本太多了,版本和版本之间的变化也没有一以贯之的维护方式,没有那个程序能够做到完整兼容啊。难怪下载源码编译安装会成为Linux上的常见方式,毕竟这种就没有啥兼容的问题。回头也可以考虑试试。

        废话少说,首先在/etc/yum.repos.d下面新建一个local.repo文件,里面填上如下内容:

其中,[standard]这个我瞎取的名字下面,指向地址是CentOS8的光盘挂载位置,需要对应设定好,主要是一定要找着包含repodata文件夹的那个目录,如BaseOS下面就包含repodata。

centos lsblk统一单位 centos lspci_配置文件

  设定好以后把/etc/yum.repos.d下面除了local.repo的其他repo都搬走,因为上不了线,这些repo中指定的镜像地址也就失去了作用。然后在/etc/yum.repo.d目录下执行yum clean all和yum makecache,就算把标准的库挂上了。

        当然,也可以一并把下面这步做了:[pig]这个是我从在线系统中通过yumdoownloader --resolve弄下来的所有rpm存放的地方,我们要在这里自己构建一个支持SiLK安装的库:

centos lsblk统一单位 centos lspci_centos lsblk统一单位_02

        把所有下载的rpm放在/home/pig/share中,然后使用createrepo /hoe/pig/share命令造库。这里存在一种可能性,就是由于安装的CentOS的版本不同,有些情况下createrepo命令不可用,这时就只能下载

        在在线机上通过yumdownloader下载createrepo-0.9.9-28.el7.noarch.rpm包,在离线机上使用rpm -ivh createrepo-0.9.9-28.el7.noarch.rpm安装——因为这时还不能构建起可供yum使用的库依赖关系。

        完成造表后,基本上就构造起了离线环境——当然,后面还会离线方式安装epel、centos-release-scl-rh、cert-forensis-tools-release等repo库,总之,就是每当安装一个repo库, /etc/yum.repos.d/ 下面多了不是local.repo的repo库时,就需要把它们搬走,删掉/home/pig/share下面的repodata,然后重复createrepo、yum clean all、yum makecache的动作,用新安装的库来更新离线库里rpm的依赖关系。

centos lsblk统一单位 centos lspci_网络安全_03

centos lsblk统一单位 centos lspci_离线_04

三、SiLK工具安装

        离线环境构建好以后,就可以按照上面提到的SiLK官方文档进行安装了。只要在线系统与离线系统完全对准,下载的依赖包没有错误,这一步不会出现任何问题。 

      1. epel-release,因为SiLK的部分依赖需要epel库支持。

centos lsblk统一单位 centos lspci_网络安全_05

      2.安装centos-release-scl-rh

centos lsblk统一单位 centos lspci_配置文件_06

        3.安装cert-forensics-tools-release

        这里可以试一下tab键自动补全。如果自建库正确的话,yum是可以自动补全包名称的。

centos lsblk统一单位 centos lspci_数据_07

        4.安装libfixbuf silk-common silk-analysis silk-rwflowpack yaf

centos lsblk统一单位 centos lspci_数据_08

centos lsblk统一单位 centos lspci_数据_09

        实际上,到这一步在单机上可用的SiLK就基本安装完毕了,包括rwfilter、rwcut、rwstat、rwset等等核心的命令集都可以使用了。当然还可以按照官方指南接着往下装……

        5.安装libfixbuf-ipfixDump

centos lsblk统一单位 centos lspci_离线_10

        6.安装silk-flowcap,silk-rwflowappend,silk-rwreceiver,silk-rwsender,silk-rwpollexec

        到这里,我在CentOS7上做的包就开始出现问题了;然而真正在离线环境上安装的CentOS8使用的是同版本的CentOS8上做的包就一直顺利一直爽。所以,重要的事再说一遍,要准备完全相同的系统造库。

centos lsblk统一单位 centos lspci_离线_11

centos lsblk统一单位 centos lspci_数据_12

centos lsblk统一单位 centos lspci_离线_13

centos lsblk统一单位 centos lspci_网络安全_14

centos lsblk统一单位 centos lspci_网络安全_15

 7.yum install super_mediator analysis-pipeline

        官方文档中这2个工具在不匹配的环境下无论如何装不下去了。匹配的环境是能够安装的,所以不在这里贴图了。

 四、配置SiLK

      总的感觉,SiLK的安装不是困难的地方,配置才是真的艰难,如果不通读官方的各种文档,可能都难以发现问题到底出现在什么地方。

centos lsblk统一单位 centos lspci_配置文件_16

      如上,首先构造工作目录,如按照官方文档,这个目录是/var/silk,和/var/silk/data两级:一个用来放sensors.conf配置文件;一个用来放silk.conf配置文件,以及rwflowpacker生成的流统计信息数据。这2个目录非常重要,其中的配置文件也非常重要,通常是一切不能运转的错误的根源。

        当然,这个目录也可以设置在其它地方,因为rwflowpack的数据会放在里面,所以如果要处理的数据很多的话,还是需要指定一个较大的硬盘来存放的。

        1.配置silk.conf

        然后,如上图的最后一条指令:

cp /usr/share/silk/twoway-silk.conf /var/silk/data/silk.conf

        将双向数据流配对采集的模板拷贝到/var/silk/data/中,命名为silk.conf

         当然也可以拷贝其它的模板,但是一般就twoway了,如果不是有需求的特殊高端用户就照做好了,不要问我为什么,我也不知道为什么:)

        /var/silk/data/下的silk.conf一般是不需要做啥更改的,除了一样,就是如下图的class all里面的default-types,默认只有有限的几个,最好把上面的全加上。否则,当inblocks没有配置对的情况下,所有流被识别为ext2ext时,使用rwfilter --type=all ……查看数据,将什么结果都不会显示。

centos lsblk统一单位 centos lspci_网络安全_17

        2.配置sensors.conf

        /var/silk/下的sensors.conf 配置与主机地址、端口及twoway数据流识别的一些参数,需要在/var/silk/下新建,并如下配置:

centos lsblk统一单位 centos lspci_配置文件_18

   其中probe描述探针(主机信息),包括监听端口 18001,传输协议 tcp,主机监听地址 192.168.65.10(这个是我的虚拟机地址,要改哈)。这3个参数回头会在yaf命令中作为选项使用。probe的名字可以不用S0,用P0也行。

        group my-network主要标注内网网段,two-way模板用这个判断网络流的出入方向,默认配置的是A、C网段的公开内网地址。

        sensor配置传感器的名字,注意这里ipfix-probes需要和probe的名字对上,然后这里的internal-probes配置传感器所在的内网网段地址,比如我们是192.168.65.0/24。

        从这个角度看,似乎一个sensor底下是可以对应多个probe的,虽然我也没试过……

3.配置rwflowpack.conf

        在/etc/sysconfig/目录下,打开rwflowpack.conf。该配置文件已经配置了一些默认项,但也有一些是需要我们更改的,否则在systemctl start rwflowpack时会报错,启动失败。

        所有修改向如下:

        (1)设置非空值以使能rwflowpack

        

centos lsblk统一单位 centos lspci_网络安全_19

        (2)设置第1层工作目录,就是刚才我们建的/var/silk

 

centos lsblk统一单位 centos lspci_centos lsblk统一单位_20

        (3)把sensors.conf的位置告诉rwflowpack

 

centos lsblk统一单位 centos lspci_配置文件_21

        (4)把默认的syslog更换成legacy,我也不知道为啥

 

centos lsblk统一单位 centos lspci_配置文件_22

        (5)设置log的目录,注意这个目录可能并不存在,需要手工创建。

 

centos lsblk统一单位 centos lspci_网络安全_23

centos lsblk统一单位 centos lspci_网络安全_24

(6)注释掉这个参数,否则也会去找这个目录,找不到就会报错

centos lsblk统一单位 centos lspci_配置文件_25

        (7)哈哈,这个参数最为害人,总之在这里要设,rwflowpack靠这个指示存储输出数据。不过rwflowpack是知道了,但是它并不管rwfilter是不是知道。

 

centos lsblk统一单位 centos lspci_数据_26

    然后就可以启动服务了,可以通过netstat和systemctl status观察服务是否成功:

centos lsblk统一单位 centos lspci_网络安全_27

        成功的话,就可以使用yaf将pcap包发送给rwflowpack,使用如下命令,所有出现的参数都是在sensors.conf里面设置过的,文件是我自己找的一个wireshark抓包文件。

centos lsblk统一单位 centos lspci_配置文件_28

        运行如果没问题,rwflowpack会在前面设置的/var/silk/data中创建文件夹存放对应的数据,文件夹的名称和silk.confg中的class all的type类型一致。我的抓包文件中不存在于我配置的内网中,所以只有一个ext2ext的文件夹。所以,如果在silk.conf中哪一行没改,rwfilter --type=all参数默认是不包含ext2ext类型的,所以就看不到任何结果。

        (8)配置环境变量SILK_DATA_ROOTDIR

        看到这里,是不是隐隐有点什么不对劲的地方——前面我们说了rwflowpack知道/var/silk/data工作目录的地方,但是rwfilter不知道,那么rwfilter又是怎么从silk.conf中读出type的?事实情况是rwfilter真的读不出来,按照官方文件的解释,rwfilter认为默认的工作文件夹是/data。所以如果直接运行rwfilter的话,首先是出现如下告警:

centos lsblk统一单位 centos lspci_离线_29

        当然,也可以生创建一个/data目录并且拷贝一份silk.conf过去,但是如此rwflowpack在往/var/silk/data里面放数据,而rwfilter却试图从/data里面往外读就比较尴尬了。

        所以,还是老老实实把环境变量补上吧,修改/etc/profile,在尾巴后面加一行:

        export SILK_DATA_ROOTDIR=/var/silk/data

centos lsblk统一单位 centos lspci_配置文件_30

centos lsblk统一单位 centos lspci_网络安全_31

         重启,OK:

centos lsblk统一单位 centos lspci_数据_32