本页内容

  • 先决条件
  • 第一部分
  • 步骤 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。你将看到如下界面。

在 Debian 12 上安装配置 Suricata IDS 与 Elastic Stack

只要你需要访问 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 中生成的注册令牌。

在 Debian 12 上安装配置 Suricata IDS 与 Elastic Stack

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

在 Debian 12 上安装配置 Suricata IDS 与 Elastic Stack

切换回 Elasticsearch 终端,运行以下命令生成验证码。在页面中输入该验证码,然后点击 Verify 按钮继续。

$ sudo /usr/local/share/kibana/bin/kibana-verification-code

接下来,等待 Elastic 设置完成。这需要几分钟时间。

在 Debian 12 上安装配置 Suricata IDS 与 Elastic Stack

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

在 Debian 12 上安装配置 Suricata IDS 与 Elastic Stack

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

在 Debian 12 上安装配置 Suricata IDS 与 Elastic Stack

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

在 Debian 12 上安装配置 Suricata IDS 与 Elastic Stack

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

在 Debian 12 上安装配置 Suricata IDS 与 Elastic Stack

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

在 Debian 12 上安装配置 Suricata IDS 与 Elastic Stack

在事件和告警页面上向下滚动,你可以通过协议类型、源端口和目的端口以及源的 IP 地址来识别每个事件和告警。你还可以查看流量来源的国家/地区。

你可以使用 Kibana 和 Filebeat 访问并生成其他类型的仪表盘。其中一个你可以立即使用的实用内置仪表盘是安全(Security)仪表盘。从左侧汉堡菜单中点击 Security >> Explore 菜单。

在 Debian 12 上安装配置 Suricata IDS 与 Elastic Stack

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

在 Debian 12 上安装配置 Suricata IDS 与 Elastic Stack

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

在 Debian 12 上安装配置 Suricata IDS 与 Elastic Stack

你可以通过启用并配置内置的 Filebeat 模块来添加更多像 Nginx 这样的仪表盘。

总结

本教程至此结束,介绍了如何在 Debian 12 服务器上安装和配置 Suricata IDS 以及 Elastic Stack。你还配置了 Nginx 作为反向代理,以便从外部访问 Kibana 仪表盘。如果你有任何问题,请在下方评论中留言。