介绍
在本教程中,您将学习如何在Rocky Linux 8上配置Suricata的内置入侵预防系统(IPS)模式。默认情况下,Suricata被配置为作为入侵检测系统(IDS)运行,该系统只会生成警报和记录可疑的流量。
在启用 IPS 模式之前,重要的是要检查哪些签名已启用,以及它们的默认操作。不正确配置的签名或过宽的签名可能会导致合法的网络流量下降,甚至阻止您通过 SSH 和其他管理协议访问服务器。
在此教程的第一部分, 您将检查您安装和启用的签名 。 您也会学习如何包含您的签名 。 一旦你知道你想在IPS模式下使用哪个签名,你就会转换他们的默认动作来降低或拒绝流量. 随着您的签名到位,您将学习如何使用 [netfilter NFQUEUE] (https://www.netfilter.org/projects/libnetfilter_queue/index.html) iptables目标通过Suricata发送网络流量,然后生成一些无效的网络流量,以确保Suricata按预期下降.
前提条件
如果你一直在遵循本教程系列,那么你应该已经在Rocky Linux 8服务器上运行Suricata。
- 联合国 如果您还需要安装 Suricata, 您可以跟随 [How To Instruction Suricata on Rocky Linux 8] (https://andsky.com/tech/tutorials/how-to-install-suricata-on-rocky-linux-8)
- 联合国 您还应当使用) , 并包含在您的 Suricata 签名中 。
- 联合国
jq'命令行 JSON 处理工具。 如果您没有从先前的教程中安装, 您可以使用
dnf命令 : QQ 命令 sudo dnf 安装jq ``.
, `
您还可能有自定义签名,您希望从以前的(https://andsky.com/tech/tutorials/understanding-suricata-signatures)教程中使用。
步骤 1 — 包括自定义签名
本系列的以前的教程探讨了如何安装和配置Suricata,以及如何理解签名. 如果您想创建和包含自己的规则,那么您需要编辑Suricata的 /etc/suricata/suricata.yaml
文件,以便为您的签名添加自定义路径。
首先,让我们找到您的服务器的公共IP,以便您可以在自定义签名中使用它们。
1ip -brief address show
您应该获得如下类型的输出:
1[secondary_label Output]
2lo UNKNOWN 127.0.0.1/8 ::1/128
3eth0 UP 203.0.113.5/20 10.20.0.5/16 2001:DB8::1/32 fe80::94ad:d4ff:fef9:cee0/64
4eth1 UP 10.137.0.2/16 fe80::44a2:ebff:fe91:5187/64
您的公共 IP 地址(地址)将类似于输出中突出的203.0.113.5
和2001:DB8::1/32
IP。
现在让我们创建以下自定义签名来扫描 SSH 流量到非 SSH 端口,并将其纳入名为 `/var/lib/suricata/rules/local.rules’ 的文件中。
1sudo vi /var/lib/suricata/rules/local.rules
复制并粘贴以下签名:
1[label Invalid SSH Traffic Signature]
2alert ssh any any -> 203.0.113.5 !22 (msg:"SSH TRAFFIC on non-SSH port"; flow:to_client, not_established; classtype: misc-attack; target: dest_ip; sid:1000000;)
3alert ssh any any -> 2001:DB8::1/32 !22 (msg:"SSH TRAFFIC on non-SSH port"; flow:to_client, not_established; classtype: misc-attack; target: dest_ip; sid:1000001;)
如果您不使用IPv6,您可以忽略在此和下面的规则中添加该签名。
您可以继续将自定义签名添加到这个local.rules
文件中,具体取决于您的网络和应用程序,例如,如果您想向非标准端口发送 HTTP 流量通知,则可以使用以下签名:
1[label HTTP traffic on non-standard port signature]
2alert http any any -> 203.0.113.5 !80 (msg:"HTTP REQUEST on non-HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000002;)
3alert http any any -> 2001:DB8::1/32 !80 (msg:"HTTP REQUEST on non-HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000003;)
若要将检查 TLS 流量的签名添加到 Web 服务器的默认 `443’ 以外的端口,请添加以下内容:
1[label TLS traffic on non-standard port signature]
2alert tls any any -> 203.0.113.5 !443 (msg:"TLS TRAFFIC on non-TLS HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000004;)
3alert tls any any -> 2001:DB8::1/32 !443 (msg:"TLS TRAFFIC on non-TLS HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000005;)
当您完成添加签名时,保存并关闭文件. 如果您正在使用vi
,请按ESC
,然后按:x
,然后按ENTER
来保存和退出。
现在你已经定义了一些自定义签名,请使用nano
或你喜欢的编辑器编辑Suricata的/etc/suricata/suricata.yaml
配置文件以包括它们:
1sudo vi /etc/suricata/suricata.yaml
查找规则文件:
配置部分. 如果你使用vi
输入1879gg
去行. 文件中的确切位置可能不同,但你应该在文件的正确的一般区域。
编辑该部分并添加以下突出的- local.rules
行:
1[label /etc/suricata/suricata.yaml]
2. . .
3rule-files:
4 - suricata.rules
5 - local.rules
6. . .
保存和退出文件. 请确保在添加规则后验证 Suricata 的配置。
1sudo suricata -T -c /etc/suricata/suricata.yaml -v
测试可能需要一段时间,取决于您在默认的suricata.rules
文件中加载了多少规则。 如果您发现测试时间过长,您可以在配置中评论- suricata.rules
行,在行开始时添加一个#
,然后再次运行配置测试。
一旦您满足于您使用suricata-update
工具创建或包含的签名,您可以转到下一步,在那里您将对您的签名的默认操作从警告
或日志
切换到积极减少流量。
步骤 2 — 配置签名操作
现在,您已经测试了自定义签名并与Suricata合作,您可以将操作更改为放弃
或拒绝
。当Suricata在IPS模式下运行时,这些操作将积极阻止任何匹配的签名的无效流量。
这些两种操作在本系列的前一个教程中描述了(https://andsky.com/tech/tutorials/understanding-suricata-signatures)。使用哪种操作的选择取决于您。 一种放下
的操作将立即抛弃一个包和任何后续属于网络流的包。 一种拒绝
的操作将向客户端和服务器发送一个重置包,如果流量是基于TCP的,以及任何其他协议的ICMP错误包。
让我们使用上一节的自定义规则,并将它们转换为使用放下
操作,因为它们匹配的流量很可能是一个网络扫描或其他任何无效的连接。
使用nano
或您喜爱的编辑器打开您的/var/lib/suricata/rules/local.rules
文件,并在文件中的每个行开始时更改警告
操作为放下
:
1sudo vi /var/lib/suricata/rules/local.rules
1[label /var/lib/suricata/rules/local.rules]
2drop ssh any any -> 203.0.113.5 !22 (msg:"SSH TRAFFIC on non-SSH port"; classtype: misc-attack; target: dest_ip; sid:1000000;)
3drop ssh any any -> 2001:DB8::1/32 !22 (msg:"SSH TRAFFIC on non-SSH port"; classtype: misc-attack; target: dest_ip; sid:1000001;)
4. . .
在 /var/lib/suricata/rules/suricata.rules 中重复上述步骤,您希望将其转换为
drop或
reject` 模式。
注:如果您在前提教程中运行了suricata-update
,则可能有超过 30,000 个签名包含在您的suricata.rules
文件中。
如果你将每个签名转换为放弃
或拒绝
,你可能会阻止对你的网络或服务器的合法访问。相反,暂时留下suricata.rules
中的规则,并将你的自定义签名添加到local.rules
。
在您收集了几天或几周的警报后,您可以分析它们并选择相应的签名以根据其侧面
转换为放弃
或拒绝
。
一旦您已配置了所有签名以执行您希望采取的操作,下一步是重新配置,然后在 IPS 模式下重新启动 Suricata。
步骤 3 – 启用nfqueue
模式
Suricata 默认情况下运行在 IDS 模式中,这意味着它不会主动阻止网络流量. 要切换到 IPS 模式,您需要编辑 Suricata 的 `/etc/sysconfig/suricata’ 配置文件。
在nano
或您喜爱的编辑器中打开文件:
1sudo vi /etc/sysconfig/suricata
查找OPTIONS="-i eth0 --user suricata
的行,并通过在行开始时添加一个#
来评论它,然后添加一个新的行OPTIONS="-q 0 -vvv --user suricata
的行,告诉Suricata在IPS模式下运行。
您的文件在完成编辑时应该有以下突出的行:
1[label /etc/sysconfig/suricata]
2. . .
3# OPTIONS="-i eth0 --user suricata"
4OPTIONS="-q 0 -vvv --user suricata"
5. . .
保存并关闭文件. 现在您可以使用systemctl
重新启动Suricata:
1sudo systemctl restart suricata.service
使用systemctl
检查Suricata的状态:
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; disabled; vendor preset: disabled)
4 Active: active (running) since Tue 2021-12-14 16:52:07 UTC; 6s ago
5 Docs: man:suricata(1)
6 Process: 44256 ExecStartPre=/bin/rm -f /var/run/suricata.pid (code=exited, status=0/SUCCESS)
7 Main PID: 44258 (Suricata-Main)
8 Tasks: 10 (limit: 11188)
9 Memory: 52.8M
10 CGroup: /system.slice/suricata.service
11 └─44258 /sbin/suricata -c /etc/suricata/suricata.yaml --pidfile /var/run/suricata.pid -q 0 -vvv --user suricata
12
13. . .
14Dec 14 16:52:07 suricata suricata[44258]: 14/12/2021 -- 16:52:07 - <Notice> - all 4 packet processing threads, 4 management threads initialized, engine started.
注意突出的活跃(运行)
线,表示Suricata成功重新启动。
有了这个更改,您现在已经准备好在下一步使用 Firewalld 将流量发送到 Suricata。
步骤4 — 配置防火墙将流量发送到Suricata
现在你已经配置了Suricata以在IPS模式中处理流量,下一步是向Suricata导入的包。如果你遵循了本系列的先决条件教程,并且正在使用Rocky Linux 8系统,你应该安装和启用Firewalld。
要将 Suricata 所需的规则添加到 Firewalld,您需要运行以下命令:
1sudo firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 22 -j NFQUEUE --queue-bypass
2sudo firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -p tcp --sport 22 -j NFQUEUE --queue-bypass
这两个规则确保 IPv4 界面上的 SSH 流量会绕过 Suricata,以便您可以使用 SSH 连接到您的服务器,即使 Suricata 没有运行,如果没有这些规则,错误或过于广泛的签名可能会阻止您的 SSH 访问。
使用以下命令为 IPv6 添加相同的规则:
1sudo firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 0 -p tcp --dport 22 -j NFQUEUE --queue-bypass
2sudo firewall-cmd --permanent --direct --add-rule ipv6 filter OUTPUT 0 -p tcp --sport 22 -j NFQUEUE --queue-bypass
接下来,添加前进
规则,以确保如果您的服务器作为其他系统的网关,所有流量也将转移到Suricata进行处理。
1sudo firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -j NFQUEUE
2sudo firewall-cmd --permanent --direct --add-rule ipv6 filter FORWARD 0 -j NFQUEUE
最后两个INPUT
和OUTPUT
规则将所有没有SSH流量的剩余流量发送到Suricata进行处理。
1sudo firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -j NFQUEUE
2sudo firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -j NFQUEUE
重复 IPv6 流量的命令:
1sudo firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 1 -j NFQUEUE
2sudo firewall-cmd --permanent --direct --add-rule ipv6 filter OUTPUT 1 -j NFQUEUE
现在重新加载 Firewalld 以使规则持久:
1sudo firewall-cmd --reload
注意:如果您正在使用其他防火墙,如iptables,则需要修改这些规则以匹配您期望的防火墙格式。
在本教程的这一点上,您将Suricata配置为在IPS模式下运行,并且您的网络流量被默认发送到Suricata,您将能够随时重新启动服务器,您的Suricata和防火墙规则将持久。
本教程的最后一步是验证Suricata正在正确降低流量。
步骤5 - 测试无效流量
现在,您已经配置了 Suricata 和防火墙来处理网络流量,您可以测试 Suricata 是否会丢下匹配您的自定义和其他包含签名的包。
回想起前一篇教程中的签名 sid:2100498
,在本示例中修改为 drop
匹配的包:
1[label sid:2100498]
2drop ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)
查找和编辑您的 /var/lib/suricata/rules/suricata.rules
文件中的规则,以使用 drop
操作,如果您有签名包含在那里.否则,请将规则添加到您的 /var/lib/suricata/rules/rules/local.rules
文件中。
向Suricata发送SIGUSR2
信号,让它重新加载其签名:
1sudo kill -usr2 $(pidof suricata)
现在测试使用curl
的规则:
1curl --max-time 5 http://testmynids.org/uid/index.html
您应该收到一个错误,说明请求时间过时,表明 Suricata 阻止了 HTTP 响应:
1[secondary_label Output]
2curl: (28) Operation timed out after 5000 milliseconds with 0 out of 39 bytes received
您可以确认Suricata使用jq
来检查eve.log
文件放弃了HTTP响应:
1sudo jq 'select(.alert .signature_id==2100498)' /var/log/suricata/eve.json
您应该获得如下类型的输出:
1[secondary_label Output]
2{
3. . .
4 "community_id": "1:SbOgFh2T3DZvwsoyMH4xfxOoVas=",
5 "alert": {
6 "action": "blocked",
7 "gid": 1,
8 "signature_id": 2100498,
9 "rev": 7,
10 "signature": "GPL ATTACK_RESPONSE id check returned root",
11 "category": "Potentially Bad Traffic",
12 "severity": 2,
13 "metadata": {
14 "created_at": [
15 "2010_09_23"
16 ],
17 "updated_at": [
18 "2010_09_23"
19 ]
20 }
21 },
22 "http": {
23 "hostname": "testmynids.org",
24 "url": "/uid/index.html",
25 "http_user_agent": "curl/7.61.1",
26 "http_content_type": "text/html",
27 "http_method": "GET",
28 "protocol": "HTTP/1.1",
29 "status": 200,
30 "length": 39
31 },
32. . .
突出的行动
:封锁
字段确认了签名匹配,Suricata放弃或拒绝了测试HTTP请求。
结论
在本教程中,您将Suricata配置为使用Rocky Linux 8上的内置IPS模式阻止可疑网络流量,您还添加了自定义签名来检查和阻止非标准端口上的SSH,HTTP和TLS流量。
现在,您已经在 IPS 模式下安装和配置了 Suricata,并且可以编写自己的签名来警告或放弃可疑的流量,您可以继续监控服务器和网络,并改进您的签名。
一旦您对 Suricata 签名和配置感到满意,您可以继续本系列的最后一个教程,该教程将指导您从 Suricata 发送日志到使用 [the Elastic Stack] 构建的安全和信息事件管理 (SIEM) 系统(https://andsky.com/tech/tutorials/how-to-install-elasticsearch-logstash-and-kibana-elastic-stack-on-ubuntu-20-04)。