如何在 Rocky Linux 8 上安装 Suricata

介绍

Suricata是一个网络安全监控(NSM)工具,使用社区创建和用户定义的签名集(也称为规则)来检查和处理网络流量。

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

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

在本教程中,您将学习如何安装Suricata,以及如何在Rocky Linux 8上定制一些默认设置以满足您的需求。您还将学习如何下载Suricata用于扫描网络流量的现有签名集(通常称为规则集)。

前提条件

根据你的网络配置和你打算如何使用Suricata,你可能需要更多的CPU和RAM为你的服务器. 一般来说,你计划检查的流量越多,你应该分配更多的资源Suricata. 在一个生产环境计划中,使用至少2个CPU和4或8GB的RAM开始。

如果您打算使用 Suricata 来保护它正在运行的服务器,您将需要:

  • 一个 Rocky Linux 8 服务器有 2 个或更多 CPU,一个 sudo 非 root 用户和启用防火墙. 要设置此功能,您可以遵循我们的 初始服务器设置与 Rocky Linux 8 教程.

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

<$>[info] 如果您正在使用DigitalOcean,您可以在 如何将Droplet配置为VPC网关上遵循此指南。

步骤 1 - 安装 Suricata

要开始安装 Suricata,您需要将Open Information Security Foundation(OISF)软件库信息添加到您的Rocky Linux系统中,您可以使用dnf copr enable命令来执行此操作,您还需要添加Extra Packages for Enterprise Linux(EPEL)库。

若要启用dnf包工具的社区项目(copr)子命令,请执行以下操作:

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

您将被要求安装一些额外的依赖,以及接受 Rocky Linux 发行版的 GPG 密钥. 每次按yENTER,以完成copr包的安装。

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

1sudo dnf copr enable @oisf/suricata-6.0

当您被要求确认要添加存储库时,按yENTER

现在,添加苹果释放包,这将为Suricata提供一些额外的成瘾包:

1sudo dnf install epel-release

当您被要求导入 GPG 密钥时,请按yENTER来接受。

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

1sudo dnf install suricata

当您被要求添加 OISF 存储库的 GPG 密钥时,请按yENTER

接下来,启用suricata.service,以便在系统重新启动时运行。

1sudo systemctl enable suricata.service

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

1[secondary_label Output]
2Created symlink /etc/systemd/system/multi-user.target.wants/suricata.service → /usr/lib/systemd/system/suricata.service.

在继续本教程的下一节,它解释了如何配置Suricata,停止使用systemctl的服务:

1sudo systemctl stop suricata.service

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

步骤 2 – 首次配置 Suricata

来自OISF存储库的Suricata包配备了一个配置文件,涵盖了广泛的使用情况。Suricata的默认模式是IDS模式,所以不会丢失任何流量,只会登录。在学习Suricata时,将此模式设置为默认是一个好主意。一旦Suricata已配置并集成到您的环境中,并对它会提醒您的流量类型有一个很好的想法,您可以选择启用IPS模式。

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

(可选) 启用社区流 ID

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

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

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

1sudo vi /etc/suricata/suricata.yaml

查找# Community Flow ID的 120 行,如果使用vi键入120gg,直接进入该行。

 1[label /etc/suricata/suricata.yaml]
 2. . .
 3      # Community Flow ID
 4      # Adds a 'community_id' field to EVE records. These are meant to give
 5      # records a predictable flow ID that can be used to match records to
 6      # output of other tools such as Zeek (Bro).
 7      #
 8      # Takes a 'seed' that needs to be same across sensors and tools
 9      # to make the id less predictable.
10
11      # enable/disable the community id feature.
12      community-id: true
13. . .

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

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

决定使用哪个网络接口(s)

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

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

1ip -p -j route show default

-p 旗将输出格式化,使其更易于阅读,而 -j 旗将输出打印为 JSON。

您应该获得如下类型的输出:

1[secondary_label Output]
2[ {
3        "dst": "default",
4        "gateway": "203.0.113.254",
5        "dev": "eth0",
6        "protocol": "static",
7    	"metric": 100,
8        "flags": [ ]
9    } ]

dev 行表示默认设备. 在本示例输出中,该设备是突出的 eth0 接口. 您的输出可能会显示设备名称,例如 ens...eno...

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

1sudo vi /etc/suricata/suricata.yaml

如果您正在使用vi,您也可以通过输入580gg直接进入该行,直到您到达一行,该行是Suricata将使用的默认接口来检查流量。

1[label /etc/suriata/suricata.yaml]
2# Linux high speed capture support
3af-packet:
4  - interface: eth0
5    # Number of receive threads. "auto" uses the number of cores
6    #threads: auto
7    # Default clusterid. AF_PACKET will load balance packets based on flow.
8    cluster-id: 99
9. . .

如果你想检查额外的界面上的流量,你可以添加更多的 - 界面: eth... YAML 对象. 例如,要添加一个名为 enp0s1’ 的设备,请向下滚动到按包`部分的底部,到大约 650 行。

 1[label /ec/suricata/suricata.yaml]
 2    #  For eBPF and XDP setup including bypass, filter and load balancing, please
 3    #  see doc/userguide/capture-hardware/ebpf-xdp.rst for more info.
 4
 5  - interface: enp0s1
 6    cluster-id: 98
 7
 8  - interface: default
 9    #threads: auto
10    #use-mmap: no
11    #tpacket-v3: yes

请确保为每个- 接口对象选择一个独特的cluster-id值。

保持你的编辑器打开,并继续到下一个部分,在那里你将配置实时规则重新加载. 如果你不想启用这个设置,那么你可以保存和关闭 /etc/suricata/suricata.yaml 文件. 如果你正在使用 vi,你可以这样做与 ESC,然后 :xENTER 保存和停止。

配置 Live Rule 重新加载

Suricata 支持实时规则重新加载,这意味着您可以添加、删除和编辑规则,而无需重新启动运行的 Suricata 流程。

1[label /etc/suricata/suricata.yaml]
2. . .
3
4detect-engine:
5  - rule-reload: true

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

下列命令会通知Suricata流程重新加载其规则集,而不会重新启动流程:

1sudo kill -usr2 $(pidof suricata)

命令的「$(pidof suricata)」部分召唤一个 subshell,并找到正在运行的 Suricata Daemon 的进程 ID。

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

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

步骤 3 – 更新Suricata规则

在本教程的这一点上,如果您要启动Suricata,您将在日志中收到一个警告消息,如下:没有加载的规则:

1[secondary_label Output]
2<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的工具,可以从外部提供商获取规则集。

1sudo suricata-update

您应该获得如下类型的输出:

 1[secondary_label Output]
 219/10/2021 -- 19:31:03 - <Info> -- Using data-directory /var/lib/suricata.
 319/10/2021 -- 19:31:03 - <Info> -- Using Suricata configuration /etc/suricata/suricata.yaml
 419/10/2021 -- 19:31:03 - <Info> -- Using /usr/share/suricata/rules for Suricata provided rules.
 5. . .
 619/10/2021 -- 19:31:03 - <Info> -- No sources configured, will use Emerging Threats Open
 719/10/2021 -- 19:31:03 - <Info> -- Fetching https://rules.emergingthreats.net/open/suricata-6.0.3/emerging.rules.tar.gz.
 8 100% - 3062850/3062850               
 9. . .
1019/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
1119/10/2021 -- 19:31:07 - <Info> -- Writing /var/lib/suricata/rules/classification.config
1219/10/2021 -- 19:31:07 - <Info> -- Testing with suricata -T.
1319/10/2021 -- 19:31:32 - <Info> -- Done.

突出列出的行表示「suricata-update」已获取免费的新兴威胁 ET 开放规则,并将其保存到 Suricata 的 `/var/lib/suricata/rules/suricata.rules' 文件中。

添加规则供应商

suricata-update工具可以从各种免费和商业规则集提供商那里获取规则,有些规则集,如您已经添加的ET Open套件,可免费使用,而其他则需要付费订阅。

您可以使用清单源标志列出规则提供商的默认集为suricata-update如下:

1sudo suricata-update list-sources

您将收到如下来源的列表:

1[secondary_label Output]
2. . .
319/10/2021 -- 19:27:34 - <Info> -- Adding all sources
419/10/2021 -- 19:27:34 - <Info> -- Saved /var/lib/suricata/update/cache/index.yaml
5Name: et/open
6  Vendor: Proofpoint
7  Summary: Emerging Threats Open Ruleset
8  License: MIT
9. . .

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

1sudo suricata-update enable-source tgreen/hunting

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

步骤 4 – 验证 Suricata 配置

现在,您已编辑 Suricata 配置文件以包括可选的社区 ID,指定默认网络接口,并启用实时规则重新加载,这是一个很好的想法来测试配置。

Suricata有一个内置的测试模式,将检查配置文件和任何包含的规则的有效性。使用T旗验证您从上一节的更改,以在测试模式下运行Suricata。

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

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

使用默认的 ET 开放规则,您应该收到如下的输出:

 1[secondary_label Output]
 221/10/2021 -- 15:00:40 - <Info> - Running suricata under test mode
 321/10/2021 -- 15:00:40 - <Notice> - This is Suricata version 6.0.3 RELEASE running in SYSTEM mode
 421/10/2021 -- 15:00:40 - <Info> - CPUs/cores online: 2
 521/10/2021 -- 15:00:40 - <Info> - fast output device (regular) initialized: fast.log
 621/10/2021 -- 15:00:40 - <Info> - eve-log output device (regular) initialized: eve.json
 721/10/2021 -- 15:00:40 - <Info> - stats output device (regular) initialized: stats.log
 821/10/2021 -- 15:00:46 - <Info> - 1 rule files processed. 23879 rules successfully loaded, 0 rules failed
 921/10/2021 -- 15:00:46 - <Info> - Threshold config parsed: 0 rule(s) found
1021/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
1121/10/2021 -- 15:01:13 - <Notice> - Configuration provided was successfully loaded. Exiting.
1221/10/2021 -- 15:01:13 - <Info> - cleaning up signature grouping structure... complete

如果您的配置文件出现错误,那么测试模式会生成一个特定的错误代码和消息,您可以使用它来帮助解决问题,例如,包括一个不存在的规则文件,称为test.rules,会生成以下错误:

1[secondary_label Output]
221/10/2021 -- 15:10:15 - <Info> - Running suricata under test mode
321/10/2021 -- 15:10:15 - <Notice> - This is Suricata version 6.0.3 RELEASE running in SYSTEM mode
421/10/2021 -- 15:10:15 - <Info> - CPUs/cores online: 2
521/10/2021 -- 15:10:15 - <Info> - eve-log output device (regular) initialized: eve.json
621/10/2021 -- 15:10:15 - <Info> - stats output device (regular) initialized: stats.log
721/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 在 Daemon 模式中。

步骤5 - 运行Suricata

现在你有有效的 Suricata 配置和 ruleset,你可以启动 Suricata 服务器。

1sudo systemctl start suricata.service

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

1sudo systemctl status suricata.service

您应该获得如下类型的输出:

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

与测试模式命令一样,Suricata需要一两分钟的时间来加载和解析所有规则,您可以使用尾巴命令在Suricata的日志中查看一个特定的消息,表明它已经完成开始:

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

您将收到一系列输出线,而终端可能会在Suricata加载时出现堵塞,继续等待输出,直到您收到如下的一行:

1[secondary_label Output]
219/10/2021 -- 19:22:39 - <Info> - All AFP capture threads are running.

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

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

步骤6 – 测试Suricata规则

您下载的ET开放规则集包含超过30000条规则。关于Suricata规则的完整解释,以及如何构建它们,超出了本介绍性教程的范围。

对于本教程的目的,测试 Suricata 是否使用您生成的配置检测可疑流量是足够的。

运行以下操作来生成 HTTP 请求,该请求将返回符合 Suricata 警报规则的响应:

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

curl命令将产生如下答案:

1[secondary_label Output]
2uid=0(root) gid=0(root) groups=0(root)

此示例响应数据旨在通过假装返回可能通过网络壳在受损的远程系统上运行的id等命令的输出来触发警报。

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

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

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

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

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

1[secondary_label Output]
210/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地址:

1[secondary_label Output]
210/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(侧面)。

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

Suricata 还会将事件记录到 `/var/log/suricata/eve.log (命名为 EVE 日志) 使用 JSON 来格式化条目。

Suricata 文档建议使用 jq 实用程序来阅读和过滤此文件中的条目. 安装 jq 如果您没有在您的系统上使用以下 dnf 命令:

1sudo dnf install jq

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

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

该命令检查每个 JSON 条目,并打印任何具有警告对象的条目,使用一个与您正在搜索的2100498值相匹配的signature_id键。

 1[secondary_label Output]
 2{
 3  "timestamp": "2021-10-21T19:42:47.368856+0000",
 4  "flow_id": 775889108832281,
 5  "in_iface": "eth0",
 6  "event_type": "alert",
 7  "src_ip": "203.0.113.1",
 8  "src_port": 80,
 9  "dest_ip": "147.182.148.159",
10  "dest_port": 38920,
11  "proto": "TCP",
12  "community_id": "1:vuSfAFyy7oUq0LQC5+KNTBSuPxg=",
13  "alert": {
14    "action": "allowed",
15    "gid": 1,
16    "signature_id": 2100498,
17    "rev": 7,
18    "signature": "GPL ATTACK_RESPONSE id check returned root",
19    "category": "Potentially Bad Traffic",
20. . .
21}

请注意在 JSON 输出中突出显示的 "signature_id": 2100498, 行,这是 jq' 正在搜索的密钥。 另外,请注意在 JSON 输出中突出显示的 "community_id": "1:vuSfAFyy7oUq0LQC5+KNTBSuPxg=",` 行. 此密钥是您在 Suricata 配置文件中启用的生成社区流标识符。

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

Suricata 成功检查了网络流量,与检测规则相匹配,并生成了后续分析或记录的警报。

步骤7 - 处理Suricata警报

一旦设置和测试了警报,您可以选择如何处理它们. 对于某些用例,用于审计目的的日志警报可能足够;或者您可能更喜欢采取更积极的方法来阻止产生重复警报的系统的流量。

如果您希望基于 Suricata 生成的警报来阻止流量,一种方法是使用 EVE 日志中的条目,然后添加防火墙规则以限制对您的系统或系统的访问。

再次,这个例子是一个假设的场景,使用故意制造的请求和响应数据. 您对环境应该能够访问的系统和协议的了解对于确定哪些流量是合法的,哪些可以被阻止至关重要。

结论

在本教程中,您从 OISF 软件存储库中安装了 Suricata. 以此方式安装 Suricata 确保您每次发布新版本的 Suricata 都能收到更新。 安装 Suricata 后,您编辑了默认配置以添加社区流 ID 用于其他安全工具。

一旦您验证了Suricata的配置,您启动了流程并生成了一些测试HTTP流量,您验证了Suricata可以通过检查两个默认日志来检测可疑流量,以确保它们包含与您正在测试的规则相应的警报。

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

现在你已经安装和配置了Suricata,你可以继续到本系列的下一个教程(理解Suricata签名)(https://andsky.com/tech/tutorials/understanding-suricata-signatures)中,你将探索如何编写自己的自定义Suricata规则。

Published At
Categories with 技术
comments powered by Disqus