如何在 Debian 11 上将 Suricata 配置为入侵防御系统 (IPS)

介绍

在本教程中,您将学习如何在 Debian 11 上配置Suricata的内置入侵预防系统(IPS)模式。默认情况下,Suricata被配置为作为入侵检测系统(IDS)运行,该系统只会生成警报和记录可疑的流量。

在启用 IPS 模式之前,重要的是要检查哪些签名已启用,以及它们的默认操作。不正确配置的签名或过宽的签名可能会导致合法的网络流量下降,甚至阻止您通过 SSH 和其他管理协议访问服务器。

在此教程的第一部分, 您将检查您安装和启用的签名 。 您也会学习如何包含您的签名 。 一旦你知道你想在IPS模式下使用哪个签名,你就会转换他们的默认动作来降低或拒绝流量. 随着您的签名到位,您将学习如何使用 [netfilter NFQUEUE] (https://www.netfilter.org/projects/libnetfilter_queue/index.html) iptables目标通过Suricata发送网络流量,然后生成一些无效的网络流量,以确保Suricata按预期下降.

前提条件

如果你一直遵循本教程系列,那么你应该已经有Suricata在服务器上运行. 如果你仍然需要安装Suricata,那么你可以根据你的服务器的操作系统遵循这些教程之一:

  • 如何在Debian 11上安装Suricata
  • 联合国 您还应当使用) , 并包含在您的 Suricata 签名中 。
  • 联合国 jq'命令行 JSON 处理工具。 如果您没有从先前的教程中安装, 您可以使用 apt命令 : QQ 命令 sudo 适切更新 sudo apt 安装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 2604:a880:cad:d0::dc8:4001/64 fe80::94ad:d4ff:fef9:cee0/64 
4eth1 UP 10.137.0.2/16 fe80::44a2:ebff:fe91:5187/64

您的公共 IP 地址(地址)将类似于输出中突出的203.0.113.52604:a880:cad:d0::dc8:4001/64 IP。

现在让我们创建以下自定义签名来扫描 SSH 流量到非 SSH 端口,并将其纳入名为 `/etc/suricata/rules/local.rules’ 的文件中。

1sudo nano /etc/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 -> 2604:a880:cad:d0::dc8:4001/64 !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.52604:a880:cad:d0::dc8:4001/64地址。

您可以继续将自定义签名添加到这个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 -> 2604:a880:cad:d0::dc8:4001/64 !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 -> 2604:a880:cad:d0::dc8:4001/64 !443 (msg:"TLS TRAFFIC on non-TLS HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000005;)

当你完成添加签名时,保存并关闭文件. 如果你使用nano,你可以使用CTRL+X,然后YENTER来确认。

现在你已经定义了一些自定义签名,请使用nano或你喜欢的编辑器编辑Suricata的/etc/suricata/suricata.yaml配置文件以包括它们:

1sudo nano /etc/suricata/suricata.yaml

如果你正在使用nano,使用CTRL+_,然后输入行号码1879

编辑该部分并添加以下突出的- 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或您喜爱的编辑器打开您的/etc/suricata/rules/local.rules文件,并在文件中的每个行开始时更改警告操作为放下:

1[label /etc/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 -> 2604:a880:cad:d0::dc8:4001/64 !22 (msg:"SSH TRAFFIC on non-SSH port"; classtype: misc-attack; target: dest_ip; sid:1000001;)
4. . .

重复上述步骤,以便在/etc/suricata/rules/suricata.rules中转换为放下拒绝模式的任何签名。

注:如果您在前提教程中运行了suricata-update,则可能有超过 30,000 个签名包含在您的suricata.rules文件中。

如果你将每个签名转换为放弃拒绝,你可能会阻止对你的网络或服务器的合法访问。相反,暂时留下suricata.rules中的规则,并将你的自定义签名添加到local.rules

在您收集了几天或几周的警报后,您可以分析它们并选择相应的签名以根据其侧面转换为放弃拒绝

一旦您已配置了所有签名以执行您希望采取的操作,下一步是重新配置,然后在 IPS 模式下重新启动 Suricata。

步骤 3 – 启用nfqueue模式

Suricata 默认运行在 IDS 模式下,这意味着它不会主动阻止网络流量. 要切换到 IPS 模式,您需要修改 Suricata 的默认设置。

使用systemctl edit命令创建一个新的 systemd override 文件:

1sudo systemctl edit suricata.service

添加下列突出的行在文件的开始,在评论之间:

 1[label systemctl edit suricata.service]
 2### Editing /etc/systemd/system/suricata.service.d/override.conf
 3### Anything between here and the comment below will become the new contents of the file
 4
 5[Service]
 6ExecStart=
 7ExecStart=/usr/bin/suricata -c /etc/suricata/suricata.yaml --pidfile /run/suricata.pid -q 0 -vvv
 8Type=simple
 9
10### Lines below this comment will be discarded
11. . .
  • ExecStart= 行清除启动服务的默认 systemd 命令. 下一行定义要使用的新 ExecStart 命令. * Type=simple 行确保 systemd 可以在 IPS 模式下运行时管理 Suricata 流程。

如果您正在使用「nano」,您可以使用「CTRL+X」,然後用「Y」和「ENTER」來確認。如果您正在使用「vi」,請按「ESC」,然後按「:x」,然後按「ENTER」來保存和退出。

现在重新加载 systemd 以检测新的 Suricata 设置:

1sudo systemctl daemon-reload

现在你可以使用systemctl重新启动Suricata:

1sudo systemctl restart suricata.service

使用systemctl检查Suricata的状态:

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    Drop-In: /etc/systemd/system/suricata.service.d
 5             └─override.conf
 6     Active: active (running) since Wed 2021-12-15 14:35:21 UTC; 38s ago
 7       Docs: man:suricata(8)
 8             man:suricatasc(8)
 9             https://suricata-ids.org/docs/
10   Main PID: 29890 (Suricata-Main)
11      Tasks: 10 (limit: 2340)
12     Memory: 54.9M
13        CPU: 3.957s
14     CGroup: /system.slice/suricata.service
15             └─29890 /usr/bin/suricata -c /etc/suricata/suricata.yaml --pidfile /run/suricata.pid -q 0 -vvv
16
17. . .
18Dec 15 14:35:21 suricata suricata[29890]: 15/12/2021 -- 14:35:21 - <Notice> - all 4 packet processing threads, 4 management threads initialized, engine started

注意突出的活跃(运行)线,表示Suricata成功重新启动。

有了这个更改,您现在准备在下一步使用UFW防火墙向Suricata发送流量。

步骤 4 — 配置 UFW 将流量发送到 Suricata

现在你已经配置了Suricata以在IPS模式中处理流量,下一步是向Suricata导入的包。如果你遵循了本系列的先决条件教程,并且正在使用Ubuntu 20.04系统,你应该安装并启用不复杂的防火墙(UFW)。

要将 Suricata 所需的规则添加到 UFW,您需要直接编辑 /etc/ufw/before.rules/etc/ufw/before6.rules 中的防火墙文件。

使用nano或您喜爱的编辑器打开第一个文件:

1sudo nano /etc/ufw/before.rules

在文件的开头附近,插入以下突出的行:

 1[label /etc/ufw/before.rules]
 2. . .
 3# Don't delete these required lines, otherwise there will be errors
 4*filter
 5:ufw-before-input - [0:0]
 6:ufw-before-output - [0:0]
 7:ufw-before-forward - [0:0]
 8:ufw-not-local - [0:0]
 9# End required lines
10
11## Start Suricata NFQUEUE rules
12-I INPUT 1 -p tcp --dport 22 -j NFQUEUE --queue-bypass
13-I OUTPUT 1 -p tcp --sport 22 -j NFQUEUE --queue-bypass
14-I FORWARD -j NFQUEUE
15-I INPUT 2 -j NFQUEUE
16-I OUTPUT 2 -j NFQUEUE
17## End Suricata NFQUEUE rules
18
19# allow all on loopback
20-A ufw-before-input -i lo -j ACCEPT
21-A ufw-before-output -o lo -j ACCEPT
22. . .

完成编辑后保存并退出文件. 现在将相同的行添加到 /etc/ufw/before6.rules 文件中的相同的部分。

第一两个INPUTOUTPUT规则被用来绕过Suricata,以便您可以使用SSH连接到您的服务器,即使Suricata没有运行,如果没有这些规则,错误或过于广泛的签名可能会阻止您的SSH访问。

下一个前进规则确保,如果您的服务器作为其他系统的网关,所有流量也将转移到Suricata进行处理。

最后两个INPUTOUTPUT规则将所有没有SSH流量的剩余流量发送到Suricata进行处理。

重新启动 UFW 以加载新规则:

1sudo systemctl restart ufw.service

注:如果您正在使用另一个防火墙,则需要修改这些规则以匹配您期望的防火墙格式。

如果您正在使用iptables,则可以使用iptablesip6tables命令直接插入这些规则,但是,您需要通过iptables-persistent等工具确保这些规则在重启中持久。

如果你正在使用防火墙,那么以下规则将引导流量到Suricata:

 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 INPUT 1 -j NFQUEUE
 3sudo firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 0 -p tcp --dport 22 -j NFQUEUE --queue-bypass
 4sudo firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 1 -j NFQUEUE
 5
 6sudo firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -j NFQUEUE
 7sudo firewall-cmd --permanent --direct --add-rule ipv6 filter FORWARD 0 -j NFQUEUE
 8
 9sudo firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -p tcp --sport 22 -j NFQUEUE --queue-bypass
10sudo firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -j NFQUEUE
11sudo firewall-cmd --permanent --direct --add-rule ipv6 filter OUTPUT 0 -p tcp --sport 22 -j NFQUEUE --queue-bypass
12sudo firewall-cmd --permanent --direct --add-rule ipv6 filter OUTPUT 1 -j NFQUEUE
13
14sudo firewall-cmd --reload

美元

在本教程的这一点上,您将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;)

查找并编辑您的 /etc/suricata/rules/suricata.rules 文件中的规则以使用 drop 操作,如果您有签名包含在那里。

向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响应:

1jq 'select(.alert .signature_id==2100498)' /var/log/suricata/eve.json

您应该获得如下类型的输出:

 1[secondary_label Output]
 2{
 3. . .
 4  "community_id": "1:Z+RcUB32putNzIZ38V/kEzZbWmQ=",
 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.68.0",
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 以使用其内置的 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