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

为最近项目上要用到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服务器这边,可以看到已经出现了相应的索引

在这里插入图片描述

发布了5 篇原创文章 · 获赞 5 · 访问量 254

猜你喜欢

转载自blog.csdn.net/qq_42768012/article/details/105434737