通过网络界面提高IDS / NMS:Mikrotik和Suricata

显然,我有这样的业力:无论我如何在开放源代码上实施某些服务,我肯定会找到一堆手册,在我的特定情况下,每本手册都将无法使用,现成的解决方案将无法启动或喜欢,否则还会发生什么-永不消化,最终您必须自己突破才能获得结果。

这次,所有手册都使用ELK5或更早的版本,但是我真的不想安装以前版本的软件。 我想在最有希望的支持期间获得该软件:最好是稳定版中的最新软件。

因此,为了能够在不重复将来所有麻烦的情况下重复完美的技艺,您必须编写我与您分享的循序渐进的备忘单。

因此,今天Mikrotik(RouterOS),Suricata 4.1,Elasticsearch + Filebeat + Kibana 6.5。

而不是加入


条款:

  • i386上的Mikrotik位于​​主机A上的虚拟机中。Mikrotik上的所有接口都分散在VLAN上,主机具有一个物理网络接口。
  • 具有单个物理网络接口的主机B上IDS / IPS / NMS的免费资源。
  • 20 MB的频道输出。
  • 希望接收有关通过Mikrotik外部接口传递的流量的分析数据。
  • 辣根卢布和无花果戈比的预算。
  • 一定的空闲时间可以避免麻烦。

在这里我不会谈论什么是IDS / IPS / NMS,为什么需要它以及会发生什么。 没有我,每个人都知道这一点,不知道的人会谷歌。

另外,我不会在Sno​​rt和Suricata之间做出选择以支持后者的理由。 这是一个品味问题。

但是从表面上解释它是如何工作的:

Suricata不知何故获得了流量。 共有三个选项:a)以串联模式将其传递给自己,b)从交换机端口接收流量的副本,以及c)分析带有流量的转储。 Suricata分析收到的流量,并根据分析结果提供有关在此流量中发现的数据。

Suricata可以使用JSON发布数据。 因此,具有结构化数据,它们可以被馈送到某个系统以进行处理,系统化,分析和可视化。
据我所知,对于数据的分析和可视化,如果不是该领域的专家,ELK堆栈就是完美的选择。 ELK堆栈最初由Elasticsearch,Logstash,Kibana组成。 现在,Beat已添加到其中(一系列接口程序,充当数据源与Logstash或Elasticsearch之间的中介)。 展望未来,我要说的是没有Logstash,因为Beat完美地将数据直接馈送到Elasticsearch,而Elasticsearch完美地吃了数据。 Elasticsearch将被咬的数据传输到Kibana(整个ELK堆栈的Web界面)。 Kibana使用Filebeat传递给他的模板,为用户提供了数据可视化功能,即所谓的Dashboards。 考虑到Elasticsearch,Logstash,Beat和Kibana是一个制造商的工作成果,因此整个农场之间相互联系良好,并且链接过程也有据可查的文档(当然,采用开源标准)。

因此,基于上述内容,任务可以描述如下:从路由器端口获取流量的副本,将其传输到Suricata,从Suricata接收JSON格式的数据,将其传输到Filebeat,然后依次将其传输到Elasticsearch和帮助Kibana创建了自己的视觉展示。

Mikrotik RouterOS


如果我拥有Mikrotik路由器硬件,那么端口镜像(端口镜像)的问题将根本不会解决。 一切都将通过启用通过外部接口传输到Mikrotik本身的任何自由端口的流量的镜像来决定。 如果Mikrotik上没有空闲端口,则可以在交换机上启用端口镜像。 但是在我的情况下,Mikrotik根本没有物理端口,而交换机上的端口从整个主机接收流量,除了Mikrotik之外,在该主机上还有更多虚拟机。

然后我再次心智地说:“谢谢你,Mikrotik!” 感谢RouterOS中的内置嗅探器。 传统上,我们没有截图,只有控制台命令。

在WinBox中打开终端并打开嗅探器:

/tool sniffer set filter-interface=if-out filter-stream=yes streaming-enabled=yes streaming-server=192.168.1.253
/tool sniffer start


而不是if-out表示要从中拦截流量的接口名称,而不是192.168.1.253-将通过TZSP发送拦截流量的计算机的IP地址。

随着Mikrotik'om所有。

苏里卡塔


总的来说,我不是Linux主管,所以我最喜欢pop发行版。 好吧,也许我喜欢较为禁欲的Debian。 所以我开始了。 好吧,当然,由于非Linux的限制,我也想从存储库中安装二进制文件。 组装对我来说总是很懒。 因此,如果可以选择Debian,请- 不要选择 。 我现在不记得在Debian之下将整个农场都安装在哪儿了,但他确实在。 以及有关在Ubunta下安装所有组件的整个后续故事。

创建了具有4 GB RAM的4核虚拟机,下载并安装了Ubuntu Server 18.04.1 LTS(x64)

协议 :所有进一步的操作均代表超级用户执行,因此,请以root用户身份登录或向每个命令添加sudo

由于我在每个阶段都制作了快照,然后反复回滚到快照,所以最终,由于虚拟机中的时间与实时不同步,我出现了许多故障。
因此,我们立即设置正确的时区和NTP同步:

systemctl start systemd-timesyncd
systemctl status systemd-timesyncd
dpkg-reconfigure tzdata


为确保在安装Suricata时没有依赖性问题,请将Universe信息库添加到/etc/apt/sources.list中

nano /etc/apt/sources.list
...
deb archive.ubuntu.com/ubuntu仿生主宇宙
deb archive.ubuntu.com/ubuntu仿生安全主宇宙
deb archive.ubuntu.com/ubuntu仿生更新主宇宙

我们还添加了存储库,我们将在其中获取Suricata:
add-apt-repository ppa:oisf/suricata-stable

更新软件包数据库:
apt-get update

安装Suricata:
apt-get install -y suricata

下一步是设置Suricata及其更新的规则:
apt-get install -y python-pip
pip install pyyaml
pip install https://github.com/OISF/suricata-update/archive/master.zip


我们开始更新suricata-update本身
pip install --pre --upgrade suricata-update

在没有其他配置的情况下运行将为我们提供“新兴威胁开放”规则集:
suricata-update

要查看来源列表,请执行以下操作:
suricata-update list-sources

更新规则源:
suricata-update update-sources

让我们看一下源代码中更新的内容,然后再次运行:
suricata-update list-sources

我们包含所有免费资源:
suricata-update enable-source ptresearch/attackdetection
suricata-update enable-source oisf/trafficid
suricata-update enable-source sslbl/ssl-fp-blacklist


再一次,我们更新规则:
suricata-update

Suricata已安装。

现在您需要获得流量。

特拉弗


Trafr是由Mikrotik编写的将TZSP流量转换为pcap的应用程序。 该应用程序是32位的,因此要启动它,您需要在64位Ubunta中启用对32位应用程序的支持:

dpkg --add-architecture i386
apt-get update && apt-get install -y libc6:i386


下载并解压缩trafr

wget http://www.mikrotik.com/download/trafr.tgz
tar xzf trafr.tgz


检查流量是否被捕获:

./trafr -s

这样启动后,图形模式下的符号输出在虚拟机的控制台中中断,我必须重新启动。 通过ssh远程连接到PuTTY没问题。

如果您在屏幕上看到不稳定的闪烁,则表明流量已到达, trafr捕获了该流量。 如果是这样, 请将trafr转移到永久居留权,并通过管道将捕获的流量立即传输到Suricata来运行它:

mv trafr /usr/local/bin/
/usr/local/bin/trafr -s | suricata -c /etc/suricata/suricata.yaml -r /dev/stdin


现在我们检查流量是否到达了苏里卡塔,为此,我们在邻近的终端中执行以下操作:

tail -f /var/log/suricata/fast.log

您应该看到有意义的文本的智能滚动条-接收猫鼬流量的日志。

确保Suricata流量不仅会收到,而且还会分析以下内容也是不可行的:

tail -f /var/log/suricata/eve.json

这正是来自Suricata的事件输出,我们将以JSON格式将其输出到Filebeat。

Elasticsearch + Filebeat + Kibana 6.5


我们安装使用弹性存储库所需的PGP密钥并安装必要的依赖项:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
apt-get update && apt-get install -y openjdk-8-jre apt-transport-https wget nginx


请注意,Java是版本8。不支持高于8的任何版本。 因此,如果您设法较早地安装了更新的Java,则将其拆除并放入8。

我们确保已安装Java:

java -version

我们大致得出以下结论:
Java版本“ 1.8.0_191”
Java(TM)SE运行时环境(内部版本1.8.0_191-b12)
Java HotSpot(TM)64位服务器VM(内部版本25.191-b12,混合模式)

创建用户和密码以访问Kibana。 代替管理员,选择您喜欢的东西:

echo "admin:`openssl passwd -apr1`" | sudo tee -a /etc/nginx/htpasswd.users

由于ELK将在localhost上旋转,因此在nginx中配置反向代理:

nano /etc/nginx/sites-available/kibana
服务器{
听80;

server_name suricata.server;

auth_basic“受限制的访问”;
auth_basic_user_file /etc/nginx/htpasswd.users;

位置/ {
proxy_pass localhost :5601;
proxy_http_version 1.1;
proxy_set_header升级$ http_upgrade;
proxy_set_header连接“升级”;
proxy_set_header主机$主机;
proxy_cache_bypass $ http_upgrade;
}
}

rm /etc/nginx/sites-enabled/default
ln -s /etc/nginx/sites-available/kibana /etc/nginx/sites-enabled/kibana


重新启动nginx:

systemctl restart nginx

我们把Elasticsearch:

apt-get install -y elasticsearch

加载操作系统时打开自动运行:

systemctl daemon-reload
systemctl enable elasticsearch.service


我们推出:

systemctl start elasticsearch.service

检查它是否上升:

curl -X GET "localhost:9200/"

根据您的硬件性能,启动ES可能需要一些时间。 如果我们拒绝连接 ,则只需重复该请求并等待,直到得到类似以下内容:
{
“名称”:“ lcZuxxm”,
“ Cluster_name”:“ elasticsearch”,
“ Cluster_uuid”:“ kmJHqJnlQe2Rk7F-CRi4EA”,
“版本”:{
“ Number”:“ 6.5.1”,
“ Build_flavor”:“默认”,
“ Build_type”:“ deb”,
“ Build_hash”:“ 8c58350”,
“ Build_date”:“ 2018-11-16T02:22:42.182257Z”,
“ Build_snapshot”:否,
“ Lucene_version”:“ 7.5.0”,
“ Minimum_wire_compatibility_version”:“ 5.6.0”,
“最低索引兼容性兼容性”:“ 5.0.0”
},
口号:您知道,要搜索
}

我们把Kibana放在:

apt-get install -y kibana

加载操作系统时打开自动运行:

systemctl daemon-reload
systemctl enable kibana.service


我们推出:

systemctl start kibana.service

现在您可以转到192.168.1.253 (当然,IP地址是使用猫鼬分配给您的计算机的IP地址)。 Kibana封面应打开。

我们把Filebeat放在:

apt-get install -y filebeat

加载操作系统时打开自动运行:

systemctl daemon-reload
systemctl enable filebeat


我们打开Suricata模块,它是Filebeat模块集的一部分:

filebeat modules enable suricata

在Elasticsearch中安装Suricata插件:

/usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-geoip
/usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-user-agent

参见UPD 2019年5月22日。

重新启动Elasticsearch:

systemctl restart elasticsearch.service

我们执行Filebeat的初始配置,同时将模板加载到Kibana中:

filebeat setup -e

我们验证Filebeat已找到/var/log/suricata/eve.json并对其进行处理,为此,请在数据输出模式下使用publish标记运行Filebeat:

filebeat -e -d "publish"

第一个是Filebeat本身的json格式输出,然后是其日志的简单文本输出,只有一小段时间来自Suricata的输出,因此请等待并确保一切正常。 之后,中止Filebeat并返回bash。

加载操作系统时打开自动运行:

systemctl daemon-reload
systemctl enable filebeat.service


运行Filebeat:

systemctl start filebeat.service

转到Kibana,从左侧菜单中选择“仪表板”,然后选择filebeat- *索引。 再次选择仪表板,从列表中选择[Suricata]警报概述 ,并应获得如下信息:

图片

选配


不要忘记进行logrotate,并且无论硬盘驱动器有多大容量,Suricata都会对其进行快速评分:

nano /etc/logrotate.d/suricata
/var/log/suricata/*.log /var/log/suricata/*.json
{
每周一次
旋转3
Missingok
无压缩
创造
共享脚本
后旋转
/ bin / kill -HUP`cat /var/run/suricata.pid 2> / dev / null` 2> / dev / null || 是真的
尾标
}

此外,有传言说有人经常在米克罗蒂克(Mikrotik)嗅探跑步状态的人停止提供交通。 然后,我们编写一个脚本来重新启动嗅探器并根据计划运行它:

/tool sniffer stop
:delay 30s
/tool sniffer start


结论


坦白说,我对上述捆绑包的稳定性不太满意。 即:值得重新启动,奇迹开始出现。 一次,除了一对夫妇,其他所有事物都停止了处理我的规则。 我必须重新安装所有内容。 第二次,Elasticsearch通常停止从Filebeat接收数据,并且必须回滚到状态快照,然后重新引导。

我还没有解决这些问题。

此外,还计划根据由Suricata识别出并转移到Mikrotik的恶棍的IP地址实施IPS。

UPD :不稳定的指控被放弃了。 我关于终止规则处理的结论是错误的。 实际上,重新启动后仪表板中为空的原因是由于Filebeat和Elasticsearch需要非常明显的时间来从meerkat解析一个数千兆字节的json文件。 如果打开包含事件的仪表板的时间段包括创建eve.json文件的日期,则可以看到图表的列在处理文件时如何增长。 警报与已处理的事件一起显示在相应的仪表板上。 此外,x86上RouterOS上的嗅探器从未挂过。

UPD 2019年5月22日 :从Elasticsearch 6.7版本开始,ingest-geoip和ingest-user-agent插件已转换为模块。 因此,将跳过安装它们的项目。

另外,升级时,您会遇到Elasticsearch启动错误。 您将在日志中看到错误:

预期的数据库[GeoLite2-ASN.mmdb]在[/ etc / elasticsearch / ingest-geoip]中不存在

为了恢复性能,我们执行:

/usr/share/elasticsearch/bin/elasticsearch-plugin remove --purge ingest-geoip

Source: https://habr.com/ru/post/zh-CN431600/


All Articles