如何在RockyLinux8上将Suricata配置为入侵防御系统(IPS)
介绍
在本教程中,您将学习如何在 Rocky Linux 8 上配置 Suricata 的内置入侵防御系统 (IPS) 模式。 默认情况下,Suricata 配置为作为入侵检测系统 (IDS) 运行,该系统仅生成警报并记录可疑流量。 当您启用 IPS 模式时,Suricata 可以主动丢弃可疑网络流量,并生成警报以供进一步分析。
在启用 IPS 模式之前,检查您启用了哪些签名及其默认操作非常重要。 错误配置的签名或过于宽泛的签名可能会导致将合法流量丢弃到您的网络,甚至阻止您通过 SSH 和其他管理协议访问您的服务器。
在本教程的第一部分,您将检查已安装并启用的签名。 您还将学习如何包含您自己的签名。 一旦您知道要在 IPS 模式下使用哪些签名,您就可以将其默认操作转换为丢弃或拒绝流量。 有了您的签名,您将学习如何使用 netfilter NFQUEUE iptables 目标通过 Suricata 发送网络流量,然后生成一些无效的网络流量以确保 Suricata 按预期丢弃它。
先决条件
如果您一直在学习本教程系列,那么您应该已经在 Rocky Linux 8 服务器上运行了 Suricata。
如果您仍然需要安装 Suricata,那么您可以关注 如何在 Rocky Linux 8 上安装 Suricata
您还应该使用
suricata-update
命令下载 ET Open Ruleset,并将其包含在您的 Suricata 签名中。jq
命令行 JSON 处理工具。 如果您没有从之前的教程中安装它,您可以使用dnf
命令进行安装:sudo dnf install jq
您可能还想使用之前的 Understanding Suricata Signatures 教程中的自定义签名。
第 1 步 — 包括自定义签名
本系列之前的教程探讨了如何安装和配置 Suricata,以及如何理解签名。 如果您想创建并包含您自己的规则,那么您需要编辑 Suricata 的 /etc/suricata/suricata.yaml
文件以包含您的签名的自定义路径。
首先,让我们找到您服务器的公共 IP,以便您可以在自定义签名中使用它们。 要查找您的 IP,您可以使用 ip
命令:
ip -brief address show
您应该收到如下输出:
Outputlo UNKNOWN 127.0.0.1/8 ::1/128 eth0 UP 203.0.113.5/20 10.20.0.5/16 2001:DB8::1/32 fe80::94ad:d4ff:fef9:cee0/64 eth1 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
的文件中。 使用 nano
或您喜欢的编辑器打开文件:
sudo vi /var/lib/suricata/rules/local.rules
复制并粘贴以下签名:
无效的 SSH 流量签名
alert 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;) alert 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;)
用您的服务器的公共 IP 地址代替规则中的 203.0.113.5
和 2001:DB8::1/32
地址。 如果您不使用 IPv6,则可以跳过在此规则和以下规则中添加该签名。
您可以根据您的网络和应用程序继续向此 local.rules
文件添加自定义签名。 例如,如果您想提醒非标准端口的 HTTP 流量,您可以使用以下签名:
非标准端口签名上的 HTTP 流量
alert 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;) alert 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
以外的端口,请添加以下内容:
非标准端口签名上的 TLS 流量
alert 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;) alert 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
配置文件以包含它们:
sudo vi /etc/suricata/suricata.yaml
找到配置的 rule-files:
部分。 如果您使用 vi
输入 1879gg
转到该行。 您文件中的确切位置可能不同,但您应该位于文件的正确大体区域。
编辑该部分并添加以下突出显示的 - local.rules
行:
/etc/suricata/suricata.yaml
. . . rule-files: - suricata.rules - local.rules . . .
保存并退出文件。 添加规则后,请务必验证 Suricata 的配置。 为此,请运行以下命令:
sudo suricata -T -c /etc/suricata/suricata.yaml -v
测试可能需要一些时间,具体取决于您在默认 suricata.rules
文件中加载了多少规则。 如果您发现测试时间过长,可以通过在行首添加 #
来注释掉配置中的 - suricata.rules
行,然后再次运行配置测试。 如果您计划在最终运行配置中使用 suricata.rules
签名,请务必删除 #
注释。
对使用 suricata-update
工具创建或包含的签名感到满意后,您可以继续下一步,在此您将签名的默认操作从 alert
或log
主动丢弃流量。
第 2 步 — 配置签名操作
现在您已经测试了自定义签名并使用了 Suricata,您可以将操作更改为 drop
或 reject
。 当 Suricata 在 IPS 模式下运行时,这些操作将主动阻止任何匹配签名的无效流量。
这两个动作在本系列的上一个教程 Understanding Suricata Signatures 中进行了描述。 选择使用哪个操作取决于您。 drop
动作将立即丢弃一个数据包以及属于网络流的任何后续数据包。 如果流量是基于 TCP 的,reject
操作将向客户端和服务器发送一个重置数据包,并为任何其他协议发送一个 ICMP 错误数据包。
让我们使用上一节中的自定义规则并将它们转换为使用 drop
操作,因为它们匹配的流量可能是网络扫描或其他一些无效连接。
使用 nano
或您喜欢的编辑器打开您的 /var/lib/suricata/rules/local.rules
文件,并将文件中每一行开头的 alert
操作更改为 drop
:
sudo vi /var/lib/suricata/rules/local.rules
/var/lib/suricata/rules/local.rules
drop ssh any any -> 203.0.113.5 !22 (msg:"SSH TRAFFIC on non-SSH port"; classtype: misc-attack; target: dest_ip; sid:1000000;) drop ssh any any -> 2001:DB8::1/32 !22 (msg:"SSH TRAFFIC on non-SSH port"; classtype: misc-attack; target: dest_ip; sid:1000001;) . . .
对要转换为 drop
或 reject
模式的 /var/lib/suricata/rules/suricata.rules
中的任何签名重复上述步骤。
注意:如果您在必备教程中运行了suricata-update
,您的suricata.rules file
中可能包含超过30,000个签名。
如果您将每个签名都转换为 drop
或 reject
,则可能会阻止对您的网络或服务器的合法访问。 相反,暂时将规则留在 suricata.rules
中,并将您的自定义签名添加到 local.rules
。 Suricata 将继续为在 IPS 模式下运行时由 suricata.rules
中的签名描述的可疑流量生成警报。
在您收集了几天或几周的警报后,您可以分析它们并根据它们的 sid
选择相关签名以转换为 drop
或 reject
。
将所有签名配置为您希望他们执行的操作后,下一步是重新配置,然后在 IPS 模式下重新启动 Suricata。
第 3 步 — 启用 nfqueue
模式
Suricata 默认以 IDS 模式运行,这意味着它不会主动阻止网络流量。 要切换到 IPS 模式,您需要编辑 Suricata 的 /etc/sysconfig/suricata
配置文件。
在 nano
或您喜欢的编辑器中打开文件:
sudo vi /etc/sysconfig/suricata
找到 OPTIONS="-i eth0 --user suricata"
行并通过在行首添加 #
将其注释掉。 然后添加一个新行 OPTIONS="-q 0 -vvv --user suricata"
告诉 Suricata 在 IPS 模式下运行。
完成编辑后,您的文件中应包含以下突出显示的行:
/etc/sysconfig/suricata
. . . # OPTIONS="-i eth0 --user suricata" OPTIONS="-q 0 -vvv --user suricata" . . .
保存并关闭文件。 现在您可以使用 systemctl
重新启动 Suricata:
sudo systemctl restart suricata.service
使用 systemctl
检查 Suricata 的状态:
sudo systemctl status suricata.service
您应该收到如下输出:
Output● suricata.service - Suricata Intrusion Detection Service Loaded: loaded (/usr/lib/systemd/system/suricata.service; disabled; vendor preset: disabled) Active: active (running) since Tue 2021-12-14 16:52:07 UTC; 6s ago Docs: man:suricata(1) Process: 44256 ExecStartPre=/bin/rm -f /var/run/suricata.pid (code=exited, status=0/SUCCESS) Main PID: 44258 (Suricata-Main) Tasks: 10 (limit: 11188) Memory: 52.8M CGroup: /system.slice/suricata.service └─44258 /sbin/suricata -c /etc/suricata/suricata.yaml --pidfile /var/run/suricata.pid -q 0 -vvv --user suricata . . . Dec 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.
请注意突出显示的 active (running)
行,表明 Suricata 已成功重新启动。
通过此更改,您现在可以在下一步中使用 Firewalld 将流量发送到 Suricata。
第 4 步 — 配置 Firewalld 以向 Suricata 发送流量
现在您已将 Suricata 配置为在 IPS 模式下处理流量,下一步是将传入数据包定向到 Suricata。 如果您遵循本系列的先决条件教程并使用 Rocky Linux 8 系统,您应该安装并启用 Firewalld。
要将 Suricata 所需的规则添加到 Firewalld,您需要运行以下命令:
sudo firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 22 -j NFQUEUE --queue-bypass sudo firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -p tcp --sport 22 -j NFQUEUE --queue-bypass
这两个规则确保 IPv4 接口上的 SSH 流量将绕过 Suricata,以便您可以使用 SSH 连接到您的服务器,即使 Suricata 没有运行。 如果没有这些规则,不正确或过于宽泛的签名可能会阻止您的 SSH 访问。 此外,如果 Suricata 停止,所有流量都将发送到 NFQUEUE
目标,然后由于 Suricata 未运行而被丢弃。
使用以下命令为 IPv6 添加相同的规则:
sudo firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 0 -p tcp --dport 22 -j NFQUEUE --queue-bypass sudo firewall-cmd --permanent --direct --add-rule ipv6 filter OUTPUT 0 -p tcp --sport 22 -j NFQUEUE --queue-bypass
接下来,添加 FORWARD
规则以确保如果您的服务器充当其他系统的网关,所有流量也将转到 Suricata 进行处理。
sudo firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -j NFQUEUE sudo firewall-cmd --permanent --direct --add-rule ipv6 filter FORWARD 0 -j NFQUEUE
最后两个 INPUT
和 OUTPUT
规则将 all 剩余的不是 SSH 流量的流量发送到 Suricata 进行处理。
sudo firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -j NFQUEUE sudo firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -j NFQUEUE
重复 IPv6 流量的命令:
sudo firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 1 -j NFQUEUE sudo firewall-cmd --permanent --direct --add-rule ipv6 filter OUTPUT 1 -j NFQUEUE
现在重新加载 Firewalld 以使规则持久化:
sudo firewall-cmd --reload
注意:如果您使用另一个防火墙,例如 iptables,您需要修改这些规则以匹配您的防火墙期望的格式。
在本教程的这一点上,您已将 Suricata 配置为在 IPS 模式下运行,并且您的网络流量默认发送到 Suricata。 您将能够随时重新启动服务器,并且您的 Suricata 和防火墙规则将保持不变。
本教程的最后一步是验证 Suricata 是否正确丢弃流量。
第 5 步 — 测试无效流量
现在您已将 Suricata 和防火墙配置为处理网络流量,您可以测试 Suricata 是否会丢弃与您的自定义和其他包含的签名匹配的数据包。
回忆一下前面教程中的签名sid:2100498
,在这个例子中修改为drop
匹配包:
西德:2100498
drop 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/local.rules
文件中。
向 Suricata 发送 SIGUSR2
信号以使其重新加载其签名:
sudo kill -usr2 $(pidof suricata)
现在使用 curl
测试规则:
curl --max-time 5 http://testmynids.org/uid/index.html
您应该会收到一条错误消息,指出请求超时,这表明 Suricata 阻止了 HTTP 响应:
Outputcurl: (28) Operation timed out after 5000 milliseconds with 0 out of 39 bytes received
您可以使用 jq
检查 eve.log
文件来确认 Suricata 丢弃了 HTTP 响应:
sudo jq 'select(.alert .signature_id==2100498)' /var/log/suricata/eve.json
您应该收到如下输出:
Output{ . . . "community_id": "1:SbOgFh2T3DZvwsoyMH4xfxOoVas=", "alert": { "action": "blocked", "gid": 1, "signature_id": 2100498, "rev": 7, "signature": "GPL ATTACK_RESPONSE id check returned root", "category": "Potentially Bad Traffic", "severity": 2, "metadata": { "created_at": [ "2010_09_23" ], "updated_at": [ "2010_09_23" ] } }, "http": { "hostname": "testmynids.org", "url": "/uid/index.html", "http_user_agent": "curl/7.61.1", "http_content_type": "text/html", "http_method": "GET", "protocol": "HTTP/1.1", "status": 200, "length": 39 }, . . .
突出显示的 "action": "blocked"
行确认签名匹配,并且 Suricata 丢弃或拒绝了测试 HTTP 请求。
结论
在本教程中,您将 Suricata 配置为使用 Rocky Linux 8 上的内置 IPS 模式阻止可疑网络流量。 您还添加了自定义签名来检查和阻止非标准端口上的 SSH、HTTP 和 TLS 流量。 为了将所有内容联系在一起,您还添加了防火墙规则来引导流量通过 Suricata 进行处理。
现在您已经在 IPS 模式下安装和配置了 Suricata,并且可以编写自己的签名来警告或丢弃可疑流量,您可以继续监控您的服务器和网络,并优化您的签名。
对 Suricata 签名和配置感到满意后,您可以继续学习本系列的最后一个教程,该教程将指导您将日志从 Suricata 发送到使用 Elastic Stack 构建的安全和信息事件管理 (SIEM) 系统。