前言
最近在整理网络安全方面的问题,服务器由于是部署在微软云的原因,所以在微软云中了解到了网络监察程序相关的内容,它使用的是suricata + ELK来进行网络流量的监察,在查找suricata的过程,我发现国内suricata方面的资源太少,以至于花了一些时间才明白是如何进行搭建的。(其实就是菜 = =|||)
本文章搭建的环境为Ubuntu OS
,使用的suricata是直接使用apt install
方式安装。
由于在微软云上直接看网络监察程序那页实在是没说明白,直接跟着操作会有一些问题存在,所以ELK的组件我是直接使用官网提供的压缩包运行。
其中参考了一位同行的文章,以此参考总结了下这方面的内容。
参考文章
话不多说,让我们开始搭建吧~~
搭建环境
安装suricata
本文章介绍的是Ubuntu OS安装方式,如果需要使用源码包安装或者Centos OS安装等等,可以参考suricata官网文档来进行安装
suricata 官网
# 下载依赖库
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt update
# 安装suricata 以及 json解析器jq
sudo apt install suricata jq
出现的问题
使用
sudo add-apt-repository ppa:oisf/suricata-stable
出现问题
- sudo apt update
- sudo apt-get install software-properties-common
- sudo add-apt-repository ppa:oisf/suricata-stable 搞定!
查看安装状态
sudo suricata --build-info
# 查看suricata运行状态
sudo systemctl status suricata
suricata 基本信息配置
suricata的相关目录位置
配置信息目录 /etc/suricata/
日志目录 /var/log/suricata/
规则文件目录 /var/lib/suricata/rules
检查当前网卡信息
ip addr
从图中看出,我们的网卡名称是eth0, ip地址是172.17.16.11
进入suricata.yaml
配置文件
sudo vim /etc/suricata/suricata.yaml
我们可以看到文件的开头部分有段ip范围
vars:
# more specific is better for alert accuracy and performance
address-groups:
HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]"
其中配置文件中已经包含了RFC 1918相关的网络(具体可以参考suricata相关文档)
例如: 10.0.0.23 已经包含在10.0.0.0/8网段,如果没有其他网络使用则可以将其从配置文件中移除
简单来说就是只需要配置我们当前所处的网关地址即可,也就是172.16.0.0/12,其他可以去掉(因为我的ip是172.17.16.11
接下来可以看到suricata.yaml
中日志文件相关的配置(别跟我说你不会搜索 > . <)
即可在配置中配置自定义suricata日志文件目录地址
其中有三个日志文件
- suricata.log suricata启动过程相关日志,确保suricata正常运行
- stats.log 查看统计信息的日志文件
- fast.log 测试suricata的IDS功能(入侵检测),可以使用rules进行测试,rules触发之前,我们可以使用tail -f查看fast.log
- eve.json 更高级的输出,如果要使用直观的输出来查看这个日志,可以使用
sudo tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="alert")'
接下来是记录日志的频率
记录日志的日志名称
更改af-packet的网络名称
我面前面说到我们的网卡名称是eth0
fa-packet是啥?他是linux的核心功能,类似于接收来自网络的数据包的接口。
底下的pcap也顺便改改
更新规则rules
规则是啥,简单来说就是suricata通过这一系列的rules来对从网络获取的网络包进行分析,从而检出网络包的行为。
相关详细内容可以查看suricata官方文档。
通过配置文件suricata的default-rule-path
配置中规则目录,rule-files
选择启用哪些规则
更新规则集合来源库
这个方式我是参考微软云网络监察程序那章直接下载suricata的一些规则集的,也可以使用suricata update
来更新规则集(这种方式百度会有,这里不再详述)。
# 下载规则集
wget https://rules.emergingthreats.net/open/suricata/emerging.rules.tar.gz
# 将其解压到/etc/suricata
sudo tar -zxvf emerging.rules.tar.gz -C /etc/suricata
由于suricata默认配置是将规则配置在/var/lib/suricata/rules
下,我们需要修改下suricata.yaml中的配置
并且将下载后解压的规则集中的某些需要的规则文件也配置到suricata.yaml中。
将所有原本警告的规则集调整成彻底丢弃包
如果没有这样做,多数的危险行为还是会被放行,所以我们直接丢弃所有的危险行为。
建立一个将警告转换成丢弃包的调整设定文件:
sudo touch /etc/suricata/modify.conf
编辑modify.conf
sudo vim /etc/suricata/modify.conf
在这个设定文件中,将所有的警告替代为直接的制止行为
re:. ^alert drop
注意:
更新规则集时,请关闭suircata
因为规则集中有恶意程序的特征
会被suricata自己阻挡掉,导致更新失败
更新规则集
sudo suricata-update --modify-conf /etc/suricata/modify.conf
如果全部都阻挡,可能会带来一些困扰
可以不要将所有规则集合进行合并(suricata-update会将所有的规则集合合并到suricata.rules中),直接将需要的rules文件通过配置文件进行配置。
sudo suricata-update --modify-conf /etc/suricata/modify.conf --no-merge
这样suricata就会读取需要的规则文件,而不是单单一个suricata.rules
。
重新启动suricata
sudo systemctl restart suricata
检查suricata启动日志
sudo tail /var/log/suricata/suricata.log
看到这条信息出现代表正常运行
<Notice> - all 4 packet processing threads, 4 management threads initialized, engine started.
检查每8秒更新一次的统计日志
sudo tail -f /var/log/suricata/stats.log
检查警报是否正常触发
观察警报状态
sudo tail -f /var/log/suricata/fast.log
我在suricata.yaml中配置了icmp协议的警报文件,则我是用另一个计算机进行ping命令时,就能在fast.log中看到警报信息
用漂亮的json格式看到警报
sudo tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="alert")'
将suricata设置为IPS(入侵防御系统)
预设的suricata运行时并不是以入侵防御系统(IPS)运行的,而是以入侵检测系统(IDS)运作的。
所以真正遇到某种攻击时,也只会发出警告。
所以我们需要对suricata做出一些改变。
修改参数脚本
sudo vim /etc/default/suricata
这个脚本会定义suircata会用IDS(只有警告)或者IPS(警告+防御)来执行。
将这段:
LISTENMODE=af-packet
修改为:
LISTENMODE=nfqueue
这样就能从IDS转变为IPS了.他就能在NFQUEUE中等待流量传入。
NFQUEUE的作用
NFQUEUE是什么?他是linux的一个核心功能,这个功能简单来说就是将网络中流入系统的网络包,给普通的应用程序进行检查和调整。它是iptables和ip6tables的一种target,用于将数据包委托给用户态应用程序裁决如何处理数据包。
相当于
sequenceDiagram
网络 ->> NFQUEUE ->> 计算机
特别注意
如果没有程序在NFQUEUE中运行时,就算将没办法连接网络
所以步骤一定不能乱,否则会连接不上计算机。(我在测试的时候步骤乱了导致iptables把我的SSH客户端给墙了,无法连接这个计算机…)
设置suricata为IPS
修改参数脚本
sudo vim /etc/default/suricata
这个脚本会定义suircata会用
启动suricata在NFQUEUE中运作
参数q表示suricata 在 NFQUEUE中运行
参数0是因为NFQUEUE可以有几条通道,0表示第0条通道,也就是预设的通道。
参数D代表后台运行
将网路切换为NFQUEUE
确保suricata能正常运行之后,就可以将网络切换到NFQUEUE
如果想要过滤从外部网络到我们的计算机的网络流量,请输入一下命令
sudo iptables -I INPUT -j NFQUEUE
如果想要过滤我们从内部网络向外部流动的流量,请输入这个
如果IPS误判的时候,可能自己会被自己的IPS挡住,无法将讯息传出
sudo iptables -I OUTPUT -j NFQUEUE
检查防火墙配置状态
检查iptables
是否存储刚刚的配置
sudo iptables -vnL
如果网络无法连上,可以重置iptables的防火墙设定
sudo iptables -F
正确关闭IPS
由于刚刚设置了NFQUEUE,如果要正确关闭IPS,要先关闭NFQUEUE
清楚防火墙规则
sudo iptables -F
关闭suricata
# 寻找suricata的PID
sudo ps -aux |grep suricata
# 关闭suricata 的PID
sudo kill -15 suricata的PID
我们可以为以上命令创建suricata的启动和关闭脚本
启动脚本suricata-start.sh(不要写错,否则执行错误可能会访问不了计算机了)
這是参考做法,请不要未经评估贸然使用,造成损失概不负责(我自己是用的很开心)
sudo suricata -c /etc/suricata/suricata.yaml -q 0 &
sudo iptables -I INPUT -j NFQUEUE
关闭脚本suricata-stop.sh
sudo killall sudo suricata -q 0
while true
do
sudo iptables -D INPUT -j NFQUEUE > /dev/null 2>&1 || break
done
之后启动suricata,使用以上两个脚本即可。
下一篇将会介绍ELK相关的搭建 ELK搭建