如何在CentOS 8 Stream上安装Suricata

介绍

Suricata是一种网络安全监控(NSM)工具,它使用一组由社区创建和用户定义的签名(也称为规则)来检查和处理网络流量。Suricata可以生成日志事件,触发警报,并在检测到服务器上运行的任何数量不同服务的可疑数据包或请求时丢弃流量。

默认情况下,Suricata作为被动入侵检测系统(IDS)工作,用于扫描服务器或网络上的可疑流量。它会生成和记录警报以供进一步调查。它还可以配置为主动入侵防御系统(IPS),以记录、警报并完全阻止与特定规则匹配的网络流量。

您可以在网络中的网关主机上部署Suricata,以扫描来自其他系统的所有传入和传出网络流量,也可以在单独的机器上本地运行,以任一模式运行。

在本教程中,您将学习如何在Centos 8 Stream上安装Suricata,以及如何自定义一些默认设置以满足您的需求。您还将学习如何下载Suricata用于扫描网络流量的现有签名集(通常称为规则集)。最后,您将学习如何测试Suricata在检测到可疑请求和数据时是否正常工作。

先决条件

根据您的网络配置以及您打算如何使用Suricata,您可能需要为服务器分配更多或更少的CPU和RAM。通常,您计划检查的流量越多,您就应该为Suricata分配更多的资源。在生产环境中,建议至少使用2个CPU和4或8GB的RAM来启动。从那里开始,您可以根据Suricata的性能和您需要处理的流量来扩展资源。

如果您计划使用Suricata来保护运行的服务器,您将需要:

否则,如果您计划在网关主机上使用Suricata来监视和保护多个服务器,则需要确保主机的网络配置正确。

如果您正在使用DigitalOcean,您可以按照这篇指南上的如何将Droplet配置为VPC网关进行操作。这些说明也适用于大多数CentOS、Fedora和其他RedHat衍生的服务器。

步骤1 — 安装Suricata

要开始安装Suricata,您需要将Open Information Security Foundation(OISF)的软件仓库信息添加到您的CentOS系统中。您可以使用dnf copr enable命令来完成此操作。您还需要添加额外的企业Linux(EPEL)软件仓库。

要启用dnf软件包工具的Community Projects(copr)子命令,请运行以下命令:

  1. sudo dnf install 'dnf-command(copr)'

您将被提示安装一些附加依赖项,并接受CentOS Linux发行版的GPG密钥。每次按yENTER键完成安装copr软件包。

接下来运行以下命令将OISF仓库添加到您的系统并更新可用软件包列表:

  1. sudo dnf copr enable @oisf/suricata-6.0

当提示您确认要添加仓库时,请按yENTER键。

现在添加epel-release软件包,这将使一些额外的依赖软件包对Suricata可用:

  1. sudo dnf install epel-release

当提示您导入GPG密钥时,请按yENTER键接受。

现在,您已经启用了所需的软件仓库,可以使用dnf命令安装suricata软件包:

  1. sudo dnf install suricata

当提示添加OISF存储库的GPG密钥时,请按yENTER键。包及其依赖项现在将被下载并安装。

接下来,启用suricata.service,以便在系统重新启动时运行。使用systemctl命令启用它:

  1. sudo systemctl enable suricata.service

您应该会收到如下输出,指示服务已启用:

Output
Created symlink /etc/systemd/system/multi-user.target.wants/suricata.service → /usr/lib/systemd/system/suricata.service.

在继续本教程的下一部分之前,即配置Suricata的部分,使用systemctl停止服务:

  1. sudo systemctl stop suricata.service

停止Suricata可以确保在您编辑和测试配置文件时,所做的任何更改在Suricata再次启动时都将被验证和加载。

步骤2 — 第一次配置Suricata

OISF存储库中的Suricata软件包提供了一个覆盖各种用例的配置文件。Suricata的默认模式是IDS模式,因此不会丢弃任何流量,只会记录日志。在学习Suricata时将此模式保持为默认模式是个好主意。一旦您已经配置了Suricata并将其集成到您的环境中,并且对其警报您的流量类型有了一个很好的了解,您可以选择切换到IPS模式。

然而,默认配置仍然具有一些您可能需要根据您的环境和需求进行更改的设置。

(可选)启用社区流ID

Suricata可以在其JSON输出中包含一个Community ID字段,以便更容易地将单个事件记录与其他工具生成的数据集中的记录进行匹配。

如果您计划将Suricata与其他工具(如ZeekElasticsearch)一起使用,则现在添加Community ID是一个好主意。

要启用此选项,请使用vi或您喜欢的编辑器打开/etc/suricata/suricata.yaml

  1. sudo vi /etc/suricata/suricata.yaml

找到第120行,该行读取# Community Flow ID。如果您使用vi,则键入120gg以直接转到该行。该行下方是community-id键。将其设置为true以启用该设置:

/etc/suricata/suricata.yaml
. . .
      # Community Flow ID
      # 将'community_id'字段添加到EVE记录中。这些记录旨在提供
      # 可预测的流ID,可用于将记录与
      # 其他工具(如Zeek(Bro))的输出匹配。
      #
      # 需要跨传感器和工具保持相同的“种子”
      # 以使id不太可预测。

      # 启用/禁用community id功能。
      community-id: true
. . .

现在当您检查事件时,它们将具有类似于 1:S+3BA2UmrHK0Pk+u3XH78GAFTtQ= 的 ID,您可以使用该 ID 在不同的 NMS 工具之间关联记录。

保存并关闭 /etc/suricata/suricata.yaml 文件。如果您正在使用 vi,您可以按 ESC,然后输入 :x,然后按 ENTER 以保存并退出文件。

确定要使用的网络接口

您可能需要覆盖 Suricata 要检查流量的默认网络接口或接口。随 OISF Suricata 包提供的配置文件默认检查名为 eth0 的设备上的流量。如果您的系统使用不同的默认网络接口,或者如果您想要检查多个接口上的流量,则需要更改此值。

要确定默认网络接口的设备名称,您可以使用如下 ip 命令:

  1. ip -p -j route show default

-p 标志使输出更易读,-j 标志将输出打印为 JSON。

您应该会收到如下输出:

Output
[ { "dst": "default", "gateway": "203.0.113.254", "dev": "eth0", "protocol": "static", "metric": 100, "flags": [ ] } ]

dev行表示默认设备。在这个示例输出中,设备是突出显示的eth0接口。您的输出可能会显示类似ens...eno...的设备名称。无论名称是什么,都要记下来。

现在,您可以编辑Suricata的配置并验证或更改接口名称。使用vi或您喜欢的编辑器打开/etc/suricata/suricata.yaml配置文件:

  1. sudo vi /etc/suricata/suricata.yaml

滚动文件直到找到大约在第580行左右的一行,其内容为af-packet:。如果您使用的是vi,您还可以通过输入580gg直接跳转到该行。在该行下方是Suricata将用于检查流量的默认接口。编辑该行以匹配您的接口,就像以下突出显示的示例一样:

/etc/suriata/suricata.yaml
# Linux高速捕获支持
af-packet:
  - interface: eth0
    # 接收线程数。“auto”使用核心数
    #threads: auto
    # 默认集群ID。AF_PACKET将根据流负载均衡数据包。
    cluster-id: 99
. . .

如果您想要检查额外接口上的流量,可以添加更多- interface: eth... YAML对象。例如,要添加名为enp0s1的设备,请滚动到大约在第650行左右的af-packet部分的底部。要添加新接口,请在以下突出显示的示例之前将其插入到- interface: default部分之前:

/ec/suricata/suricata.yaml
    #  对于包括绕过、过滤和负载均衡的 eBPF 和 XDP 设置,请
    #  参阅 doc/userguide/capture-hardware/ebpf-xdp.rst 以获取更多信息。

  - interface: enp0s1
cluster-id: 98

  - interface: default
    #线程:自动
    #使用 mmap:否
    #tpacket-v3:是

确保为每个 - interface 对象选择唯一的 cluster-id 值。

保持编辑器打开,然后转到下一节,您将在其中配置实时规则重新加载。如果您不想启用该设置,那么可以保存并关闭 /etc/suricata/suricata.yaml 文件。如果您使用的是 vi,您可以按 ESC,然后输入 :x 并按 ENTER 以保存并退出。

配置实时规则重新加载

Suricata 支持实时规则重新加载,这意味着您可以在无需重新启动运行中的 Suricata 进程的情况下添加、删除和编辑规则。要启用实时重新加载选项,请滚动到配置文件的底部,并添加以下行:

/etc/suricata/suricata.yaml
. . .

detect-engine:
  - rule-reload: true

有了这个设置,您就可以向运行中的进程发送 SIGUSR2 系统信号,Suricata 将重新加载任何已更改的规则到内存中。

A command like the following will notify the Suricata process to reload its rulesets, without restarting the process:

  1. sudo kill -usr2 $(pidof suricata)

命令中的$(pidof suricata)部分调用了一个子shell,并查找正在运行的Suricata守护进程的进程ID。命令的开头sudo kill -usr2部分使用kill实用程序向子shell返回的进程ID发送SIGUSR2信号。

您可以在运行suricata-update时或添加或编辑自己的自定义规则时随时使用此命令。

保存并关闭/etc/suricata/suricata.yaml文件。如果您使用vi,可以通过ESC,然后:xENTER来执行此操作。

第3步 — 更新Suricata规则集

在本教程的这一步骤中,如果您启动Suricata,您将收到类似以下内容的警告消息,指示日志中没有加载的规则:

Output
<Warning> - [ERRCODE: SC_ERR_NO_RULES(42)] - No rule files match the pattern /var/lib/suricata/rules/suricata.rules

默认情况下,Suricata软件包包含一组有限的检测规则(位于/etc/suricata/rules目录中),因此此时启动Suricata将仅检测到有限数量的恶意流量。

Suricata包含一个名为suricata-update的工具,可以从外部提供程序获取规则集。请按照以下方式运行它,以下载适用于您的Suricata服务器的最新规则集:

  1. sudo suricata-update

您应该收到以下类似的输出:

Output
19/10/2021 -- 19:31:03 - <Info> -- Using data-directory /var/lib/suricata. 19/10/2021 -- 19:31:03 - <Info> -- Using Suricata configuration /etc/suricata/suricata.yaml 19/10/2021 -- 19:31:03 - <Info> -- Using /usr/share/suricata/rules for Suricata provided rules. . . . 19/10/2021 -- 19:31:03 - <Info> -- No sources configured, will use Emerging Threats Open 19/10/2021 -- 19:31:03 - <Info> -- Fetching https://rules.emergingthreats.net/open/suricata-6.0.3/emerging.rules.tar.gz. 100% - 3062850/3062850 . . . 19/10/2021 -- 19:31:06 - <Info> -- Writing rules to /var/lib/suricata/rules/suricata.rules: total: 31011; enabled: 23649; added: 31011; removed 0; modified: 0 19/10/2021 -- 19:31:07 - <Info> -- Writing /var/lib/suricata/rules/classification.config 19/10/2021 -- 19:31:07 - <Info> -- Testing with suricata -T. 19/10/2021 -- 19:31:32 - <Info> -- Done.

突出显示的行表示 suricata-update 已经获取了免费的Emerging Threats ET Open规则,并将它们保存到Suricata的 /var/lib/suricata/rules/suricata.rules 文件中。它还指示了处理的规则数量,在这个例子中,添加了31011条规则,其中23649条被启用。

添加规则集提供商

suricata-update 工具可以从各种免费和商业规则集提供商那里获取规则。像你已经添加的ET Open集合这样的一些规则集是免费提供的,而其他一些则需要付费订阅。

您可以使用以下方式使用 suricata-updatelist-sources 标志列出默认的规则提供商:

  1. sudo suricata-update list-sources

您将收到类似以下的来源列表:

Output
. . . 19/10/2021 -- 19:27:34 - <Info> -- Adding all sources 19/10/2021 -- 19:27:34 - <Info> -- Saved /var/lib/suricata/update/cache/index.yaml Name: et/open Vendor: Proofpoint Summary: Emerging Threats Open Ruleset License: MIT . . .

例如,如果您想包含 tgreen/hunting 规则集,您可以使用以下命令启用它:

  1. sudo suricata-update enable-source tgreen/hunting

然后再次运行 suricata-update,新的规则集将被添加,除了现有的ET Open规则和您已经下载的其他规则。

第四步 — 验证 Suricata 的配置

现在您已经编辑了 Suricata 的配置文件,包括可选的 Community ID,指定了默认网络接口,并启用了实时规则重载,最好测试一下配置。

Suricata 有一个内置的测试模式,可以检查配置文件和任何包含的规则的有效性。使用 -T 标志运行 Suricata 的测试模式,验证您在上一节中所做的更改。-v 标志将打印一些额外的信息,-c 标志告诉 Suricata 在哪里找到其配置文件:

  1. sudo suricata -T -c /etc/suricata/suricata.yaml -v

测试可能需要一些时间,具体取决于您为 Suricata 分配的 CPU 数量以及您添加的规则数量,因此请准备等待一两分钟以完成测试。

使用默认的 ET Open 规则集,您应该会收到以下输出:

Output
21/10/2021 -- 15:00:40 - <Info> - Running suricata under test mode 21/10/2021 -- 15:00:40 - <Notice> - This is Suricata version 6.0.3 RELEASE running in SYSTEM mode 21/10/2021 -- 15:00:40 - <Info> - CPUs/cores online: 2 21/10/2021 -- 15:00:40 - <Info> - fast output device (regular) initialized: fast.log 21/10/2021 -- 15:00:40 - <Info> - eve-log output device (regular) initialized: eve.json 21/10/2021 -- 15:00:40 - <Info> - stats output device (regular) initialized: stats.log 21/10/2021 -- 15:00:46 - <Info> - 1 rule files processed. 23879 rules successfully loaded, 0 rules failed 21/10/2021 -- 15:00:46 - <Info> - Threshold config parsed: 0 rule(s) found 21/10/2021 -- 15:00:47 - <Info> - 23882 signatures processed. 1183 are IP-only rules, 4043 are inspecting packet payload, 18453 inspect application layer, 107 are decoder event only 21/10/2021 -- 15:01:13 - <Notice> - Configuration provided was successfully loaded. Exiting. 21/10/2021 -- 15:01:13 - <Info> - cleaning up signature grouping structure... complete

如果您的配置文件中有错误,则测试模式将生成特定的错误代码和消息,您可以使用这些来帮助排除故障。例如,包含一个不存在的名为 test.rules 的规则文件将生成以下错误:

Output
21/10/2021 -- 15:10:15 - <Info> - Running suricata under test mode 21/10/2021 -- 15:10:15 - <Notice> - This is Suricata version 6.0.3 RELEASE running in SYSTEM mode 21/10/2021 -- 15:10:15 - <Info> - CPUs/cores online: 2 21/10/2021 -- 15:10:15 - <Info> - eve-log output device (regular) initialized: eve.json 21/10/2021 -- 15:10:15 - <Info> - stats output device (regular) initialized: stats.log 21/10/2021 -- 15:10:21 - <Warning> - [ERRCODE: SC_ERR_NO_RULES(42)] - No rule files match the pattern /var/lib/suricata/rules/test.rules

有了这个错误,您可以编辑您的配置文件以包含正确的路径,或修复无效的变量和配置选项。

一旦您的 Suricata 测试模式运行成功,您可以继续下一步,即启动 Suricata 以守护进程模式运行。

步骤 5 —— 运行 Suricata

现在您有了有效的 Suricata 配置和规则集,可以启动 Suricata 服务器。运行以下 systemctl 命令:

  1. sudo systemctl start suricata.service

您可以使用 systemctl status 命令检查服务的状态:

  1. sudo systemctl status suricata.service

您应该会收到如下输出:

Output
● suricata.service - Suricata Intrusion Detection Service Loaded: loaded (/usr/lib/systemd/system/suricata.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2021-10-21 18:22:56 UTC; 1min 57s ago Docs: man:suricata(1) Process: 24588 ExecStartPre=/bin/rm -f /var/run/suricata.pid (code=exited, status=0/SUCCESS) Main PID: 24590 (Suricata-Main) Tasks: 1 (limit: 23473) Memory: 80.2M CGroup: /system.slice/suricata.service └─24590 /sbin/suricata -c /etc/suricata/suricata.yaml --pidfile /var/run/suricata.pid -i eth0 --user suricata Oct 21 18:22:56 suricata systemd[1]: Starting Suricata Intrusion Detection Service.. Oct 21 18:22:56 suricata systemd[1]: Started Suricata Intrusion Detection Service. . . .

与测试模式命令一样,Suricata 需要一两分钟来加载和解析所有规则。您可以使用 tail 命令监视 Suricata 日志中指示其已完成启动的特定消息:

  1. sudo tail -f /var/log/suricata/suricata.log

您会收到多行输出,终端可能会在 Suricata 加载时似乎卡住。继续等待输出,直到收到如下一行:

Output
19/10/2021 -- 19:22:39 - <Info> - All AFP capture threads are running.

这行表示 Suricata 正在运行并准备检查流量。您可以使用 CTRL+C 退出 tail 命令。

现在您已经验证了 Suricata 正在运行,本教程的下一步是检查 Suricata 是否检测到针对旨在生成警报的测试 URL 的请求。

步骤 6 — 测试 Suricata 规则

您下载的 ET Open 规则集包含超过 30000 条规则。如何 Suricata 规则工作以及如何构建它们的完整解释超出了本入门教程的范围。本系列的后续教程将解释规则的工作原理以及如何构建您自己的规则。

对于本教程的目的,测试 Suricata 是否使用您生成的配置检测到可疑流量就足够了。《Suricata 快速入门》建议使用编号为 2100498 的 ET Open 规则进行测试,使用 curl 命令。

运行以下命令生成 HTTP 请求,这将返回一个与 Suricata 警报规则匹配的响应:

  1. curl http://testmynids.org/uid/index.html
Output
uid=0(root) gid=0(root) groups=0(root)

现在您可以检查 Suricata 的日志是否有相应的警报。默认 Suricata 配置启用了两个日志。第一个位于 /var/log/suricata/fast.log,第二个是机器可读日志位于 /var/log/suricata/eve.log

检查 /var/log/suricata/fast.log

要检查 /var/log/suricata/fast.log 中与您的 curl 请求对应的日志条目,使用 grep 命令。使用快速入门文档中的 2100498 规则标识符,使用以下命令搜索匹配的条目:

  1. grep 2100498 /var/log/suricata/fast.log

如果您的请求使用了 IPv6,则您应该会收到如下输出,其中 2001:DB8::1 是您系统的公共 IPv6 地址:

Output
10/21/2021-18:35:54.950106 [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 2600:9000:2000:4400:0018:30b3:e400:93a1:80 -> 2001:DB8::1:34628

如果您的请求使用了 IPv4,则您的日志应该有如下消息,其中 203.0.113.1 是您系统的公共 IPv4 地址:

Output
10/21/2021-18:35:57.247239 [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 204.246.178.81:80 -> 203.0.113.1:36364

注意输出中突出显示的 2100498 值,这是 Suricata 用于识别规则的签名 ID (sid)。

检查 /var/log/suricata/eve.log

Suricata 还会使用 JSON 格式记录事件到 /var/log/suricata/eve.log(别名为 EVE 日志)。

Suricata文档建议使用jq实用工具来读取和过滤此文件中的条目。 如果您的系统上没有安装jq,请使用以下dnf命令安装:

  1. sudo dnf install jq

安装jq后,您可以使用以下命令搜索EVE日志中的事件以查找2100498签名:

  1. jq 'select(.alert .signature_id==2100498)' /var/log/suricata/eve.json

该命令检查每个JSON条目,并打印任何具有匹配您正在搜索的2100498值的alert对象的条目。 输出将类似于以下内容:

Output
{ "timestamp": "2021-10-21T19:42:47.368856+0000", "flow_id": 775889108832281, "in_iface": "eth0", "event_type": "alert", "src_ip": "203.0.113.1", "src_port": 80, "dest_ip": "147.182.148.159", "dest_port": 38920, "proto": "TCP", "community_id": "1:vuSfAFyy7oUq0LQC5+KNTBSuPxg=", "alert": { "action": "allowed", "gid": 1, "signature_id": 2100498, "rev": 7, "signature": "GPL ATTACK_RESPONSE id check returned root", "category": "Potentially Bad Traffic", . . . }

请注意突出显示的"signature_id": 2100498,行,这是jq正在搜索的关键字。 还请注意JSON输出中突出显示的"community_id": "1:vuSfAFyy7oUq0LQC5+KNTBSuPxg=",行。 此键是您在Suricata配置文件中启用的生成的Community Flow标识符。

每个警报将生成唯一的Community Flow标识符。 其他NMS工具也可以生成相同的标识符,以便将Suricata警报与其他工具的输出进行交叉引用。

A matching log entry in either log file means that Suricata successfully inspected the network traffic, matched it against a detection rule, and generated an alert for subsequent analysis or logging. A future tutorial in this series will explore how to send Suricata alerts to a Security Information Event Management (SIEM) system for further processing.

第7步 — 处理Suricata警报

一旦您设置并测试了警报,您可以选择如何处理它们。对于某些用例,仅记录警报以进行审计可能已经足够;或者您可能更喜欢采取更积极的方式,阻止生成重复警报的系统的流量。

如果您想要根据Suricata生成的警报阻止流量,一种方法是使用来自EVE日志的条目,然后添加防火墙规则以限制对您的系统或系统的访问。您可以使用jq工具从警报中提取特定字段,然后添加UFW或IPtables规则以阻止请求。

同样,这个例子是一个假设的场景,使用了经过精心制作的请求和响应数据。您对您的环境应该能够访问的系统和协议的了解是至关重要的,以确定哪些流量是合法的,哪些可以被阻止。

结论

在本教程中,您从OISF软件仓库安装了Suricata。以这种方式安装Suricata可以确保您在Suricata发布新版本时能够接收更新。安装Suricata后,您编辑了默认配置,添加了一个用于其他安全工具的社区流ID。您还启用了实时规则重新加载,并下载了一组初始规则。

一旦您验证了Suricata的配置,您就开始了进程并生成了一些测试HTTP流量。您通过检查默认日志来验证Suricata是否能够检测到可疑流量,以确保它们包含与您正在测试的规则相对应的警报。

有关Suricata的更多信息,请访问官方Suricata网站。有关您在本教程中配置的任何配置选项的更多详细信息,请参阅Suricata用户指南

现在您已经安装并配置了Suricata,您可以继续进行这个系列中的下一个教程理解Suricata签名,在那里您将学习如何编写您自己的定制Suricata规则。您将了解不同的创建警报的方法,甚至如何根据诸如无效的TCP/IP数据包、DNS查询的内容、HTTP请求和响应,甚至TLS握手等条件来丢弃流量。

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-suricata-on-centos-8-stream