1 引言
最近有一个工作任务,需要利用Suricata作为IDS来检测出口流量,同时利用ELK进行数据的展示。看了很多suricata+elk进行流量监测的文章,但是都不太符合要求。
2 部署架构
整个架构如下表所示,有台机器装suricata用于分析流量,并装elk负责数据展示,后面数据量太大可能涉及elk集群,这里先不做考虑,仅仅自己实验。
机器 | 部署内容 | IP |
---|---|---|
流量分析和数据展示机器,称之为ids主机 | ELK数据展示+suricata分析流量 | 多个集群 |
流量收集集群 | 抓取集群流量 | 10.0.0.1 |
这个架构我们提供两种流量分析模式。
一种为在线模式:正常做法都是利用镜像流量,将所有集群抓取到的流量镜像到suricata机器,suricata实时在线处理这些流量,再elk展示出来。
二离线模式:但是因为机器是部署在阿里云上的,因此做镜像流量较困难,当然采用Amazon VPC功能可以实现镜像流量,如 VPC Traffic Mirroring 构建网络入侵检测系统文章,这里我们没有购买此产品,初步架构部署为离线模式。即流量收集集群将抓取的流量文件推送到suricata主机上,suricata -r分析流量文件包,产生log日志,然后elk将log数据展示出来。
3 环境部署
3.1 suricata部署
suricata的安装教程看前文,安装好suricata后,然后按照官网suricata+elk部署指南配置相关支持Elk属性即可。
3.1.1 确认suricata安装了libjansson
如下查看配置信息,确认 libjansson support:为yes即可
$ suricata --build-info
This is Suricata version 2.0 RELEASE
Features: NFQ PCAP_SET_BUFF LIBPCAP_VERSION_MAJOR=1 AF_PACKET HAVE_PACKET_FANOUT LIBCAP_NG LIBNET1.1 HAVE_HTP_URI_NORMALIZE_HOOK HAVE_NSS HAVE_LIBJANSSON
...
libnss support: yes
libnspr support: yes
libjansson support: --> yes <--
Prelude support: no
PCRE jit: no
libluajit: no
libgeoip: yes
Non-bundled htp: yes
Old barnyard2 support: no
CUDA enabled: no
...
3.1.2 修改配置文件
修改配置文件suricata.yaml如下
# "United" event log in JSON format
- eve-log:
enabled: yes
type: file #file|syslog|unix_dgram|unix_stream
filename: eve.json
# the following are valid when type: syslog above
#identity: "suricata"
#facility: local5
#level: Info ## possible levels: Emergency, Alert, Critical,
## Error, Warning, Notice, Info, Debug
types:
- alert
- http:
extended: yes # enable this for extended logging information
- dns
- tls:
extended: yes # enable this for extended logging information
- files:
force-magic: yes # force logging magic on all logged files
force-md5: yes # force logging of md5 checksums
#- drop
- ssh
- smtp
- flow
3.2 安装ES
3.2.1 需要java 1.8 环境
ES安装需要java1.8环境,因此需要先检查主机是否有java1.8环境。
http://www.justdojava.com/2019/08/11/elk-install/
(1)查看java版本:
which java
whereis java
java -version
(2)卸载旧版本(这里注意centos7自带的是1.8的jre,需要卸载掉/或者yum -y install java-1.8.0-openjdk安装的也仅仅是jre)
[root@ids0001 ~]# find / -name java
/etc/pki/ca-trust/extracted/java
/etc/pki/java
/etc/alternatives/java
/etc/java
/var/lib/alternatives/java
/usr/bin/java
/usr/lib/java
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre/bin/java
/usr/share/elasticsearch/jdk/bin/java
/usr/share/java
sudo rm -rf /etc/pki/ca-trust/extracted/java
sudo rm -rf /etc/pki/java
sudo rm -rf /etc/alternatives/java
sudo rm -rf /etc/java
sudo rm -rf /var/lib/alternatives/java
sudo rm -rf /usr/bin/java
sudo rm -rf /usr/lib/java
sudo rm -rf /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre/bin/java
sudo rm -rf /usr/share/elasticsearch/jdk/bin/java
sudo rm -rf /usr/share/java
(3)安装1.8版本java
执行下面命令进行安装1.8jdk。这里有个地方要注意,要选择 要带有-devel的安装,因为这个安装的是jdk,而那个不带-devel的安装完了其实是jre。
yum install -y java-1.8.0-openjdk-devel.x86_64
java -version
(4)修改环境变量
vi /etc/profile#修改JAVA_HOME为jdk目录
echo $JAVA_HOME#查看环境变量
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.el7_9.x86_64
让profile文件立即生效 ,1.8java安装成功
[root@ids0001 ~]# source /etc/profile
3.2.2安装
sudo wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.0-x86_64.rpm
rpm -ivh elasticsearch-7.8.0-x86_64.rpm
安装目录: 一般是装在/usr/share/elasticsearch/下。
报错1:
解决办法:删除其他版本的java
find / -name java
版本太低 ,都删除,
sudo rm -rf /opt/jdk1.7.0_79/
sudo rm -rf /opt/jdk1.8.0_60/
3.2.3设置data的目录
创建/data/es-data目录,用于elasticsearch数据的存放
mkdir -p /data/es-data
修改该目录的拥有者为elasticsearch
chown -R elasticsearch:elasticsearch /data/es-data
3.2.4设置log的目录
创建/data/es-log目录,用于elasticsearch日志的存放
mkdir -p /log/es-log
修改该目录的拥有者为elasticsearch
chown -R elasticsearch:elasticsearch /log/es-log
3.2.5 修改配置文件elasticsearch.yml
vim /etc/elasticsearch/elasticsearch.yml
egrep -v "^#|^$" /etc/elasticsearch/elasticsearch.yml#查看配置
#设置data存放的路径为/data/es-data
path.data: /data/es-data
#设置logs日志的路径为/log/es-log
path.logs: /log/es-log
#设置内存不使用交换分区
bootstrap.memory_lock: false
#配置了bootstrap.memory_lock为true时反而会引发9200不会被监听,原因不明
#设置允许所有ip可以连接该elasticsearch
network.host: 0.0.0.0
#开启监听的端口为9200
http.port: 9200
#节点名称
node.name: node-1
#增加新的参数,为了让elasticsearch-head插件可以访问es (5.x版本,如果没有可以自己手动加)
http.cors.enabled: true
http.cors.allow-origin: "*"
3.2.6启动elasticsearch
sudo systemctl start elasticsearch#启动
出错1:
solution:配置文件加下面代码:
bootstrap.system_call_filter: false
cluster.initial_master_nodes: ["node-1"]
查看状态
systemctl status elasticsearch
设置开机启动
systemctl enable elasticsearch
启动成功之后,测试服务是否开启
curl -X GET http://localhost:9200
3.2.7 卸载
yum remove elasticsearch
sudo rm -rf /var/lib/elasticsearch/
sudo rm -rf /etc/elasticsearch
3.3 logStash
3.3.1 下载安装
sudo wget https://artifacts.elastic.co/downloads/logstash/logstash-7.8.0.rpm
rpm -ivh logstash-7.8.0.rpm
3.2.2设置data的目录
创建/data/ls-data目录,用于logstash数据的存放
mkdir -p /data/ls-data
修改该目录的拥有者为logstash
chown -R logstash:logstash /data/ls-data
3.3.3设置log的目录
创建/data/ls-log目录,用于logstash日志的存放
mkdir -p /log/ls-log
修改该目录的拥有者为logstash
chown -R logstash:logstash /log/ls-log
3.3.4设置conf.d的目录,创建配置文件
#进入logstash目录
cd /etc/logstash
#创建conf.d的目录
mkdir conf.d
创建配置文件,日志内容输出到elasticsearch中,如下所示
vim /etc/logstash/conf.d/logstash.conf
vi /etc/logstash/conf.d/logstash.conf
chown root /etc/logstash/conf.d/logstash.conf
logstash.conf 文件内容如下:注意其中的path为suricata日志:/var/log/suricata/eve.json
input {
file {
path => ["/var/log/suricata/eve.json"]
codec => json
}
}
filter {
}
output {
elasticsearch {
hosts => "127.0.0.1:9200"
index => "suricata-%{+YYYY.MM.dd}"
}
}
3.3.5修改配置文件logstash.yml
vim /etc/logstash/logstash.yml
内容如下:
# 设置数据的存储路径为/data/ls-data
path.data: /data/ls-data
# 设置管道配置文件路径为/etc/logstash/conf.d
path.config: /etc/logstash/conf.d
# 设置日志文件的存储路径为/log/ls-log
path.logs: /log/ls-log
3.3.6启动logstash
启动logstash命令如下,注意该命令不会指定配置文件启动。
systemctl start logstash
查看
systemctl status logstash
设置开机启动
systemctl enable logstash
3.3.7 测试logstash
–config.test_and_exit表示,检查测试创建的logstash.conf配置文件,是否有问题,如果没有问题,执行之后,显示Configuration OK 证明配置成功!
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf --config.test_and_exit
**如果报错:WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using –path.settings. **
解决办法:
cd /usr/share/logstash
ln -s /etc/logstash ./config
测试成功!
3.3.8 logstash指定配置进行运行
指定logstash.conf配置文件,以后台的方式运用,执行这段命令之后,需要回车一下
nohup /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf &
检查logstash是否启动
ps -ef|grep logstash
显示如下信息,说明启动了
3.3.9 卸载
sudo rm -rf /etc/default/logstash \
/etc/logstash \
/var/lib/logstash \
/var/log/logstash \
/usr/share/logstash \
/usr/share/kibana/x-pack/plugins/logstash \
/usr/share/kibana/x-pack/plugins/monitoring/public/components/logstash \
/usr/share/kibana/x-pack/plugins/monitoring/public/components/metricbeat_migration/instruction_steps/logstash \
/usr/share/kibana/x-pack/plugins/monitoring/public/lib/logstash \
/usr/share/kibana/x-pack/plugins/monitoring/public/views/logstash \
/usr/share/kibana/x-pack/plugins/monitoring/server/lib/logstash \
/usr/share/kibana/x-pack/plugins/monitoring/server/lib/metrics/logstash \
/usr/share/kibana/x-pack/plugins/monitoring/server/routes/api/v1/logstash
3.3.10
找错,查看logstash运行日志
systemctl status logstash -l
3.4 kibana
3.4.1 安装
sudo wget https://artifacts.elastic.co/downloads/kibana/kibana-7.8.0-x86_64.rpm
rpm -ivh kibana-7.8.0-x86_64.rpm
搜索rpm包
rpm -ql kibana
默认是装在/usr/share/kibana/下。
3.3.2修改kibana.yml
修改kibana的配置文件
vi /etc/kibana/kibana.yml
内容如下:
#kibana页面映射在5601端口
server.port: 5601
#允许所有ip访问5601端口
server.host: "0.0.0.0"
#elasticsearch所在的ip及监听的地址
elasticsearch.hosts: ["http://localhost:9200"]
3.4.3启动kibana
systemctl start kibana #启动
systemctl status kibana#查看状态
systemctl enable kibana#设置开机启动
kibana启动成功的界面
3.4.4 卸载
yum remove kibana
find / -name kibana
sudo rm -rf /etc/kibana \
/var/lib/kibana \
/usr/share/elasticsearch/modules/kibana \
/usr/share/kibana \
/usr/share/logstash/modules/fb_apache/configuration/kibana \
/usr/share/logstash/modules/netflow/configuration/kibana \
/usr/share/logstash/x-pack/modules/arcsight/configuration/kibana \
/usr/share/logstash/x-pack/modules/azure/configuration/kibana
3.5 相关配置总结
##suricata
/var/log/suricata/ #日志目录
##elk日志目录log:
tail -n 20 /var/log/messages
##ES:/usr/share/elasticsearch
/usr/share/elasticsearch/bin/elasticsearch#安装目录
egrep -v "^#|^$" /etc/elasticsearch/elasticsearch.yml
vi /etc/elasticsearch/elasticsearch.yml
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
##logstash:
/usr/share/logstash/bin/logstash#安装目录
path.data: /var/lib/logstash
pipeline.ordered: auto
path.logs: /var/log/logstash
egrep -v "^#|^$" /etc/logstash/conf.d/logstash.conf
/etc/logstash/logstash.yml
##kibana:
/usr/share/kibana/bin/kibana#安装目录
egrep -v "^#|^$" /etc/kibana/kibana.yml
4 在线模式部署
在线模式部署:即suricata实时处理其他机器镜像过来的流量。然后elk进行数据化展示。
依次开启kibana elasticsearch logstash,这里需要注意的是logstash不能采用默认开启方式systemctl start logstash,因为默认配置不加载/etc/logstash/conf.d/logstash.conf文件,则加载不成功suricata日志。具体命令如下:
systemctl start kibana logstash elasticsearch
systemctl start logstash#错误开启,不会加载配置文件/etc/logstash/conf.d/logstash.conf
nohup /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf & #指定配置文件开启logstash 正确操作
sudo nohup /usr/local/bin/suricata -c /etc/suricata/suricata.yaml -i eth0 --init-errors-fatal & #启动suricata
开启成功后,访问kibina,可以看到suricata日志数据。
5 离线模式部署
5.1 suricata分析流量包功能
分析单个包:suricata -r pcap文件名 -l 自定义输出位置
分析文件夹里所以的包:suricata -r pcap文件夹名 -l 自定义输出位置
sudo /usr/local/bin/suricata -c /etc/suricata/suricata.yaml -r /tmp/test.cap -l /var/log/suricata/cap
5.2 离线模式工作原理
离线模式工作原理:离线一词即,流量收集集群将抓取的流量scp定时发送到ids主机,然后ids主机定时启动suricata -r分析cap流量文件,然后推送到elk进行展示。该过程涉及两个部分。其中定时采用linux的crontab。
(1)流量收集集群定时推送流量文件到ids主机
定时推送流量到ids主机脚本send.sh如下:
#!/bin/bash
scp -Rf /root/testdir/ wasadmin@10.127.40.25:/root/temp/#复制到ids文件夹/root/temp/
rm -rf /root/testdir/*#删除该主机文件夹下的所有文件
(2)ids主机定时分析
ids主机定时分析脚本如下suricara.sh:
suricata -c /etc/suricata/suricata.yaml -r /root/temp/
rm -rf /root/temp/*
定时执行suricara.sh,在终端输入以下命令:
crontab -e
在显示的文件末尾添加以下规则:#每5分钟运行一次time.sh脚本,并把错误和正确的日志都存到/tmp/load.log上。
*/5 * * * * /root/time.sh > /tmp/load.log 2>&1
编辑完成,保存完成以后,就会显示以下提示信息:
crontab: installing new crontab
这就说明正在安装新的定时任务,如果没有这条提示信息,请重新运行crontab -e
命令。
错误解决
1 先执行命令 free -m查看内存是不是还有 最主要的是 看有没有交换空间 swap
2 创建swapfile:dd if=/dev/zero of=swapfile bs=1024 count=500000
3 将swapfile设置为swap空间 mkswap swapfile
4 启用交换空间 swapon swapfile ( 删除交换空间是swapoff swapfile )
free -m
dd if=/dev/zero of=swapfile bs=1024 count=500000
mkswap swapfile
swapon swapfile
free -m
参考
elk部署教程 简单清晰