如何在Debian11上使用Suricata和ElasticStack构建SIEM

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

在本教程中,您将探索如何将 Suricata 与 Elasticsearch、Kibana 和 Filebeat 集成,以开始使用 Elastic 堆栈和 Debian 11 创建您自己的安全信息和事件管理 (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 仪表板并与之交互。

先决条件

如果您一直在学习本教程系列,那么您应该已经在 Debian 11 服务器上运行了 Suricata。 该服务器将被称为您的 Suricata 服务器

  • 如果您仍然需要安装 Suricata,那么您可以按照说明 如何在 Debian 11 上安装 Suricata 的教程进行操作。
  • 您还需要加载和配置一些 Suricata 签名以生成警报或丢弃流量。 按照本系列中的 了解 Suricata 签名教程 获取有关如何创建自己的签名的指南。 或者您可以按照如何安装 Suricata 教程中的 步骤 3 — 更新 Suricata 规则集 下载一套完整的签名。

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

  • 4GB RAM 和 2 个 CPU 设置为非 root sudo 用户。 您可以通过遵循 Debian 11 初始服务器设置来实现此目的。

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

第 1 步 — 安装 Elasticsearch 和 Kibana

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

curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

接下来,将 Elastic 源列表添加到 sources.list.d 目录,其中 apt 将搜索新的源:

echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list

现在更新服务器的包索引并安装 Elasticsearch 和 Kibana:

sudo apt update
sudo apt install elasticsearch kibana

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

ip -brief address show

您将收到如下输出:

Outputlo               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/16。 您的设备名称和 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 以侦听其专用网络接口上的连接。 您还需要配置防火墙规则以允许在您的专用网络接口上访问 Elasticsearch。

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

sudo nano /etc/elasticsearch/elasticsearch.yml

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

/etc/elasticsearch/elasticsearch.yml

# By default Elasticsearch is only accessible on localhost. Set a different
# address here to expose this node on the network:
#
#network.host: 192.168.0.1
network.bind_host: ["127.0.0.1", "your_private_ip"]
#
# By default Elasticsearch listens for HTTP traffic on the first free port it
# finds starting at 9200. Set a specific HTTP port here:

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

接下来,使用 nano 快捷方式 CTRL+v 转到文件末尾,直到到达末尾。

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

/etc/elasticsearch/elasticsearch.yml

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

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

完成编辑后保存并关闭文件。 如果您使用的是 nano,您可以使用 CTRL+X,然后使用 YENTER 进行确认。

最后,添加防火墙规则以确保您的 Elasticsearch 服务器可在其专用网络接口上访问。 如果您遵循先决条件教程并使用简单防火墙 (ufw),请运行以下命令:

sudo ufw allow in on eth1
sudo ufw allow out on eth1

如果使用不同的名称,请用您的专用网络接口代替 eth1

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

启动 Elasticsearch

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

运行以下 systemctl 命令启动 Elasticsearch:

sudo systemctl start elasticsearch.service

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

配置 Elasticsearch 密码

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

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

cd /usr/share/elasticsearch/bin
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 用户的密码,在本教程的 Configuring Filebeat 步骤中使用 elastic 用户的密码。

在本教程的这一点上,您已完成 Elasticsearch 的配置。 下一节介绍如何配置 Kibana 的网络设置及其 xpack 安全模块。

第 3 步 — 配置 Kibana

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

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

在 Kibana 中启用 xpack.security

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

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

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

-q 标志禁止工具的指令,因此您只能收到如下输出:

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

将您的输出复制到安全的地方。 您现在将它们添加到 Kibana 的 /etc/kibana/kibana.yml 配置文件中。

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

sudo nano /etc/kibana/kibana.yml

使用 nano 快捷方式 CTRL+v 转到文件末尾,直到到达末尾。 将复制的三个 xpack 行粘贴到文件末尾:

/etc/kibana/kibana.yml

. . .

# Specifies locale to be used for all localizable strings, dates and number formats.
# Supported languages are the following: English - en , by default , Chinese - 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 is served by a back end server. This setting specifies the port to use.
#server.port: 5601

# Specifies the address to which the Kibana server will bind. IP addresses and host names are both valid values.
# The default is 'localhost', which usually means remote machines will not be able to connect.
# To allow connections from remote users, set this parameter to a non-loopback address.
#server.host: "localhost"
server.host: "your_private_ip"

用您的私有 IP 代替 your_private_ip 地址。

完成编辑后保存并关闭文件。 如果您使用的是 nano,您可以使用 CTRL+X,然后使用 YENTER 进行确认。

接下来,您需要配置 Kibana 用于连接到 Elasticsearch 的用户名和密码。

配置 Kibana 凭证

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

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

如果您更喜欢编辑文件,则在其中配置的设置为 elasticsearch.usernameelasticsearch.password

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


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

sudo ./kibana-keystore add elasticsearch.username

您将收到如下提示:

用户名条目

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

出现提示时输入 kibana_system,方法是复制和粘贴,或者仔细输入用户名。 您键入的每个字符都将被一个 * 星号字符屏蔽。 输入用户名后按 ENTERRETURN

现在对密码重复相同的命令。 请务必复制您在本教程上一节中生成的 kibana_system 用户的密码。 作为参考,本教程中的示例密码为 1HLVxfqZMd7aFQS6Uabl

运行以下命令设置密码:

sudo ./kibana-keystore add elasticsearch.password

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

密码输入

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

启动 Kibana

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

运行以下 systemctl 命令重启 Kibana:

sudo systemctl start kibana.service

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

第 4 步 — 安装 Filebeat

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

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

curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

接下来,将 Elastic 源列表添加到 sources.list.d 目录,其中 apt 将搜索新的源:

echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list

现在更新服务器的包索引并安装 Filebeat 包:

sudo apt update
sudo apt install filebeat

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

sudo nano /etc/filebeat/filebeat.yml

在第 100 行附近找到文件的 Kibana 部分。 在注释掉的 #host: "localhost:5601" 行之后添加一行,指向您的 Kibana 实例的私有 IP 地址和端口:

/etc/filebeat/filebeat.yml

. . .
# Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API.
# This requires a Kibana endpoint configuration.
setup.kibana:

  # Kibana Host
  # Scheme and port can be left out and will be set to the default (http and 5601)
  # In case you specify and additional path, the scheme is required: http://localhost:5601/path
  # IPv6 addresses should always be defined as: 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:
  # Array of hosts to connect to.
  hosts: ["your_private_ip:9200"]

  # Protocol - either `http` (default) or `https`.
  #protocol: "https"

  # Authentication credentials - either API key or username/password.
  #api_key: "id:api_key"
  username: "elastic"
  password: "6kNbsxQGYZ2EQJiqJpgl"

. . .

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

完成编辑后保存并关闭文件。 如果您使用的是 nano,您可以使用 CTRL+X,然后使用 YENTER 进行确认。

接下来,使用以下命令启用 Filebeats 的内置 Suricata 模块:

sudo filebeat modules enable suricata

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

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

sudo filebeat setup

命令完成后,您应该会收到如下输出:

OutputOverwriting 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 possible 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 发送事件。

sudo systemctl start filebeat.service

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

第 5 步 — 浏览 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 隧道:

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.11.0.5 地址是您用来连接和管理服务器的公共 IP 地址。 替换您的 Elasticsearch 服务器的公共 IP 地址。
  • -N 标志指示 SSH not 运行类似于交互式 /bin/bash shell 的命令,而只是保持连接打开。 通常在转发端口时使用,如本例。

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

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

注意:如果您不使用 SSH 密钥,系统可能会提示您输入密码。 键入或粘贴到提示中,然后按 ENTERRETURN


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

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

如果您的浏览器无法连接到 Kibana,您将在终端中收到如下消息:

Outputchannel 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] Events Overview 结果以访问 Kibana 仪表板,该仪表板显示所有记录的 Suricata 事件的概述:

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

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

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

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

结论

在本教程中,您在独立服务器上安装并配置了 Elasticsearch 和 Kibana。 您将这两个工具配置为在专用 IP 地址上可用。 您还使用每个工具附带的 xpack 安全模块配置了 Elasticsearch 和 Kibana 的身份验证设置。

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

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

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