本页内容
- 先决条件
- 第一部分
- 步骤 1 - 安装 Suricata
- 步骤 2 - 配置 Suricata 启用 Community ID 选择网络接口
- 步骤 3 - 配置 Suricata 规则 添加规则集提供商
- 步骤 4 - 验证 Suricata 配置
- 步骤 5 - 运行 Suricata
- 步骤 6 - 测试 Suricata 规则
- 第二部分
- 步骤 7 - 安装 Elasticsearch
- 步骤 8 - 配置 Elasticsearch 配置防火墙 启动 Elasticsearch 创建 Elasticsearch 密码
- 步骤 9 - 安装并配置 Kibana 配置 Kibana 主机 关闭遥测 配置 SSL 配置 Kibana 访问 启动 Kibana
- 步骤 10 - 安装并配置 Filebeat
- 步骤 11 - 访问 Kibana 仪表盘 使用 SSH 本地隧道 使用 Nginx 反向代理 配置防火墙 安装 Nginx 安装并配置 SSL 配置 Nginx
- 步骤 12 - 管理 Kibana 仪表盘
- 总结
- 启用 Community ID
- 选择网络接口
- 添加规则集提供商
- 配置防火墙
- 启动 Elasticsearch
- 创建 Elasticsearch 密码
- 配置 Kibana 主机
- 关闭遥测
- 配置 SSL
- 配置 Kibana 访问
- 启动 Kibana
- 使用 SSH 本地隧道
- 使用 Nginx 反向代理
- 配置防火墙
- 安装 Nginx
- 安装并配置 SSL
- 配置 Nginx
Suricata 是一款网络监控工具,它会检查并处理流经你服务器的每一个互联网流量数据包。它可以在检测到任何可疑活动时生成日志事件、触发告警并丢弃流量。
你可以将 Suricata 安装在单台机器上以监控其流量,也可以将其部署在网关主机上,以扫描连接到它的其他服务器的所有进出流量。你可以将 Suricata 与 Elasticsearch、Kibana 和 Filebeat 结合使用,构建一个安全信息和事件管理(SIEM)工具。
在本教程中,你将在 Debian 12 服务器上安装 Suricata IDS 以及 Elastic Stack。该技术栈的各个组件如下:
- Elasticsearch 用于存储、索引、关联和搜索来自服务器的安全事件。
- Kibana 用于显示存储在 Elasticsearch 中的日志。
- Filebeat 用于解析 Suricata 的 eve.json 日志文件,并将每个事件发送到 Elasticsearch 进行处理。
- Suricata 用于扫描网络流量中的可疑事件并丢弃无效数据包。
本教程分为两个部分,第一部分将介绍如何安装和配置 Suricata,第二部分将介绍如何安装和配置 Elastic Stack。
在本教程中,我们将把 Suricata 和 Elastic Stack 安装在不同服务器上。
先决条件
- 承载 Elastic Stack 和 Suricata 的服务器应至少具备 4GB 内存和 2 个 CPU 核心。
- 这些服务器应能够使用私有 IP 地址相互通信。
- 这些服务器应运行 Debian 12,并配置一个非 root 的 sudo 用户。
- 如果你希望从任何地方访问 Kibana 仪表盘,请设置一个指向 Elasticsearch 所安装服务器的域名(kibana.example.com)。
- 在两台服务器上安装必要的软件包。其中部分软件包可能已经安装。$ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -y
- 确保两台服务器上的所有软件包都已更新。$ sudo apt update
承载 Elastic Stack 和 Suricata 的服务器应至少具备 4GB 内存和 2 个 CPU 核心。
这些服务器应能够使用私有 IP 地址相互通信。
这些服务器应运行 Debian 12,并配置一个非 root 的 sudo 用户。
如果你希望从任何地方访问 Kibana 仪表盘,请设置一个指向 Elasticsearch 所安装服务器的域名(kibana.example.com)。
在两台服务器上安装必要的软件包。其中部分软件包可能已经安装。
$ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -y
确保两台服务器上的所有软件包都已更新。
$ sudo apt update
第一部分
步骤 1 - 安装 Suricata
Suricata 可从 Debian 官方软件仓库中获取。使用以下命令进行安装。
$ sudo apt install suricata
Suricata 服务会自动启用并启动。在继续之前,请先停止 Suricata 服务,因为我们需要先对其进行配置。
$ sudo systemctl stop suricata
步骤 2 - 配置 Suricata
Suricata 将其配置存储在 /etc/suricata/suricata.yaml 文件中。Suricata 的默认模式是 IDS(入侵检测系统)模式,在该模式下只记录流量而不会阻止流量。如果你是 Suricata 的新手,应保持该模式不变。在配置完成并了解更多之后,你可以开启 IPS(入侵防御系统)模式。
启用 Community ID
Community ID 字段可以更轻松地将不同监控工具生成的记录之间的数据关联起来。由于我们将把 Suricata 与 Elasticsearch 配合使用,启用 Community ID 会很有用。
打开 /etc/suricata/suricata.yaml 文件进行编辑。
$ sudo nano /etc/suricata/suricata.yaml
找到 # Community Flow ID 这一行,并将变量 community-id 的值设置为 true。
. . .
# Community Flow ID
# Adds a 'community_id' field to EVE records. These are meant to give
# records a predictable flow ID that can be used to match records to
# output of other tools such as Zeek (Bro).
#
# Takes a 'seed' that needs to be same across sensors and tools
# to make the id less predictable.
# enable/disable the community id feature.
community-id: true
. . .
按下 Ctrl + X 并输入 Y 确认以保存文件。
现在,你的事件将携带一个类似 1:S+3BA2UmrHK0Pk+u3XH78GAFTtQ= 的 ID,你可以用它在不同的监控工具之间匹配数据集。
选择网络接口
默认的 Suricata 配置文件会检查 eth0 设备/网络接口上的流量。如果你的服务器使用了不同的网络接口,你需要在配置中更新它。
使用以下命令查看你的网络接口设备名称。
$ ip -p -j route show default
你将收到如下类似的输出。
[ {
"dst": "default",
"gateway": "159.223.208.1",
"dev": "eth0",
"protocol": "static",
"flags": [ ]
} ]
dev 变量指的是网络设备。在我们的输出中,eth0 显示为网络设备。根据你的系统不同,你的输出可能会有所不同。
既然你已经知道了设备名称,请打开配置文件。
$ sudo nano /etc/suricata/suricata.yaml
找到第 580 行附近的 af-packet: 这一行。在其下方,将变量 interface 的值设置为你的系统所使用的设备名称。
# Linux high speed capture support
af-packet:
- interface: eth0
# Number of receive threads. "auto" uses the number of cores
#threads: auto
# Default clusterid. AF_PACKET will load balance packets based on flow.
cluster-id: 99
. . .
如果你想添加其他接口,可以在第 650 行附近的 af-packet 部分底部添加。
要添加新接口,请将其插入到 - interface: default 部分的上方,如下所示。
# For eBPF and XDP setup including bypass, filter and load balancing, please
# see doc/userguide/capture-hardware/ebpf-xdp.rst for more info.
- interface: enp0s1
cluster-id: 98
...
- interface: default
#threads: auto
#use-mmap: no
#tpacket-v3: yes
在我们的示例中,我们添加了一个新接口 enp0s1 以及 cluster-id 变量的唯一值。你每添加一个接口,都需要为其包含一个唯一的 cluster ID。
找到 pcap: 这一行,在其下方将变量 interface 的值设置为你的系统所使用的设备名称。
# Cross platform libpcap capture support
pcap:
- interface: eth0
# On Linux, pcap will try to use mmap'ed capture and will use "buffer-size"
# as total memory used by the ring. So set this to something bigger
# than 1% of your bandwidth.
与之前一样,要添加新接口,请将其插入到 - interface: default 部分的上方,如下所示。
- interface: enp0s1
# Put default values here
- interface: default
#checksum-checks: auto
完成后,按下 Ctrl + X 并输入 Y 确认以保存文件。
步骤 3 - 配置 Suricata 规则
默认情况下,Suricata 只使用一组有限的规则来检测网络流量。你可以使用一个名为 suricata-update 的工具从外部提供商添加更多规则集。运行以下命令以包含额外的规则。
$ sudo suricata-update -o /etc/suricata/rules
4/10/2023 -- 14:12:05 - <Info> -- Using data-directory /var/lib/suricata.
4/10/2023 -- 14:12:05 - <Info> -- Using Suricata configuration /etc/suricata/suricata.yaml
4/10/2023 -- 14:12:05 - <Info> -- Using /etc/suricata/rules for Suricata provided rules.
.....
4/10/2023 -- 14:12:05 - <Info> -- No sources configured, will use Emerging Threats Open
4/10/2023 -- 14:12:05 - <Info> -- Fetching https://rules.emergingthreats.net/open/suricata-6.0.10/emerging.rules.tar.gz.
100% - 4073339/4073339
.....
4/10/2023 -- 14:12:09 - <Info> -- Writing rules to /etc/suricata/rules/suricata.rules: total: 45058; enabled: 35175; added: 45058; removed 0; modified: 0
4/10/2023 -- 14:12:10 - <Info> -- Writing /etc/suricata/rules/classification.config
4/10/2023 -- 14:12:10 - <Info> -- Testing with suricata -T.
4/10/2023 -- 14:12:33 - <Info> -- Done.
命令中的 -o /etc/suricata/rules 部分指示更新工具将规则保存到 /etc/suricata/rules 目录。此参数很重要,否则你在验证时将会遇到以下错误。
<Warning> - [ERRCODE: SC_ERR_NO_RULES(42)] - No rule files match the pattern /etc/suricata/rules/suricata.rules
添加规则集提供商
你可以通过添加更多提供商来扩展 Suricata 的规则。它可以从各种免费和商业提供商处获取规则。
你可以使用以下命令列出默认的提供商列表。
$ sudo suricata-update list-sources
例如,如果你想包含 tgreen/hunting 规则集,可以使用以下命令启用它。
$ sudo suricata-update enable-source tgreen/hunting
4/10/2023 -- 14:24:26 - <Info> -- Using data-directory /var/lib/suricata.
4/10/2023 -- 14:24:26 - <Info> -- Using Suricata configuration /etc/suricata/suricata.yaml
4/10/2023 -- 14:24:26 - <Info> -- Using /etc/suricata/rules for Suricata provided rules.
4/10/2023 -- 14:24:26 - <Info> -- Found Suricata version 6.0.10 at /usr/bin/suricata.
4/10/2023 -- 14:24:26 - <Info> -- Creating directory /var/lib/suricata/update/sources
4/10/2023 -- 14:24:26 - <Info> -- Enabling default source et/open
4/10/2023 -- 14:24:26 - <Info> -- Source tgreen/hunting enabled
再次运行 suricata-update 命令以下载并更新新规则。默认情况下,Suricata 可以在不重启的情况下处理任何规则更改。
步骤 4 - 验证 Suricata 配置
Suricata 自带一个验证工具,用于检查配置文件和规则是否存在错误。运行以下命令来运行该验证工具。
$ sudo suricata -T -c /etc/suricata/suricata.yaml -v
4/10/2023 -- 14:24:43 - <Info> - Running suricata under test mode
4/10/2023 -- 14:24:43 - <Notice> - This is Suricata version 6.0.10 RELEASE running in SYSTEM mode
4/10/2023 -- 14:24:43 - <Info> - CPUs/cores online: 2
4/10/2023 -- 14:24:43 - <Info> - fast output device (regular) initialized: fast.log
4/10/2023 -- 14:24:43 - <Info> - eve-log output device (regular) initialized: eve.json
4/10/2023 -- 14:24:43 - <Info> - stats output device (regular) initialized: stats.log
4/10/2023 -- 14:24:53 - <Info> - 1 rule files processed. 35175 rules successfully loaded, 0 rules failed
4/10/2023 -- 14:24:53 - <Info> - Threshold config parsed: 0 rule(s) found
4/10/2023 -- 14:24:54 - <Info> - 35178 signatures processed. 1255 are IP-only rules, 5282 are inspecting packet payload, 28436 inspect application layer, 108 are decoder event only
4/10/2023 -- 14:25:07 - <Notice> - Configuration provided was successfully loaded. Exiting.
4/10/2023 -- 14:25:07 - <Info> - cleaning up signature grouping structure... complete
-T 标志指示 Suricata 以测试模式运行,-c 标志配置配置文件的位置,-v 标志会打印命令的详细输出。根据你的系统配置和添加的规则数量,该命令可能需要几分钟才能完成。
步骤 5 - 运行 Suricata
既然 Suricata 已经配置好,现在可以运行该应用程序了。
$ sudo systemctl start suricata
检查该进程的状态。
$ sudo systemctl status suricata
如果一切正常,你应该会看到如下输出。
? suricata.service - Suricata IDS/IDP daemon
Loaded: loaded (/lib/systemd/system/suricata.service; enabled; preset: enabled)
Active: active (running) since Wed 2023-10-04 14:25:49 UTC; 6s ago
Docs: man:suricata(8)
man:suricatasc(8)
https://suricata-ids.org/docs/
Process: 1283 ExecStart=/usr/bin/suricata -D --af-packet -c /etc/suricata/suricata.yaml --pidfile /run/suricata.pid (code=exited, status=0/SUCCESS)
Main PID: 1284 (Suricata-Main)
Tasks: 1 (limit: 4652)
Memory: 211.7M
CPU: 6.132s
CGroup: /system.slice/suricata.service
??1284 /usr/bin/suricata -D --af-packet -c /etc/suricata/suricata.yaml --pidfile /run/suricata.pid
Oct 04 14:25:49 suricata systemd[1]: Starting suricata.service - Suricata IDS/IDP daemon...
Oct 04 14:25:49 suricata suricata[1283]: 4/10/2023 -- 14:25:49 - <Notice> - This is Suricata version 6.0.10 RELEASE running in SYSTEM mode
Oct 04 14:25:49 suricata systemd[1]: Started suricata.service - Suricata IDS/IDP daemon.
该进程可能需要几分钟才能完成对所有规则的解析。因此,上述状态检查并不能完全说明 Suricata 是否已启动并就绪。你可以使用以下命令监控日志文件来了解。
$ sudo tail -f /var/log/suricata/suricata.log
如果你在日志文件中看到以下行,说明 Suricata 正在运行并准备监控网络流量。按下 CTRL+C 键退出 tail 命令。
4/10/2023 -- 14:26:12 - <Info> - All AFP capture threads are running.
步骤 6 - 测试 Suricata 规则
我们将检查 Suricata 是否能检测到任何可疑流量。Suricata 指南建议使用以下命令来测试 ET Open 规则编号 2100498。
$ curl http://testmynids.org/uid/index.html
你将得到如下响应。
uid=0(root) gid=0(root) groups=0(root)
上述命令会模拟返回在受攻击系统上运行的 id 命令的输出。要测试 Suricata 是否检测到了该流量,你需要使用指定的规则编号检查日志文件。
$ grep 2100498 /var/log/suricata/fast.log
如果你的请求使用了 IPv6,你应该会看到如下输出。
10/04/2023-14:26:37.511168 [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 2600:9000:23d0:a200:0018:30b3:e400:93a1:80 -> 2a03:b0c0:0002:00d0:0000:0000:0e1f:c001:53568
如果你的请求使用了 IPv4,你应该会看到如下输出。
10/04/2023-14:26:37.511168 [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 108.158.221.5:80 -> 95.179.185.42:36364
Suricata 还会以 JSON 格式将事件记录到 /var/log/suricata/eve.log 文件中。要读取和解析这些规则,你需要安装 jq,这超出了本教程的范围。
第二部分
本教程的第一部分已经完成,我们安装并测试了 Suricata。下一部分将安装 ELK 技术栈,并将其配置为可视化 Suricata 及其日志。除非另有说明,教程的第二部分应在第二台服务器上进行。
步骤 7 - 安装 Elasticsearch
安装 Elasticsearch 的第一步是将 Elastic GPG 密钥添加到你的服务器。
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
通过创建文件 /etc/apt/sources.list.d/elastic-7.x.list 来为 Elasticsearch 软件包创建仓库。
$ echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
更新你系统的仓库列表。
$ sudo apt update
安装 Elasticsearch 和 Kibana。
$ sudo apt install elasticsearch
Elasticsearch 安装完成后,你将看到如下输出。
--------------------------- Security autoconfiguration information ------------------------------
Authentication and authorization are enabled.
TLS for the transport and HTTP layers is enabled and configured.
The generated password for the elastic built-in superuser is : IuRTjJr+=NqIClxZwKBn
If this node should join an existing cluster, you can reconfigure this with
'/usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token <token-here>'
after creating an enrollment token on your existing cluster.
You can complete the following actions at any time:
Reset the password of the elastic built-in superuser with
'/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic'.
Generate an enrollment token for Kibana instances with
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana'.
Generate an enrollment token for Elasticsearch nodes with
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node'.
-------------------------------------------------------------------------------------------------
我们稍后会用到这些信息。
使用以下命令查找你服务器的私有 IP 地址。
$ ip -brief address show
lo UNKNOWN 127.0.0.1/8 ::1/128
eth0 UP 159.223.220.228/20 10.18.0.5/16 2a03:b0c0:2:d0::e0e:c001/64 fe80::841e:feff:fee4:e653/64
eth1 UP 10.133.0.2/16 fe80::d865:d5ff:fe29:b50f/64
记下你服务器的私有 IP(本例中为 10.133.0.2)。我们将其称为 your_private_IP。服务器的公网 IP 地址(159.223.220.228)在后续教程中将被称为 your_public_IP。同时,记下你服务器的网络接口名称 eth1。
步骤 8 - 配置 Elasticsearch
Elasticsearch 将其配置存储在 /etc/elasticsearch/elasticsearch.yml 文件中。打开该文件进行编辑。
$ sudo nano /etc/elasticsearch/elasticsearch.yml
默认情况下,Elasticsearch 只接受本地连接。我们需要更改这一设置,以便 Kibana 能够通过私有 IP 地址访问它。
找到 #network.host: 192.168.0.1 这一行,并在其正下方添加如下行,如下所示。
# 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:
这将确保 Elastic 在仍可接受本地连接的同时,也能通过私有 IP 地址对 Kibana 可用。
下一步是开启一些安全功能,并确保 Elastic 被配置为在单节点上运行。如果你打算使用多个 Elasticsearch 节点,请跳过以下两处更改并保存文件。
为此,请在文件末尾添加以下行。
. . .
discovery.type: single-node
同时,请在该行前面添加井号(#)将其注释掉。
#cluster.initial_master_nodes: ["kibana"]
完成后,按下 Ctrl + X 并输入 Y 确认以保存文件。
配置防火墙
为 Elasticsearch 添加适当的防火墙规则,使其可以通过私有网络访问。
$ sudo ufw allow in on eth1
$ sudo ufw allow out on eth1
请确保你在第一条命令中选择了接口名称,例如你在步骤 7 中获取到的那个。
启动 Elasticsearch
重新加载服务守护进程。
$ sudo systemctl daemon-reload
启用 Elasticsearch 服务。
$ sudo systemctl enable elasticsearch
既然你已经配置好 Elasticsearch,现在可以启动该服务了。
$ sudo systemctl start elasticsearch
检查该服务的状态。
$ sudo systemctl status elasticsearch
? elasticsearch.service - Elasticsearch
Loaded: loaded (/lib/systemd/system/elasticsearch.service; enabled; preset: enabled)
Active: active (running) since Wed 2023-10-04 14:30:55 UTC; 8s ago
Docs: https://www.elastic.co
Main PID: 1731 (java)
Tasks: 71 (limit: 4652)
Memory: 2.3G
CPU: 44.355s
CGroup: /system.slice/elasticsearch.service
创建 Elasticsearch 密码
启用 Elasticsearch 的安全设置后,下一步是为 Elasticsearch 超级用户生成密码。安装过程中提供了默认密码,你可以使用它,但建议进行修改。
运行以下命令重置 Elasticsearch 密码。请选择一个强密码。
$ sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -i
This tool will reset the password of the [elastic] user.
You will be prompted to enter the password.
Please confirm that you would like to continue [y/N]y
Enter password for [elastic]: <ENTER-PASSWORD>
Re-enter password for [elastic]: <CONFIRM-PASSWORD>
Password for the [elastic] user successfully reset.
现在,让我们测试 Elasticsearch 是否能响应查询。
$ sudo curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic https://localhost:9200
Enter host password for user 'elastic':
{
"name" : "kibana",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "KGYx4poLSxKhPyOlYrMq1g",
"version" : {
"number" : "8.10.2",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "6d20dd8ce62365be9b1aca96427de4622e970e9e",
"build_date" : "2023-09-19T08:16:24.564900370Z",
"build_snapshot" : false,
"lucene_version" : "9.7.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
这确认了 Elasticsearch 已完全正常运行。
步骤 9 - 安装并配置 Kibana
安装 Kibana。
$ sudo apt install kibana
配置 Kibana 的第一步是通过生成密钥来启用 xpack 安全功能。Kibana 使用这些密钥将数据存储在 Elasticsearch 中。生成密钥的工具可从 /usr/share/kibana/bin 目录访问。
$ sudo /usr/share/kibana/bin/kibana-encryption-keys generate -q --force
-q 标志会抑制命令的说明信息,--force 标志确保生成全新的密钥。你将收到如下类似的输出。
xpack.encryptedSavedObjects.encryptionKey: 248eb61d444215a6e710f6d1d53cd803
xpack.reporting.encryptionKey: aecd17bf4f82953739a9e2a9fcad1891
xpack.security.encryptionKey: 2d733ae5f8ed5f15efd75c6d08373f36
复制该输出。打开 Kibana 的配置文件 /etc/kibana/kibana.yml 进行编辑。
$ sudo nano /etc/kibana/kibana.yml
将上一条命令的代码粘贴到文件末尾。
. . .
# Maximum number of documents loaded by each shard to generate autocomplete suggestions.
# This value must be a whole number greater than zero. Defaults to 100_000
#unifiedSearch.autocomplete.valueSuggestions.terminateAfter: 100000
xpack.encryptedSavedObjects.encryptionKey: 3ff21c6daf52ab73e932576c2e981711
xpack.reporting.encryptionKey: edf9c3863ae339bfbd48c713efebcfe9
xpack.security.encryptionKey: 7841fd0c4097987a16c215d9429daec1
将 CA 证书文件 /etc/elasticsearch/certs/http_ca.crt 复制到 /etc/kibana 目录。
$ sudo cp /etc/elasticsearch/certs/http_ca.crt /etc/kibana/
配置 Kibana 主机
需要对 Kibana 进行配置,使其可以通过服务器的私有 IP 地址访问。在文件中找到 #server.host: "localhost" 这一行,并在其正下方添加如下行,如下所示。
# 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"
关闭遥测
默认情况下,Kibana 会将数据发回其服务器。这会影响性能,也存在隐私风险。因此,你应该关闭遥测(Telemetry)。在文件末尾添加以下代码以关闭遥测。第一个设置用于关闭遥测,第二个设置禁止从 Kibana 的高级设置部分覆盖第一个设置。
telemetry.optIn: false
telemetry.allowChangingOptInStatus: false
完成后,按下 Ctrl + X 并输入 Y 确认以保存文件。
配置 SSL
找到变量 elasticsearch.ssl.certificateAuthorities,取消其注释,并按如下所示更改其值。
elasticsearch.ssl.certificateAuthorities: [ "/etc/kibana/http_ca.crt" ]
配置 Kibana 访问
下一步是生成一个注册令牌(enrollment token),我们稍后将使用它登录 Kibana Web 界面。
$ sudo /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
eyJ2ZXIiOiI4LjEwLjIiLCJhZHIiOlsiMTU5LjIyMy4yMjAuMjI4OjkyMDAiXSwiZmdyIjoiOGMyYTcyYmUwMDg5NTJlOGMxMWUwNDgzYjE2OTcwOTMxZWZlNzYyMDAwNzhhOGMwNTNmNWU0NGJiY2U4NzcwMSIsImtleSI6IlQ5eE0tNG9CUWZDaGdaakUwbFAzOk9QTU5uWVRnUWppU3lvU0huOUoyMHcifQ==
启动 Kibana
既然你已经为 Kibana 配置了安全访问和网络,现在可以启动并启用该进程。
$ sudo systemctl enable kibana --now
检查状态以确认它是否正在运行。
$ sudo systemctl status kibana
? kibana.service - Kibana
Loaded: loaded (/lib/systemd/system/kibana.service; enabled; preset: enabled)
Active: active (running) since Wed 2023-10-04 15:27:28 UTC; 9s ago
Docs: https://www.elastic.co
Main PID: 2686 (node)
Tasks: 11 (limit: 4652)
Memory: 241.5M
CPU: 9.902s
CGroup: /system.slice/kibana.service
??2686 /usr/share/kibana/bin/../node/bin/node /usr/share/kibana/bin/../src/cli/dist
Oct 04 15:27:28 kibana systemd[1]: Started kibana.service - Kibana.
步骤 10 - 安装并配置 Filebeat
需要注意的是,我们将在 Suricata 服务器上安装 Filebeat。因此,请切换回该服务器并添加 Elastic GPG 密钥以开始。
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
创建 elastic 仓库。
$ echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
更新系统仓库列表。
$ sudo apt update
按下 Ctrl + X 并输入 Y 确认以保存文件。
安装 Filebeat。
$ sudo apt install filebeat
在配置 Filebeat 之前,我们需要将 http_ca.crt 文件从 Elasticsearch 服务器复制到 Filebeat 服务器。在 Filebeat 服务器上运行以下命令。
$ scp username@your_public_ip:/etc/elasticsearch/certs/http_ca.crt /etc/filebeat
Filebeat 将其配置存储在 /etc/filebeat/filebeat.yml 文件中。打开它进行编辑。
$ sudo nano /etc/filebeat/filebeat.yml
你需要做的第一件事是将它连接到 Kibana 的仪表盘。在 Kibana 部分找到 #host: "localhost:5601" 这一行,并在其正下方添加如下行,如下所示。
. . .
# 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"
protocol: "http"
ssl.enabled: true
ssl.certificate_authorities: ["/etc/filebeat/http_ca.crt"]
. . .
接下来,找到文件中的 Elasticsearch Output(Elasticsearch 输出)部分,并按如下所示编辑 hosts、protocol、username 和 password 的值。对于用户名,请使用 elastic 作为值;对于密码,请使用本教程步骤 8 中生成的值。
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: "bd1YJfhSa8RC8SMvTIwg"
ssl.certificate_authorities: ["/etc/filebeat/http_ca.crt"]
ssl.verification_mode: full
. . .
在文件底部添加以下行。
setup.ilm.overwrite: true
完成后,按下 Ctrl + X 并输入 Y 确认以保存文件。要确保 Filebeat 连接到 Elasticsearch,还有一个步骤。我们需要将 Elasticsearch 的 SSL 信息传递给 Filebeat,它才能连接。
测试从 Filebeat 到 Elasticsearch 服务器的连接。系统会要求你输入 Elasticsearch 密码。
$ curl -v --cacert /etc/filebeat/http_ca.crt https://your_private_ip:9200 -u elastic
你将得到如下输出。
Enter host password for user 'elastic':
* Trying 10.133.0.2:9200...
* Connected to 10.133.0.2 (10.133.0.2) port 9200 (#0)
* ALPN: offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* CAfile: /etc/filebeat/http_ca.crt
* CApath: /etc/ssl/certs
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server did not agree on a protocol. Uses default.
* Server certificate:
* subject: CN=kibana
* start date: Oct 4 14:28:33 2023 GMT
* expire date: Oct 3 14:28:33 2025 GMT
* subjectAltName: host "10.133.0.2" matched cert's IP address!
* issuer: CN=Elasticsearch security auto-configuration HTTP CA
* SSL certificate verify ok.
* using HTTP/1.x
* Server auth using Basic with user 'elastic'
> GET / HTTP/1.1
> Host: 10.133.0.2:9200
> Authorization: Basic ZWxhc3RpYzpsaWZlc3Vja3M2NjIwMDI=
> User-Agent: curl/7.88.1
> Accept: */*
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
< HTTP/1.1 200 OK
< X-elastic-product: Elasticsearch
< content-type: application/json
< content-length: 530
<
{
"name" : "kibana",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "KGYx4poLSxKhPyOlYrMq1g",
"version" : {
"number" : "8.10.2",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "6d20dd8ce62365be9b1aca96427de4622e970e9e",
"build_date" : "2023-09-19T08:16:24.564900370Z",
"build_snapshot" : false,
"lucene_version" : "9.7.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
* Connection #0 to host 10.133.0.2 left intact
接下来,启用 Filebeat 内置的 Suricata 模块。
$ sudo filebeat modules enable suricata
打开 /etc/filebeat/modules.d/suricata.yml 文件进行编辑。
$ sudo nano /etc/filebeat/modules.d/suricata.yml
按如下所示编辑该文件。你需要将 enabled 变量的值改为 true。同时取消 var.paths 变量的注释,并按所示设置其值。
# Module: suricata
# Docs: https://www.elastic.co/guide/en/beats/filebeat/8.10/filebeat-module-suricata.html
- module: suricata
# All logs
eve:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths: ["/var/log/suricata/eve.json"]
完成后,按下 Ctrl + X 并输入 Y 确认以保存文件。
配置 Filebeat 的最后一步是使用 filebeat setup 命令将 SIEM 仪表盘和管道加载到 Elasticsearch。
$ sudo filebeat setup
该命令可能需要几分钟才能完成。完成后,你应该会收到如下输出。
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
Loaded Ingest pipelines
启动 Filebeat 服务。
$ sudo systemctl start filebeat
检查该服务的状态。
$ sudo systemctl status filebeat
步骤 11 - 访问 Kibana 仪表盘
由于 Kibana 被配置为只能通过其私有 IP 地址访问 Elasticsearch,你有两种方式来访问它。第一种方法是从你的电脑使用 SSH 隧道连接到 Elasticsearch 服务器。这会将你电脑上的 5601 端口转发到服务器的私有 IP 地址,你将能够从你电脑上的 http://localhost:5601 访问 Kibana。但这种方法意味着你将无法从其他地方访问它。
另一种选择是在你的 Suricata 服务器上安装 Nginx,并将其用作反向代理,通过私有 IP 地址访问 Elasticsearch 服务器。我们将讨论这两种方式。你可以根据自己的需求选择其中一种。
使用 SSH 本地隧道
如果你使用的是 Windows 10 或 Windows 11,可以从 Windows Powershell 运行 SSH 本地隧道。在 Linux 或 macOS 上,你可以使用终端。如果你尚未配置 SSH 访问,可能需要先进行配置。
在你电脑的终端中运行以下命令以创建 SSH 隧道。
$ ssh -L 5601:your_private_IP:5601 navjot@your_public_IP -N
- -L 标志指的是本地 SSH 隧道,它会将流量从你电脑的端口转发到服务器。
- private_IP:5601 是你的流量在服务器上被转发到的 IP 地址。在本例中,请将其替换为你 Elasticsearch 服务器的私有 IP 地址。
- your_public_IP 是 Elasticsearch 服务器的公网 IP 地址,用于建立 SSH 连接。
- -N 标志告诉 OpenSSH 不执行任何命令,而是在隧道运行期间保持连接。
现在隧道已打开,你可以通过在电脑浏览器中打开 URL http://localhost:5601 来访问 Kibana。你将看到如下界面。

只要你需要访问 Kibana,就需要保持该命令运行。在终端中按下 Ctrl + C 以关闭隧道。
使用 Nginx 反向代理
如果你想从世界任何地方访问仪表盘,这种方法最为合适。
配置防火墙
在继续之前,你需要在防火墙中开放 HTTP 和 HTTPS 端口。
$ sudo ufw allow http
$ sudo ufw allow https
安装 Nginx
Debian 12 自带较旧版本的 Nginx。要安装最新版本,你需要下载官方 Nginx 仓库。
导入 Nginx 的签名密钥。
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
添加 Nginx 稳定版的仓库。
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
更新系统仓库。
$ sudo apt update
安装 Nginx。
$ sudo apt install nginx
验证安装。由于我们是在 Debian 上,命令中的 sudo 是必需的。
$ sudo nginx -v
nginx version: nginx/1.24.0
启动 Nginx 服务器。
$ sudo systemctl start nginx
安装并配置 SSL
第一步是安装 Let's Encrypt SSL 证书。我们需要安装 Certbot 来生成 SSL 证书。你可以使用 Debian 的仓库安装 Certbot,也可以通过 Snapd 工具获取最新版本。我们将使用 Snapd 版本。
Debian 12 默认未安装 Snapd。请安装 Snapd 软件包。
$ sudo apt install snapd
运行以下命令,确保你的 Snapd 版本是最新的。
$ sudo snap install core && sudo snap refresh core
安装 Certbot。
$ sudo snap install --classic certbot
使用以下命令创建指向 /usr/bin 目录的符号链接,以确保可以运行 Certbot 命令。
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
确认 Certbot 是否已安装。
$ certbot --version
certbot 2.7.0
为域名 kibana.example.com 生成 SSL 证书。
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m
[email protected]
-d kibana.example.com
上述命令会将证书下载到你服务器上的 /etc/letsencrypt/live/kibana.example.com 目录。
生成一个 Diffie-Hellman 组证书。
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
要检查 SSL 续期是否正常工作,可以对该过程进行一次演练(dry run)。
$ sudo certbot renew --dry-run
如果你没有看到任何错误,说明一切都已就绪。你的证书将自动续期。
配置 Nginx
创建并打开 Kibana 的 Nginx 配置文件。
$ sudo nano /etc/nginx/conf.d/kibana.conf
将以下代码粘贴到其中。请将 IP 地址替换为你的 Elasticsearch 服务器的私有 IP 地址。
server {
listen 80; listen [::]:80;
server_name kibana.example.com;
return 301 https://$host$request_uri;
}
server {
server_name kibana.example.com;
charset utf-8;
listen 443 ssl http2;
listen [::]:443 ssl http2;
access_log /var/log/nginx/kibana.access.log;
error_log /var/log/nginx/kibana.error.log;
ssl_certificate /etc/letsencrypt/live/kibana.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/kibana.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/kibana.example.com/chain.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
resolver 8.8.8.8;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
location / {
proxy_pass http://your_private_IP:5601;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
按下 Ctrl + X 并输入 Y 确认以保存文件。
打开文件 /etc/nginx/nginx.conf 进行编辑。
$ sudo nano /etc/nginx/nginx.conf
在 include /etc/nginx/conf.d/*.conf; 这一行之前添加以下行。
server_names_hash_bucket_size 64;
按下 Ctrl + X 并输入 Y 确认以保存文件。
验证配置。
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重启 Nginx 服务。
$ sudo systemctl restart nginx
你的 Kibana 仪表盘应该可以通过 URL https://kibana.example.com 从任何你想访问的地方访问。
步骤 12 - 管理 Kibana 仪表盘
在继续管理仪表盘之前,你需要在 Kibana 的配置中添加 base URL 字段。
打开 Kibana 的配置文件。
$ sudo nano /etc/kibana/kibana.yml
找到被注释掉的行 #server.publicBaseUrl: "",并如下所示通过去掉前面的井号来修改它。
server.publicBaseUrl: "https://kibana.example.com"
按下 Ctrl + X 并输入 Y 确认以保存文件。
重启 Kibana 服务。
$ sudo systemctl restart kibana
等待几分钟,然后在浏览器中加载 URL https://kibana.example.com。你将看到注册令牌(enrollment token)输入框。请填入你在步骤 9 中生成的注册令牌。

点击 Configure Elastic 按钮继续。接下来,系统会要求你输入验证码。

切换回 Elasticsearch 终端,运行以下命令生成验证码。在页面中输入该验证码,然后点击 Verify 按钮继续。
$ sudo /usr/local/share/kibana/bin/kibana-verification-code
接下来,等待 Elastic 设置完成。这需要几分钟时间。

接下来,你将被重定向到登录界面。

使用用户名 elastic 和你之前生成的密码登录,你将看到如下界面。

在顶部的搜索框中输入 type:data suricata 以查找 Suricata 的相关信息。

点击第一个结果([Filebeat Suricata] Alert Overview),你将看到类似如下的界面。默认情况下,它只显示最近 15 分钟的条目,但为了在教程中展示更多数据,我们将其显示时间跨度调大了一些。

点击 Events 按钮以查看所有已记录的事件。

在事件和告警页面上向下滚动,你可以通过协议类型、源端口和目的端口以及源的 IP 地址来识别每个事件和告警。你还可以查看流量来源的国家/地区。
你可以使用 Kibana 和 Filebeat 访问并生成其他类型的仪表盘。其中一个你可以立即使用的实用内置仪表盘是安全(Security)仪表盘。从左侧汉堡菜单中点击 Security >> Explore 菜单。

在下一页中,选择 Network 选项以打开相关的仪表盘。

点击 Network 选项后,你将看到如下界面。

你可以通过启用并配置内置的 Filebeat 模块来添加更多像 Nginx 这样的仪表盘。
总结
本教程至此结束,介绍了如何在 Debian 12 服务器上安装和配置 Suricata IDS 以及 Elastic Stack。你还配置了 Nginx 作为反向代理,以便从外部访问 Kibana 仪表盘。如果你有任何问题,请在下方评论中留言。