如何在Rocky Linux 8上使用Suricata和Elastic Stack构建SIEM

介绍

本系列中的先前教程指导您安装、配置和运行Suricata作为入侵检测(IDS)和入侵预防(IPS)系统。您还学习了关于Suricata规则以及如何创建自己的规则。

在本教程中,您将探索如何将Suricata与Elasticsearch、Kibana和Filebeat集成,开始使用Elastic Stack和Rocky Linux 8创建自己的安全信息与事件管理(SIEM)工具。SIEM工具用于收集、聚合、存储和分析事件数据,以搜索网络和服务器上的安全威胁和可疑活动。

构建您自己的SIEM所使用的组件包括:

  • Elasticsearch 用于存储、索引、关联和搜索来自Suricata服务器的安全事件。
  • Kibana 用于显示和浏览存储在Elasticsearch中的安全事件日志。
  • Filebeat 用于解析Suricata的eve.json日志文件,并将每个事件发送到Elasticsearch进行处理。
  • Suricata 用于扫描您的网络流量以寻找可疑事件,并记录或丢弃无效数据包。

首先,您需要安装和配置Elasticsearch和Kibana,并进行一些特定的身份验证设置。然后,您需要将Filebeat添加到Suricata系统中,以将其eve.json日志发送到Elasticsearch。

最后,您需要学习如何使用SSH和Web浏览器连接到Kibana,然后加载并与显示Suricata事件和警报的Kibana仪表板进行交互。

先决条件

如果您一直在关注本教程系列,那么您应该已经在Rocky Linux服务器上运行了Suricata。此服务器将被称为您的Suricata服务器

您还需要第二台服务器来托管Elasticsearch和Kibana。此服务器将被称为您的Elasticsearch服务器。它应该是一台Rocky Linux 8服务器,具有:

为了本教程的目的,两个服务器都应该能够使用私有IP地址进行通信。您可以使用像WireGuard这样的VPN连接您的服务器,或者使用具有主机之间私有网络的云提供商。您还可以选择在同一台服务器上运行Elasticsearch、Kibana、Filebeat和Suricata进行实验。

步骤1 — 安装Elasticsearch和Kibana

本教程的第一步是在Elasticsearch服务器上安装Elasticsearch和Kibana。要开始,请使用以下命令将Elastic GPG密钥添加到您的服务器:

  1. sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

接下来,在/etc/yum/yum.repos.d目录中创建一个elasticsearch.repo文件,并使用vi或您喜欢的编辑器添加以下内容。这样可以确保在通过yum安装新包时使用上游Elasticsearch存储库:

  1. sudo vi /etc/yum.repos.d/elasticsearch.repo
/etc/yum.repos.d/elasticsearch.repo
[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md

如果您使用vi,当您完成更改时,按ESC然后输入:x以将更改写入文件并退出。

现在使用dnf命令安装Elasticsearch和Kibana。按Y接受任何关于GPG密钥指纹的提示:

  1. sudo dnf install --enablerepo=elasticsearch elasticsearch kibana

--enablerepo选项用于覆盖/etc/yum.repos.d/elasticsearch.repo文件中的默认禁用设置。这种方法确保在安装其他软件包更新到您的服务器时,不会意外升级Elasticsearch和Kibana软件包。

安装完软件包后,使用ip address show命令找到并记录服务器的私有IP地址:

  1. ip -brief address show

您将收到以下输出:

Output
lo UNKNOWN 127.0.0.1/8 ::1/128 eth0 UP 159.89.122.115/20 10.20.0.8/16 2604:a880:cad:d0::e56:8001/64 fe80::b832:69ff:fe46:7e5d/64 eth1 UP 10.137.0.5/16 fe80::b883:5bff:fe19:43f3/64

此输出中突出显示的是私有网络接口eth1设备,具有IPv4地址10.137.0.5。您的设备名称和IP地址可能不同。无论您的设备名称和私有IP地址是什么,该地址都将来自以下保留的地址块:

  • 10.0.0.010.255.255.255(10/8前缀)
  • 172.16.0.0172.31.255.255(172.16/12前缀)
  • 192.168.0.0192.168.255.255(192.168/16前缀)

如果您想了解更多关于这些地址块如何分配的信息,请访问RFC 1918规范

记录您的Elasticsearch服务器的私有IP地址(在本例中10.137.0.5)。此地址将在本教程的其余部分中称为your_private_ip。还注意网络接口的名称,在本例中为eth1。在本教程的下一部分中,您将配置Elasticsearch和Kibana以侦听来自您的Suricata服务器的私有IP地址的连接。

第2步 – 配置Elasticsearch

默认情况下,Elasticsearch配置为仅接受本地连接。此外,它没有启用任何身份验证,因此Filebeat等工具无法将日志发送到它。在本教程的本节中,您将配置Elasticsearch的网络设置,然后启用Elasticsearch的内置xpack安全模块。

配置Elasticsearch网络

由于您的Elasticsearch和Suricata服务器是分开的,因此您需要配置Elasticsearch以侦听其私有网络接口上的连接。

使用vi或您喜欢的编辑器打开/etc/elasticsearch/elasticsearch.yml文件:

  1. sudo vi /etc/elasticsearch/elasticsearch.yml

在第50至60行之间找到被注释掉的#network.host: 192.168.0.1行,并在其后添加一行配置network.bind_host设置的新行,如下所示:

# 默认情况下,Elasticsearch仅在本地主机上可访问。在此处设置一个不同的
# 地址以在网络上公开此节点:
#
#network.host: 192.168.0.1
network.bind_host: ["127.0.0.1", "your_private_ip"]
#
# 默认情况下,Elasticsearch会在第一个空闲端口上监听HTTP流量
# ,从9200开始找到。在此处设置特定的HTTP端口:

将您的私有IP替换为your_private_ip地址。此行将确保Elasticsearch仍然在其本地地址上可用,以便Kibana可以访问它,同时也在服务器的私有IP地址上可用。

接下来,使用vi快捷键SHIFT+G到达文件末尾。

在文件末尾添加以下突出显示的行:

. . .
discovery.type: single-node
xpack.security.enabled: true

discovery.type设置允许Elasticsearch作为单节点运行,而不是在其他Elasticsearch服务器集群中运行。xpack.security.enabled设置打开了Elasticsearch附带的一些安全功能。

编辑完成后保存并关闭文件。

最后,添加防火墙规则以确保您的Elasticsearch服务器可以通过其私有网络接口访问。如果您按照先决条件教程并使用firewalld,请运行以下命令:

  1. sudo firewall-cmd --permanent --zone=internal --change-interface=eth1
  2. sudo firewall-cmd --permanent --zone=internal --add-service=elasticsearch
  3. sudo firewall-cmd --permanent --zone=internal --add-service=kibana
  4. sudo systemctl reload firewalld.service

在第一个命令中,将您的私有网络接口名称替换eth1。该命令将接口规则更改为使用内部Firewalld区域,这比默认的公共区域更宽松。

接下来的命令将添加允许Elasticsearch流量通过端口9200和9300,以及Kibana流量通过端口5601的规则。

最后一个命令重新加载Firewalld服务,并使用新的永久规则。

接下来,您将启动Elasticsearch守护程序,然后配置用于xpack安全模块的密码。

启动Elasticsearch

现在您已经配置了Elasticsearch的网络和xpack安全设置,您需要启动它以使更改生效。

运行以下systemctl命令启动Elasticsearch:

  1. sudo systemctl start elasticsearch.service

一旦Elasticsearch完成启动,您可以继续本教程的下一部分,在那里您将为Elasticsearch内置的默认用户生成密码。

配置Elasticsearch密码

现在您已经启用了xpack.security.enabled设置,需要为默认的Elasticsearch用户生成密码。Elasticsearch在/usr/share/elasticsearch/bin目录中包含一个实用程序,可以自动生成这些用户的随机密码。

运行以下命令cd到该目录,然后为所有默认用户生成随机密码:

  1. cd /usr/share/elasticsearch/bin
  2. sudo ./elasticsearch-setup-passwords auto

您将收到如下输出。在提示继续时,按y然后按RETURNENTER

Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
The passwords will be randomly generated and printed to the console.
Please confirm that you would like to continue [y/N]y


Changed password for user apm_system
PASSWORD apm_system = eWqzd0asAmxZ0gcJpOvn

Changed password for user kibana_system
PASSWORD kibana_system = 1HLVxfqZMd7aFQS6Uabl

Changed password for user kibana
PASSWORD kibana = 1HLVxfqZMd7aFQS6Uabl

Changed password for user logstash_system
PASSWORD logstash_system = wUjY59H91WGvGaN8uFLc

Changed password for user beats_system
PASSWORD beats_system = 2p81hIdAzWKknhzA992m

Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = 85HF85Fl6cPslJlA8wPG

Changed password for user elastic
PASSWORD elastic = 6kNbsxQGYZ2EQJiqJpgl

您将无法再次运行该实用程序,请确保记录这些密码在一个安全的地方。您将需要在本教程的下一部分使用kibana_system用户的密码,在本教程的配置Filebeat步骤中使用elastic用户的密码。

在本教程的这一点上,您已完成了Elasticsearch的配置。接下来的部分将解释如何配置Kibana的网络设置及其xpack安全模块。

步骤3 —— 配置Kibana

在本教程的前一部分中,您已经配置了Elasticsearch以侦听您的Elasticsearch服务器的私有IP地址上的连接。您需要对Kibana执行相同的操作,以便您Suricata服务器上的Filebeats可以访问它。

首先,您将通过生成一些密钥来启用Kibana的 xpack 安全功能,Kibana将使用这些密钥来存储 Elasticsearch 中的数据。然后,您将配置Kibana的网络设置和身份验证详细信息,以连接到 Elasticsearch。

在 Kibana 中启用 xpack.security

要开始在 Kibana 中使用 xpack 安全设置,您需要生成一些加密密钥。Kibana 使用这些密钥来存储会话数据(如 cookies),以及 Elasticsearch 中各种保存的仪表板和数据视图。

您可以使用位于 /usr/share/kibana/bin 目录中的 kibana-encryption-keys 实用程序生成所需的加密密钥。运行以下命令 cd 到该目录,然后生成密钥:

  1. cd /usr/share/kibana/bin/
  2. sudo ./kibana-encryption-keys generate -q --force

使用 -q 标志来抑制工具的指令,并使用 --force 标志确保您创建新密钥。您应该会收到以下输出:

Output
xpack.encryptedSavedObjects.encryptionKey: 66fbd85ceb3cba51c0e939fb2526f585 xpack.reporting.encryptionKey: 9358f4bc7189ae0ade1b8deeec7f38ef xpack.security.encryptionKey: 8f847a594e4a813c4187fa93c884e92b

将这三个密钥复制到安全的位置。现在,您将把它们添加到 Kibana 的 /etc/kibana/kibana.yml 配置文件中。

使用 vi 或您喜欢的编辑器打开文件:

  1. sudo vi /etc/kibana/kibana.yml

使用 vi 快捷键 SHIFT+G 转到文件末尾。然后将您复制的三行 xpack 粘贴到文件末尾:

/etc/kibana/kibana.yml
. . .

# 指定用于所有可本地化字符串、日期和数字格式的区域设置。
# 支持的语言如下:英语 - en,默认情况下,中文 - zh-CN。
#i18n.locale: "en"

xpack.encryptedSavedObjects.encryptionKey: 66fbd85ceb3cba51c0e939fb2526f585
xpack.reporting.encryptionKey: 9358f4bc7189ae0ade1b8deeec7f38ef
xpack.security.encryptionKey: 8f847a594e4a813c4187fa93c884e92b

保持文件打开,并继续到下一部分,在那里您将配置 Kibana 的网络设置。

配置 Kibana 网络

要配置 Kibana 的网络,以便它在您的 Elasticsearch 服务器的私有 IP 地址上可用,请在 /etc/kibana/kibana.yml 中找到已注释的 #server.host: "localhost" 行。该行位于文件的开头附近。在它之后添加一行新行,使用您服务器的私有 IP 地址,如下所示:

/etc/kibana/kibana.yml
# Kibana 由后端服务器提供。此设置指定要使用的端口。
#server.port: 5601

# 指定 Kibana 服务器将绑定到的地址。IP 地址和主机名都是有效值。
# 默认值为 'localhost',这通常意味着远程机器将无法连接。
# 要允许来自远程用户的连接,请将此参数设置为非环回地址。
#server.host: "localhost"
server.host: "your_private_ip"

将您的私有 IP 替换为 your_private_ip 地址。

编辑完成后保存并关闭文件。接下来,您需要配置 Kibana 使用的用户名和密码以连接到 Elasticsearch。

配置 Kibana 凭据

设置 Kibana 用于身份验证到 Elasticsearch 的用户名和密码有两种方法。第一种是编辑 /etc/kibana/kibana.yml 配置文件并在其中添加这些值。第二种方法是将这些值存储在 Kibana 的 keystore 中,这是一个 Kibana 可以用来存储密钥的混淆文件。

在本教程中,我们将使用 keystore 方法,因为它避免直接编辑 Kibana 的配置文件。

如果您更喜欢编辑文件,而不是使用 keystore,您需要在其中配置的设置是 elasticsearch.usernameelasticsearch.password

如果选择编辑配置文件,请跳过本节中的其余步骤。

要使用 kibana-keystore 实用程序向 keystore 添加秘密,请首先 cd/usr/share/kibana/bin 目录。接下来,运行以下命令设置 Kibana 的用户名:

  1. cd /usr/share/kibana/bin
  2. sudo ./kibana-keystore add elasticsearch.username

您将收到如下提示:

Username Entry
Enter value for elasticsearch.username: *************

输入 kibana_system 时,可以通过复制粘贴或仔细输入用户名。每输入一个字符,都会用 * 星号掩盖。完成输入用户名后,按 ENTERRETURN

现在重复这个过程,这次是保存密码。确保复制前一部分教程中生成的 kibana_system 用户的密码。在本教程中,示例密码是 1HLVxfqZMd7aFQS6Uabl

运行以下命令来设置密码:

  1. sudo ./kibana-keystore add elasticsearch.password

提示时,粘贴密码以避免任何转录错误:

Password Entry
Enter value for elasticsearch.password: ********************

启动 Kibana

现在,您已经配置了 Kibana 的网络和 xpack 安全设置,并向密钥库添加了凭据,您需要启动它以使更改生效。

运行以下 systemctl 命令来重新启动 Kibana:

  1. sudo systemctl start kibana.service

一旦 Kibana 启动,您可以继续本教程的下一部分,在该部分中,您将配置 Suricata 服务器上的 Filebeat 以将其日志发送到 Elasticsearch。

第 4 步 — 安装 Filebeat

现在,您的Elasticsearch和Kibana进程已配置了正确的网络和身份验证设置,下一步是在您的Suricata服务器上安装和设置Filebeat。

要开始安装Filebeat,请使用以下命令将Elastic GPG密钥添加到您的Suricata服务器:

  1. sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

接下来,在您的/etc/yum/yum.repos.d目录中创建一个elasticsearch.repo文件,并使用以下内容添加,使用vi或您喜欢的编辑器:

  1. sudo vi /etc/yum.repos.d/elasticsearch.repo
/etc/yum.repos.d/elasticsearch.repo
[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md

当您完成更改后,请保存并退出文件。现在使用dnf命令安装Filebeat软件包:

  1. sudo dnf install --enablerepo=elasticsearch filebeat

接下来,您需要配置Filebeat以连接到Elasticsearch和Kibana。使用vi或您喜欢的编辑器打开/etc/filebeat/filebeat.yml配置文件:

  1. sudo vi /etc/filebeat/filebeat.yml

在文件中查找大约在第100行的Kibana部分。在被注释掉的#host: "localhost:5601"行后添加一行,该行指向您的Kibana实例的私有IP地址和端口:

/etc/filebeat/filebeat.yml
. . .
# 从Beats版本6.0.0开始,仪表板通过Kibana API加载。
# 这需要Kibana端点配置。
setup.kibana:

  # Kibana主机
  # 方案和端口可以省略,并将设置为默认值(http和5601)
  # 如果指定了额外的路径,则需要方案:http://localhost:5601/path
  # IPv6地址应始终定义为:https://[2001:db8::1]:5601
  #host: "localhost:5601"
  host: "your_private_ip:5601"

. . .

这个更改将确保Filebeat能够连接到Kibana,以便在Elasticsearch中创建各种SIEM索引、仪表板和处理管道,以处理您的Suricata日志。

接下来,在文件中找到大约在第130行附近的Elasticsearch Output部分,并编辑hostsusernamepassword设置,以匹配您的Elasticsearch服务器的值:

output.elasticsearch:
  # 要连接的主机数组。
  hosts: ["your_private_ip:9200"]

  # 协议 - 可以是`http`(默认)或`https`。
  #protocol: "https"

  # 认证凭据 - 可以是API密钥或用户名/密码。
  #api_key: "id:api_key"
  username: "elastic"
password: "6kNbsxQGYZ2EQJiqJpgl"

. . .

hosts行上替换为您的Elasticsearch服务器的私有IP地址。取消注释username字段,并将其保留为elastic用户。将password字段从changeme更改为您在本教程的配置Elasticsearch密码部分生成的elastic用户的密码。

编辑完成后保存并关闭文件。接下来,使用以下命令启用Filebeats的内置Suricata模块:

  1. sudo filebeat modules enable suricata

现在,Filebeat已配置为连接到Elasticsearch和Kibana,并启用了Suricata模块,下一步是将SIEM仪表板和管道加载到Elasticsearch中。

运行filebeat setup命令。加载所有内容可能需要几分钟:

  1. sudo filebeat setup

一旦命令完成,您应该会收到以下输出:

Output
Overwriting ILM policy is disabled. Set `setup.ilm.overwrite: true` for enabling. Index setup finished. Loading dashboards (Kibana must be running and reachable) Loaded dashboards Setting up ML using setup --machine-learning is going to be removed in 8.0.0. Please use the ML app instead. See more: https://www.elastic.co/guide/en/machine-learning/current/index.html It is not possble to load ML jobs into an Elasticsearch 8.0.0 or newer using the Beat. Loaded machine learning job configurations Loaded Ingest pipelines

如果没有错误,请使用systemctl命令启动Filebeat。一旦它运行起来,它将开始将来自Suricata的eve.json日志的事件发送到Elasticsearch。

  1. sudo systemctl start filebeat.service

现在,您已经配置了Filebeat、Kibana和Elasticsearch来处理您的Suricata日志,本教程的最后一步是连接到Kibana并探索SIEM仪表板。

第五步 — 导航Kibana的SIEM仪表板

Kibana是Elastic堆栈的图形组件。您将使用Kibana和浏览器来探索Suricata的事件和警报数据。由于您配置了Kibana仅可通过您的Elasticsearch服务器的私有IP地址访问,因此您需要使用SSH隧道连接到Kibana。

使用SSH连接到Kibana

SSH有一个选项-L,它允许您将本地端口上的网络流量转发到服务器上的远程IP地址和端口。您将使用此选项将流量从浏览器转发到您的Kibana实例。

在Linux、macOS和更新的Windows 10及更高版本中,您可以使用内置的SSH客户端创建隧道。每次您想要连接到Kibana时都会使用此命令。您可以随时关闭此连接,然后再次运行SSH命令以重新建立隧道。

在本地桌面或笔记本电脑的终端上运行以下命令,以创建到Kibana的SSH隧道:

  1. ssh -L 5601:your_private_ip:5601 sammy@203.0.113.5 -N

SSH的各种参数为:

  • -L标志将流量转发到本地系统上的端口5601,以连接到远程服务器。
  • 命令中的your_private_ip:5601部分指定了您的流量将要转发到的Elasticsearch服务器上的服务。在这种情况下,该服务是Kibana。请务必将您的Elasticsearch服务器的私有IP地址替换为your_private_ip
  • 203.0.113.5地址是您用于连接和管理服务器的公共IP地址。请用您的Elasticsearch服务器的公共IP地址替换它。
  • -N标志指示SSH不要运行像交互式/bin/bash shell这样的命令,而是仅保持连接处于打开状态。通常在转发端口时使用,就像这个例子中一样。

如果您想随时关闭隧道,请按CTRL+C

在Windows上,您的终端应该类似于以下截图:

注意:如果您没有使用 SSH 密钥,可能会提示您输入密码。请在提示符中输入或粘贴密码,然后按 ENTERRETURN 键。

在 macOS 和 Linux 上,您的终端将类似于以下屏幕截图:

一旦您通过 SSH 连接到 Elasticsearch 服务器并设置了端口转发,打开浏览器访问 http://127.0.0.1:5601。您将被重定向到 Kibana 的登录页面:

如果您的浏览器无法连接到 Kibana,则会在终端中收到类似以下的消息:

Output
channel 3: open failed: connect failed: No route to host

此错误表示您的 SSH 隧道无法到达服务器上的 Kibana 服务。确保您已经为 Elasticsearch 服务器指定了正确的私有 IP 地址,并在浏览器中重新加载页面。

使用 elastic 作为用户名登录到您的 Kibana 服务器,并使用本教程中之前复制的用户密码。

浏览 Kibana SIEM 仪表盘

一旦您登录到 Kibana,您就可以探索 Filebeat 为您配置的 Suricata 仪表板。

在 Kibana 欢迎页面顶部的搜索字段中,输入搜索词 type:dashboard suricata。此搜索将返回两个结果:Suricata 事件和 Suricata 警报仪表板,如下屏幕截图所示:

点击[Filebeat Suricata] 事件概览结果,访问显示所有记录的 Suricata 事件概览的 Kibana 仪表板:

要访问 Suricata 警报仪表板,请重复搜索或单击事件仪表板中包含的警报链接。您的页面应该类似于以下截图:

如果您想检查每个仪表板显示的事件和警报,请滚动到页面底部,您将找到一个表格,列出了每个事件和警报。您可以展开每个条目以查看来自 Suricata 的原始日志条目,并详细检查各种字段,例如警报的源和目标 IP,攻击类型,Suricata 签名 ID 等。

Kibana 还具有一组内置的安全仪表板,您可以使用浏览器窗口左侧的菜单访问。导航到网络仪表板以获取有关地图上显示的事件以及关于网络上事件的聚合数据的概览。您的仪表板应该类似于以下截图:

您可以滚动到网络仪表板底部,查看列出与指定搜索时间段匹配的所有事件的表格。您还可以详细检查每个事件,或选择一个事件生成 Kibana 时间线,然后您可以使用该时间线来调查特定的流量流、警报或社区 ID。

结论

在本教程中,您已在独立服务器上安装并配置了Elasticsearch和Kibana。您配置了两个工具都可以通过私有IP地址访问。您还使用随附于每个工具的xpack安全模块配置了Elasticsearch和Kibana的身份验证设置。

完成Elasticsearch和Kibana配置步骤后,您还在Suricata服务器上安装并配置了Filebeat。您使用Filebeat来填充Kibana的仪表板,并开始将Suricata日志发送到Elasticsearch。

最后,您创建了一个SSH隧道到您的Elasticsearch服务器,并登录了Kibana。您找到了新的Suricata事件和警报仪表板,以及网络仪表板。

本系列的最后一个教程将指导您如何使用Kibana的SIEM功能处理Suricata警报。您将探索如何创建用于跟踪特定警报的案例,用于相关网络流量的时间线,以及用于匹配您想要跟踪或详细分析的特定Suricata事件的规则。

Source:
https://www.digitalocean.com/community/tutorials/how-to-build-a-siem-with-suricata-and-elastic-stack-on-rocky-linux-8