介绍
Suricata是一个网络安全监控(NSM)工具,使用社区创建和用户定义的签名集(也称为规则)来检查和处理网络流量。
默认情况下,Suricata作为一个被动入侵检测系统(IDS)来扫描服务器或网络上的可疑流量,它将生成并记录警报以进行进一步调查,还可以配置为一个活跃的入侵预防系统(IPS),以记录、警告和完全阻止符合特定规则的网络流量。
您可以将 Suricata 部署在网络中的网关主机上,以扫描来自其他系统的所有输入和输出网络流量,也可以在单个机器上本地运行。
在本教程中,您将学习如何安装Suricata,以及如何定制Debian 11上的某些默认设置以满足您的需求。您还将学习如何下载Suricata用于扫描网络流量的现有签名集(通常称为规则集)。
前提条件
根据你的网络配置和你打算如何使用Suricata,你可能需要更多的CPU和RAM为你的服务器. 一般来说,你计划检查的流量越多,你应该分配更多的资源Suricata. 在一个生产环境计划中,使用至少2个CPU和4或8GB的RAM开始。
如果您打算使用 Suricata 来保护它正在运行的服务器,您将需要:
- 一个 Debian 11 服务器有 2 个或更多 CPU,一个 sudo 非 root 用户和启用防火墙. 要设置此功能,您可以遵循我们的 Debian 11 初始服务器设置教程
否则,如果您计划在网关主机上使用 Suricata 来监控和保护多个服务器,则需要确保主机的网络配置正确。
<$>[info] 如果您正在使用DigitalOcean,您可以在 如何将Droplet配置为VPC网关上遵循此指南。
步骤 1 - 安装 Suricata
要开始安装 Suricata,您需要更新 Debian 系统上的可用包列表,您可以使用apt update
命令来执行以下操作:
1sudo apt update
现在您可以使用apt
命令安装suricata
包:
1sudo apt install suricata
现在该软件包已安装,请启用suricata.service
,以便在系统重新启动时运行。
1sudo systemctl enable suricata.service
您应该收到如下输出,表示该服务已启用:
1[secondary_label Output]
2Synchronizing state of suricata.service with SysV service script with /lib/systemd/systemd-sysv-install.
3Executing: /lib/systemd/systemd-sysv-install enable suricata
4. . .
在继续本教程的下一节,它解释了如何配置Suricata,停止使用systemctl
的服务:
1sudo systemctl stop suricata.service
停止 Suricata 确保当您编辑和测试配置文件时,您所做的任何更改都会在 Suricata 重新启动时得到验证和加载。
步骤 2 – 首次配置 Suricata
来自OISF存储库的Suricata包配备了一个配置文件,涵盖了广泛的使用情况。Suricata的默认模式是IDS模式,所以不会丢失任何流量,只会登录。在学习Suricata时,将此模式设置为默认是一个好主意。一旦Suricata已配置并集成到您的环境中,并对它会提醒您的流量类型有一个很好的想法,您可以选择启用IPS模式。
然而,默认配置仍然有一些设置,您可能需要根据环境和需求进行更改。
(可选) 启用社区流 ID
Suricata 可以在 JSON 输出中包含一个 社区 ID 字段,以便更容易将个别事件记录与其他工具生成的数据集中的记录匹配。
如果您计划与其他工具(如 Zeek或 Elasticsearch)一起使用 Suricata,现在添加社区ID是一个好主意。
要启用此选项,请使用 nano 或您偏好的编辑器打开 `/etc/suricata/suricata.yaml:
1sudo nano /etc/suricata/suricata.yaml
查找# Community Flow ID
的120行,如果使用nano
键入CTRL+_
,然后在被要求输入一个行号时键入120
。
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
文件. 如果您使用nano
,您可以使用CTRL+X
,然后Y
和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 "flags": [ "onlink" ]
7 } ]
dev
行表示默认设备. 在本示例输出中,该设备是突出的 eth0
接口. 您的输出可能会显示设备名称,例如 ens...
或 eno...
。
现在你可以编辑Suricata的配置,并验证或更改界面名称。 使用nano
或您喜爱的编辑器打开/etc/suricata/suricata.yaml
配置文件:
1sudo nano /etc/suricata/suricata.yaml
如果您正在使用nano
,您也可以通过键入CTRL+_
并输入行号直接进入行,直到您到达一个字符串,该字符串在580行周围读到按包:
默认接口,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
文件. 如果您正在使用 nano
,您可以这样做与 CTRL+X
,然后 Y
和 ENTER
来确认。
配置 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
文件. 如果您使用nano
,您可以使用CTRL+X
,然后Y
和ENTER
来确认。
步骤 3 – 更新Suricata规则
在本教程的这一点上,如果您要启动Suricata,您将在日志中收到一个警告消息,如下:没有加载的规则:
1[secondary_label Output]
2<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
的工具,可以从外部提供商获取规则集。
1sudo suricata-update -o /etc/suricata/rules
命令的 -o /etc/suricata/rules
部分指示更新工具将规则保存到特定目录中。
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 /etc/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.1/emerging.rules.tar.gz.
8 100% - 3052046/3052046
9. . .
1019/10/2021 -- 19:31:06 - <Info> -- Writing rules to /etc/suricata/rules/suricata.rules: total: 31063; enabled: 23700; added: 31063; removed 0; modified: 0
1119/10/2021 -- 19:31:07 - <Info> -- Writing /etc/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 Open Rules,并将其保存到Suricata的「/etc/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 -o /etc/suricata/rules
然后,再次运行suricata-update
命令以-o /etc/suricata/rules
标志,并将添加新的规则,除了现有的ET开放规则和您下载的任何其他规则。
步骤 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.1 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. 23700 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> - 23703 signatures processed. 1175 are IP-only rules, 3974 are inspecting packet payload, 18355 inspect application layer, 104 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 /etc/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 IDS/IDP daemon
3 Loaded: loaded (/lib/systemd/system/suricata.service; enabled; vendor preset: enabled)
4 Active: active (running) since Fri 2021-10-29 19:46:02 UTC; 6s ago
5 Docs: man:suricata(8)
6 man:suricatasc(8)
7 https://suricata-ids.org/docs/
8 Process: 4278 ExecStart=/usr/bin/suricata -D --af-packet -c /etc/suricata/suricata.yaml --pidfile /run/suricata.pid (code=exited, status=0/SUCCESS)
9 Main PID: 4279 (Suricata-Main)
10 Tasks: 1 (limit: 4678)
11 Memory: 206.0M
12 CPU: 6.273s
13 CGroup: /system.slice/suricata.service
14 └─4279 /usr/bin/suricata -D --af-packet -c /etc/suricata/suricata.yaml --pidfile /run/suricata.pid
15
16Oct 29 19:46:02 suricata systemd[1]: Starting Suricata IDS/IDP daemon...
17Oct 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
18Oct 29 19:46:02 suricata systemd[1]: Started Suricata IDS/IDP daemon.
与测试模式命令一样,Suricata需要一两分钟的时间来加载和解析所有规则,您可以使用尾巴
命令在Suricata的日志中查看一个特定的消息,表明它已经完成开始:
1sudo tail -f /var/log/suricata/suricata.log
您将收到一系列输出线,而终端可能会在Suricata加载时出现堵塞,继续等待输出,直到您收到如下的一行:
1[secondary_label Output]
229/10/2021 -- 19:46:34 - <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/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地址:
1[secondary_label Output]
210/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(侧面
)。
检查 /var/log/suricata/eve.log
Suricata 还会将事件记录到 `/var/log/suricata/eve.log (命名为 EVE 日志) 使用 JSON 来格式化条目。
Suricata 文档建议使用jq
实用程序来阅读和过滤此文件中的条目. 如果您没有在您的系统上使用以下apt
命令,安装jq
:
1sudo apt 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-29T19:48:05.832461+0000",
4 "flow_id": 666167948976574,
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:orJE+IStTM2bjccd9RzqMmjYceE=",
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 输出中标注的 "community_id": "1:orJE+IStTM2bjccd9RzqMmjYceE=",
行. 此键是您在 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规则。