如何在 Rocky Linux 8 上将 Suricata 配置为入侵防御系统 (IPS)

介绍

在本教程中,您将学习如何在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.52001: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 中重复上述步骤,您希望将其转换为 dropreject` 模式。

注:如果您在前提教程中运行了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

最后两个INPUTOUTPUT规则将所有没有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)。

Published At
Categories with 技术
comments powered by Disqus