如何在CentOS8Stream上安装Suricata

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

介绍

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

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

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

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

先决条件

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

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

  • 一台具有 2 个或更多 CPU、sudo 非 root 用户和启用防火墙的 Centos 8 Stream 服务器。 要进行设置,您可以按照我们的 Initial Server Setup with CentOS Linux 8 教程进行操作。

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

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


第 1 步 — 安装 Suricata

要开始安装 Suricata,您需要将开放信息安全基金会 (OISF) 的软件存储库信息添加到您的 CentOS 系统。 您可以使用 dnf copr enable 命令来执行此操作。 您还需要添加 Extra Packages for Enterprise Linux (EPEL) 存储库。

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

sudo dnf install 'dnf-command(copr)'

系统将提示您安装一些额外的依赖项,以及接受 CentOS Linux 发行版的 GPG 密钥。 每次按yENTER完成copr包的安装。

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

sudo dnf copr enable @oisf/suricata-6.0

当系统提示您确认要添加存储库时,按 yENTER

现在添加 epel-release 包,这将为 Suricata 提供一些额外的依赖包:

sudo dnf install epel-release

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

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

sudo dnf install suricata

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

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

sudo systemctl enable suricata.service

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

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

在继续本教程的下一部分(解释如何配置 Suricata)之前,使用 systemctl 停止服务:

sudo systemctl stop suricata.service

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

第 2 步 — 首次配置 Suricata

OISF 存储库中的 Suricata 包附带了一个配置文件,该文件涵盖了各种用例。 Suricata 的默认模式是 IDS 模式,因此不会丢弃任何流量,只会记录。 当您学习 Suricata 时,将此模式设置为默认值是一个好主意。 一旦您将 Suricata 配置并集成到您的环境中,并且对它会提醒您的流量类型有一个很好的了解,您就可以选择打开 IPS 模式。

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

(可选)启用社区流 ID

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

如果您打算将 Suricata 与 ZeekElasticsearch 等其他工具一起使用,现在添加社区 ID 是个好主意。

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

sudo vi /etc/suricata/suricata.yaml

找到显示为 # Community Flow ID 的第 120 行。 如果您使用 vi 输入 120gg 直接进入该行。 该行下方是 community-id 键。 将其设置为 true 以启用设置:

/etc/suricata/suricata.yaml

. . .
      # 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
. . .

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

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

确定要使用的网络接口

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

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

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 配置文件:

sudo vi /etc/suricata/suricata.yaml

滚动文件,直到在第 580 行出现 af-packet: 行。 如果您使用的是vi,您也可以通过输入580gg直接进入该行。 该行下方是 Suricata 将用于检查流量的默认接口。 编辑该行以匹配您的界面,如以下突出显示的示例:

/etc/suriata/suricata.yaml

# 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
. . .

如果要检查其他接口上的流量,可以添加更多 - interface: eth... YAML 对象。 例如,要添加一个名为 enp0s1 的设备,向下滚动到 af-packet 部分的底部到第 650 行附近。 要添加新接口,请将其插入 - interface: default 部分之前,如以下突出显示的示例:

/ec/suricata/suricata.yaml

    #  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

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

保持编辑器打开并继续下一部分,您将在其中配置实时规则重新加载。 如果您不想启用该设置,则可以保存并关闭 /etc/suricata/suricata.yaml 文件。 如果您正在使用 vi,您可以使用 ESC,然后使用 :xENTER 保存并退出。

配置实时规则重新加载

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

/etc/suricata/suricata.yaml

. . .

detect-engine:
  - rule-reload: true

有了这个设置,您将能够将 SIGUSR2 系统信号发送到正在运行的进程,并且 Suricata 会将任何更改的规则重新加载到内存中。

类似以下的命令将通知 Suricata 进程重新加载其规则集,而无需重新启动进程:

sudo kill -usr2 $(pidof suricata)

命令的 $(pidof suricata) 部分调用 subshell,并找到正在运行的 Suricata 守护程序的进程 ID。 命令的开头 sudo kill -usr2 部分使用 kill 实用程序将 SIGUSR2 信号发送到由子 shell 报告的进程 ID。

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

保存并关闭 /etc/suricata/suricata.yaml 文件。 如果您使用的是 vi,您可以使用 ESC,然后使用 :xENTER 进行确认。

第三步——更新 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 服务器下载最新的规则集:

sudo suricata-update

您应该收到如下输出:

Output19/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 Rules,并将它们保存到 Suricata 的 /var/lib/suricata/rules/suricata.rules 文件中。 它还指示已处理的规则数,在此示例中,添加了 31011 条,其中 23649 条已启用。

添加规则集提供程序

suricata-update 工具可以从各种免费和商业规则集提供商处获取规则。 某些规则集(例如您已添加的 ET Open 集)可免费使用,而其他规则集则需要付费订阅。

您可以使用 list-sources 标志到 suricata-update 列出默认的规则提供程序集,如下所示:

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 规则集,您可以使用以下命令启用它:

sudo suricata-update enable-source tgreen/hunting

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

第 4 步 - 验证 Suricata 的配置

既然您已经编辑了 Suricata 的配置文件以包含可选的社区 ID、指定默认网络接口并启用实时规则重新加载,那么测试配置是一个好主意。

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

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

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

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

Output21/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 的不存在的规则文件会生成如下错误:

Output21/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 命令:

sudo systemctl start suricata.service

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

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 日志中的特定消息,表明它已完成启动:

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

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

Output19/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 快速入门 建议使用 curl 命令测试编号为 2100498 的 ET Open 规则。

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

curl http://testmynids.org/uid/index.html

curl 命令将输出如下响应:

Outputuid=0(root) gid=0(root) groups=0(root)

此示例响应数据旨在触发警报,方法是假装返回类似 id 这样的命令的输出,该命令可能通过 web shell 在受感染的远程系统上运行。

现在您可以检查 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 规则标识符,使用以下命令搜索与其匹配的条目:

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

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

Output10/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 地址:

Output10/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 命令安装它:

sudo dnf install jq

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

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

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

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 的配置文件中启用的生成的社区流标识符。

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

任一日志文件中的匹配日志条目意味着 Suricata 成功检查了网络流量,将其与检测规则匹配,并生成警报以供后续分析或记录。 本系列未来的教程将探讨如何将 Suricata 警报发送到安全信息事件管理 (SIEM) 系统以进行进一步处理。

第 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 握手等标准完全丢弃流量。