Ubuntu 18.04上使用snort3搭建NIDS(三)| ELK可视化篇

Tallulah ·
更新时间:2024-09-21
· 788 次阅读

为最近项目上要用到snort3,但是找了很多博客都是snort2.9.x的安装与配置,所以只能靠着官网文档和自己的反复摸索来学习snort3相关的内容。后面将会把snort3相关的发一个系列的博客,这是第三篇,实现了snort3与ELK数据展示分析组件联动进行告警可视化。后续内容敬请期待,等我理清了思路就来~

往期回顾

Ubuntu 18.04上使用snort3搭建NIDS(一)| 安装篇
Ubuntu 18.04上使用snort3搭建NIDS(二)| 配置篇
在上一节中,经过配置,大概可以实现一个建议的网络入侵检测系统了,但是它对于检测到的潜在的攻击数据只是简单的进行记录、在输出的告警文件中提示。我们希望这个网络入侵检测系统可以有更为高效、清晰的展示功能,而ELK作为一款强大的数据分析展示组件,非常合适。所以我们要通过在服务器上部署ELK,来实现snort3告警数据可视化

服务器端ELK部署

前一阵阿里云搞活动,学生认证可以免费领半年的ECS,刚好现在用上。阿里云ECS提供了远程ssh登录的网页,但是感觉不是很舒服,所以我用的是XShell和Xftp,感觉用起来很方便,对于家庭和学校使用是免费的,在这里挂个官网链接,直接去下载就可以~
毕竟是免费的ECS,下载网速有限制,所以用ftp穿ELK组件就比较合适了。xftp和xshell使用是非常简单的,我就不过多展示了。ELK部署其实有很多大佬写的比较好的博客可以参考,我这里就简单写一下过程,以及这之中遇到的一些坑

部署Elasticsearch

首先要安装一下jdk1.8,安装前先要更新一下包列表,不然找不到

sudo apt update sudo apt install openjdk-8-jre-headless

把Elasticsearch解压,然后进入config目录,修改配置文件
vim elasticsearch.yml 我下载的是7.6.2版本的,默认的配置文件其实已经写好了但是全部注释掉了,找到相应的行改一下就好

#------------- Node -------------- node.name = node-1 #------------ Network ------------ network.host: 0.0.0.0 http.port: 9200 http.cors.enabled: true http.cors.allow-origin: "*" #----------- Discovery ---------- cluster.initial_master_nodes: ["node-1"]

改好之后保存,ELK有一个很奇葩的设定不能以root身份启动,所以需要新建一个用户

groupadd groupname useradd username -g groupname -p password su root #切换到elasticsearch的父路径下 chown -R groupname:username elasticsearch-7.6.2 su username cd elasticsearch-7.6.2/bin ./elasticsearch

这时Elasticsearch应该就可以启动了,可以通过服务器公网IP:9200在浏览器中访问
第一个坑
本来觉得设置好了之后就万事大吉了,但是Chrome提示说服务器拒绝了我们的访问请求。原因在于:阿里云ECS默认只允许ssh、ftp和icmp流量,我们需要到控制台开放相应的端口才可以。
在这里插入图片描述
我本着用哪个开哪个的原则只开放了9200(后面Kibana还要开放5601),如果嫌麻烦的话可以直接端口那里写**-1/-1开放全部端口**
在这里插入图片描述
至此ElasticSearch部署告一段落

部署Kibana

毕竟是同一个场出的东西,使用方法都差不多,解压后进入到config目录,然后修改kibana.yml文件

server.port : 5601 server.host : "0.0.0.0" elasticsearch.hosts : ["http://0.0.0.0:9200"]

其他的都不用管,直接启动就行
第二个坑
和之前一样,我切换到了新建的用户上去启动,但是提示说权限不足,简单的解决方案是用root或者普通用户加sudo执行./kibana --allow-root

在上述工作都做好之后,满心期待打开5601端口,只看到一行小字

Kibana server is not ready yet

第三个坑
回到Xshell,发现了满屏红色,虽然是warning,然而它运行不了啊,和error也没啥区别
在这里插入图片描述
再一看Elasticsearch那边,疯狂的提示

no known master mode, scheduling a retry

网上搜了一下,大概问题是没有设置主节点,所以返回到elasticsearch.yml里面,加上了一行

node.master : true

再重新运行,问题解决。成功后的kibana看起来是这样的
在这里插入图片描述

本地配置snort

打开之前配置好的snort.lua 在最下面(约224行),会看到configure outputs,按照下面的改一下就可以了

-- 7 configure outputs alert_csv= { file = true, } alert_json = { file = true, limit = 5, fields = 'timestamp pkt_num pkt_gen pkt_len src_addr src_port dst_addr dst_port proto ttl tos service rule sid rev msg priority action', }

这里的fields是输出告警文件中的字段,顺序可以自己改;limit的意义是如果输出的告警内容已经大于5MB了 就开始在新的文件中写入告警文件,也就是说每个告警文件最大为5MB
设置好之后运行一下试试看

snort -c LOCATION/snort.lua -l LOCATION/log/ -i NIC -s 65535 -k none -m 0x1b
字段 意义
-c LOCATION/snort/lua 指定snort使用的配置文件,LOCATION是snort安装位置
-l LOCATION/log/ 指定告警文件输出位置
-i NIC 指定要监听的网卡,NIC是网卡名
-s 65535 设置最大报文长度为65535 以免截断某些长报文
-k none 忽略校验和错误(若不设置,会自动drop校验和错误的数据包)
-m 0x1b 将输出文件的umask设为033

默认情况下snort的输出文件umask值为077,这样除了文件所有者之外其他用户无法读取,自然在后面用elk处理的时候会出现问题
所以改成033(000 011 011 也就是0x1b)

如果lua文件中没有写错的话,snort应该可以正常运行(如果提示有错的话,检查一下是不是json那里的字段名写错了)然后随便访问点什么东西(之前在第二篇中我们已经设立了一个对任意TCP流量都发出告警的规则)
按Ctrl+C退出,这个时候log文件夹中就可以看到alert_csv.txt和alert_json.txt文件

将数据发送到ELK服务器 配置Filebeat

之前写了很多,然后粘贴代码的时候卡住了,结果啥都没了又得重新写这段,心情就不是很美妙,可能会写的简略些
首先进入到filebeat的目录下,修改filebeat.yml文件,在input模块添加两个log类型,并将logstash output解除注释
(因为我们要用logstash对数据进行一些预处理再发上去,所以不用直接发到elasticsearch,上面elasticsearch outputs模块保持注释状态即可)

#============= Filebeat Inputs ============== - type: log paths: - /usr/local/etc/snort/log/alert_json.* fields: file_format: json source: snort3 enabled: true - type: log paths: - /usr/local/etc/snort/log/alert_csv.* fields: file_format: csv source: snort3 enabled: true #============= Logstah Outputs ============== output.logstash: hosts: ["http://`publc_ip_addr`:5044"]

其他内容保持默认不用管就可以了,然后运行一下filebeat

./bin/filebeat -c filebeat.yml -e

如果没什么问题 应该会看到这样的界面
在这里插入图片描述
然后满屏的提示

配置Logstash

本来我想的是不用Logstash,直接用Filebeat将文件传到服务器上,但是
在这里插入图片描述
这谁顶得住啊,还是用logstash处理一下再发吧
与其他几个组件不同的是,logstash的配置工作大多在.conf文件中完成,在config文件夹中给出了一个conf的示例文件,复制一下再做些改动就成

cp logstash-sample.conf snort_alert.conf vim snort_alert.conf input { beats { port => 5044 } } filter { if[fields][file_format] == "json" { json { source => "message" } } if[fields][file_format] == "csv" { csv { separator => ", " columns => ["time", "number", "proto", "pkt_gen", "pkt_len", "direction", "src_ap", "dst_ap", "rule", "action"] } } } output { if[fields][file_format] == "json" { elasticsearch { hosts => ["http://localhost:9200"] #再次提示我的logstash是放在接收端的 index => "snort3_json" } } if[fields][file_format] == "csv" { elasticsearch { hosts => ["http://localhost:9200"] #如果放在发送端需要把localhost改为服务器ip index => "snort3_csv" } } stdout{} #正常状态下logstash运行成功后不会出现新的提示, #不方便判断是否成功,加一个stdout会把他收到的东西显示在终端上 #方便确定当前是否运行成功 }

保存好之后通过下面的命令来运行

./bin/logstash -f config/snort_alert.conf

启动成功后,在snort告警文件有变动之前,应该会一直显示为下图这样
在这里插入图片描述

发送测试数据

打开snort,继续用上文中的方式来产生一个告警文件,由于之前logstash上我们设置了回显,所以现在判断是否成功最简单的办法就是看logstash这边有没有出现大段大段的信息,像这样:
在这里插入图片描述

如果有,就差不多了,我们再来到ELK服务器这边,可以看到已经出现了相应的索引

在这里插入图片描述


作者:CollinXia



elk ubuntu

需要 登录 后方可回复, 如果你还没有账号请 注册新账号