介绍
Suricata 是一种网络安全监控 (NSM) 工具,它使用社区创建的和用户定义的签名集(也称为规则)来检查和处理网络流量。 当检测到可疑数据包或对服务器上运行的任意数量的不同服务的请求时,Suricata 可以生成日志事件、触发警报并丢弃流量。
默认情况下,Suricata 用作被动入侵检测系统 (IDS),以扫描服务器或网络上的可疑流量。 它将生成并记录警报以供进一步调查。 它还可以配置为主动入侵防御系统 (IPS),以记录、警告和完全阻止符合特定规则的网络流量。
您可以在网络中的网关主机上部署 Suricata 以扫描来自其他系统的所有传入和传出网络流量,或者您可以在任一模式下在单个机器上本地运行它。
在本教程中,您将学习如何安装 Suricata,以及如何在 Debian 11 上自定义其一些默认设置以满足您的需求。 您还将学习如何下载 Suricata 用于扫描网络流量的现有签名集(通常称为规则集)。 最后,您将学习如何测试 Suricata 在检测到响应中的可疑请求和数据时是否正常工作。
先决条件
根据您的网络配置以及您打算如何使用 Suricata,您的服务器可能需要更多或更少的 CPU 和 RAM。 通常,您计划检查的流量越多,您应该分配给 Suricata 的资源就越多。 在生产环境中计划至少使用 2 个 CPU 和 4 或 8GB 的 RAM。 从那里您可以根据 Suricata 的性能和您需要处理的流量来扩展资源。
如果您计划使用 Suricata 来保护运行它的服务器,您将需要:
- 一台具有 2 个或更多 CPU、sudo 非 root 用户和启用防火墙的 Debian 11 服务器。 要进行设置,您可以按照我们的 Initial Server Setup with Debian 11 教程进行操作。
否则,如果您计划在网关主机上使用 Suricata 来监控和保护多台服务器,则需要确保主机的网络配置正确。
如果您使用的是 DigitalOcean,您可以按照 如何将 Droplet 配置为 VPC 网关 上的指南进行操作。 这些说明也适用于大多数 Debian 和 Ubuntu 服务器。
第 1 步 — 安装 Suricata
要开始安装 Suricata,您需要更新 Debian 系统上的可用软件包列表。 您可以使用 apt update
命令执行此操作:
sudo apt update
现在您可以使用 apt
命令安装 suricata
包:
sudo apt install suricata
现在软件包已安装,启用 suricata.service
以便在系统重新启动时运行。 使用 systemctl
命令启用它:
sudo systemctl enable suricata.service
您应该会收到如下输出,表明该服务已启用:
OutputSynchronizing state of suricata.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable suricata . . .
在继续本教程的下一部分(解释如何配置 Suricata)之前,使用 systemctl
停止服务:
sudo systemctl stop suricata.service
停止 Suricata 可确保在您编辑和测试配置文件时,您所做的任何更改都将在 Suricata 再次启动时得到验证和加载。
第 2 步 — 首次配置 Suricata
OISF 存储库中的 Suricata 包附带了一个配置文件,该文件涵盖了各种用例。 Suricata 的默认模式是 IDS 模式,因此不会丢弃任何流量,只会记录。 当您学习 Suricata 时,将此模式设置为默认值是一个好主意。 一旦您将 Suricata 配置并集成到您的环境中,并且对它会提醒您的流量类型有一个很好的了解,您就可以选择打开 IPS 模式。
但是,默认配置仍然有一些设置,您可能需要根据您的环境和需要进行更改。
(可选)启用社区流 ID
Suricata 可以在其 JSON 输出中包含 社区 ID 字段,以便更轻松地将单个事件记录与其他工具生成的数据集中的记录进行匹配。
如果您打算将 Suricata 与 Zeek 或 Elasticsearch 等其他工具一起使用,现在添加社区 ID 是个好主意。
要启用该选项,请使用 nano 或您喜欢的编辑器打开 /etc/suricata/suricata.yaml
:
sudo nano /etc/suricata/suricata.yaml
找到显示为 # Community Flow ID
的第 120 行。 如果您正在使用 nano
,请在提示输入行号时输入 CTRL+_
,然后输入 120
。 该行下方是 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
文件。 如果您使用的是 nano
,您可以使用 CTRL+X
,然后使用 Y
和 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", "flags": [ "onlink" ] } ]
dev
行表示默认设备。 在此示例输出中,设备是突出显示的 eth0
接口。 您的输出可能会显示设备名称,例如 ens...
或 eno...
。 不管叫什么名字,记下来。
现在您可以编辑 Suricata 的配置并验证或更改接口名称。 使用 nano
或您喜欢的编辑器打开 /etc/suricata/suricata.yaml
配置文件:
sudo nano /etc/suricata/suricata.yaml
滚动文件,直到在第 580 行出现 af-packet:
行。 如果您使用的是 nano
,您也可以通过输入 CTRL+_
并输入行号直接转到该行。 该行下方是 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
文件。 如果您使用的是 nano
,您可以使用 CTRL+X
,然后使用 Y
和 ENTER
进行确认。
配置实时规则重新加载
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
文件。 如果您使用的是 nano
,您可以使用 CTRL+X
,然后使用 Y
和 ENTER
进行确认。
第三步——更新 Suricata 规则集
在本教程的这一点上,如果您要启动 Suricata,您将在日志中收到如下警告消息,表明没有加载规则:
Output<Warning> - [ERRCODE: SC_ERR_NO_RULES(42)] - No rule files match the pattern /etc/suricata/rules/suricata.rules
默认情况下,Suricata 包包含一组有限的检测规则(在 /etc/suricata/rules
目录中),因此此时打开 Suricata 只会检测到有限数量的不良流量。
Suricata 包含一个名为 suricata-update
的工具,它可以从外部提供者那里获取规则集。 按如下方式运行它,为您的 Suricata 服务器下载最新的规则集:
sudo suricata-update -o /etc/suricata/rules
命令的 -o /etc/suricata/rules
部分指示更新工具将规则保存到特定目录。 您应该收到如下输出:
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 /etc/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.1/emerging.rules.tar.gz. 100% - 3052046/3052046 . . . 19/10/2021 -- 19:31:06 - <Info> -- Writing rules to /etc/suricata/rules/suricata.rules: total: 31063; enabled: 23700; added: 31063; removed 0; modified: 0 19/10/2021 -- 19:31:07 - <Info> -- Writing /etc/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 的 /etc/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 -o /etc/suricata/rules
然后再次运行带有 -o /etc/suricata/rules
标志的 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.1 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. 23700 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> - 23703 signatures processed. 1175 are IP-only rules, 3974 are inspecting packet payload, 18355 inspect application layer, 104 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 /etc/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 IDS/IDP daemon Loaded: loaded (/lib/systemd/system/suricata.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2021-10-29 19:46:02 UTC; 6s ago Docs: man:suricata(8) man:suricatasc(8) https://suricata-ids.org/docs/ Process: 4278 ExecStart=/usr/bin/suricata -D --af-packet -c /etc/suricata/suricata.yaml --pidfile /run/suricata.pid (code=exited, status=0/SUCCESS) Main PID: 4279 (Suricata-Main) Tasks: 1 (limit: 4678) Memory: 206.0M CPU: 6.273s CGroup: /system.slice/suricata.service └─4279 /usr/bin/suricata -D --af-packet -c /etc/suricata/suricata.yaml --pidfile /run/suricata.pid Oct 29 19:46:02 suricata systemd[1]: Starting Suricata IDS/IDP daemon... Oct 29 19:46:02 suricata suricata[4278]: 29/10/2021 -- 19:46:02 - <Notice> - This is Suricata version 6.0.1 RELEASE running in SYSTEM mode Oct 29 19:46:02 suricata systemd[1]: Started Suricata IDS/IDP daemon.
与测试模式命令一样,Suricata 需要一两分钟来加载和解析所有规则。 您可以使用 tail
命令查看 Suricata 日志中的特定消息,表明它已完成启动:
sudo tail -f /var/log/suricata/suricata.log
您将收到多行输出,并且在 Suricata 加载时终端可能会卡住。 继续等待输出,直到收到如下行:
Output29/10/2021 -- 19:46:34 - <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/29/2021-19:47:33.631122 [**] [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/29/2021-19:48:05.832461 [**] [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
,请使用以下 apt
命令安装它:
sudo apt 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-29T19:48:05.832461+0000", "flow_id": 666167948976574, "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:orJE+IStTM2bjccd9RzqMmjYceE=", "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:orJE+IStTM2bjccd9RzqMmjYceE=",
行。 此密钥是您在 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 握手等标准完全丢弃流量。