安全防护之路——Suricata部署与测试
2023-1-31 15:21:27 Author: www.freebuf.com(查看原文) 阅读量:5 收藏

Suricata是一种网络流量识别工具,它使用社区创建的和用户定义的signatures签名集(规则)来检查和处理网络流量。当检测到可疑数据包时,Suricata 可以触发警报或者丢弃流量

默认情况下,Suricata 用作入侵检测系统 (IDS),以扫描服务器或网络上的可疑流量,生成并记录警报以供进一步调查。

同时,Suricata还可以配置为主动入侵防御系统 (IPS),可以阻断符合特定规则的网络流量。

我们也可以在网络中核心网关上部署 Suricata 来扫描来自其他主机的所有流量。下面是本节的内容概述

  • 在 Ubuntu 20.04 上安装 Suricata,并进行一些设置

  • 导入 Suricata 的签名集(规则集)

  • 测试 Suricata 配置,测试Suricata是否正常工作

配置需求:检查的流量越多,需要分配给 Suricata 的资源就越多。在生产环境中计划至少使用 2核CPU 和4~8GB 的内存,硬盘至少40G。

安装Suricata

将开放信息安全基金会 (OISF) 的软件存储库到Ubuntu 系统apt源里,运行以下命令:

sudo add-apt-repository ppa:oisf/suricata-stable

安装suricata软件包:

sudo apt install suricata

现在软件包已安装,启用suricata.service配置程序自启动

sudo systemctl enable suricata.service

如果收到如下输出,表明该服务已启用:

Outputsuricata.service is not a native service, redirecting to systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable suricata

在修改 Suricata 配置之前,先停止服务systemctl

sudo systemctl stop suricata.service

配置 Suricata

OISF 存储库中的 Suricata 包附带了一个配置文件,该文件涵盖了各种用例。Suricata 的默认模式是 IDS 模式,因此不会拦截任何流量。

将 Suricata 配置并集成到真实的环境中时,可以考虑选择打开 IPS 模式。

  • 启用社区流 ID

Suricata 可以在其 JSON 输出中包含社区 ID字段,以便将单个事件记录与其他工具生成的数据集中的记录进行匹配。(类似现在的态势感知,聚合分析)

编辑/etc/suricata/suricata.yaml的第 120 行# Community Flow ID其设置true为启用设置:

# Community Flow ID
      # Adds a 'community_id' field to EVE records. These are meant to give
      # records a predictable flow ID that can be used to match records to
      # output of other tools such as Zeek (Bro).
      #
      # Takes a 'seed' that needs to be same across sensors and tools
      # to make the id less predictable.

      # enable/disable the community id feature.
      community-id: true

现在,事件将具有类似1:S+3BA2UmxxxxxFTtQ=的 ID ,可以使用它来关联不同工具中的记录。

  • 确定要使用的网卡

OISF Suricata 软件包附带的配置文件默认检查名为eth0. 如果使用不同的网卡,或者想检查多个网卡上的流量,则需要更改此值。

要确定默认网卡的设备名称,可以使用ifconfig或者ip -p -j route show default查看机器的网卡

[ {
        "dst": "default",
        "gateway": "192.168.xxx.254",
        "dev": "eno1",
        "protocol": "dhcp",
        "metric": 100,
        "flags": [ ]
    },{
        "dst": "default",
        "gateway": "192.168.xxx.1",
        "dev": "wlp3s0",
        "protocol": "dhcp",
        "metric": 600,
        "flags": [ ]
    } ]

可以看到我这台机器有eno1wlp3s0两块网卡。编辑 Suricata 的配置,更改网卡名称。/etc/suricata/suricata.yaml

# Linux high speed capture support
af-packet:
  - interface: eth0
    # Number of receive threads. "auto" uses the number of cores
    #threads: auto
    # Default clusterid. AF_PACKET will load balance packets based on flow.
    cluster-id: 99
. . .

如果还想要检查其他接口上的流量,可以添加更多- interface: eth...YAML 对象。要添加一个新接口,将其插入到该-interface: default部分之前

#  For eBPF and XDP setup including bypass, filter and load balancing, please
    #  see doc/userguide/capture-hardware/ebpf-xdp.rst for more info.

  - interface: enp0s1
    cluster-id: 98


  - interface: default
    #threads: auto
    #use-mmap: no
    #tpacket-v3: yes
  • 配置规则实时加载

Suricata 支持实时规则重新加载,这样无需重新启动正在运行的 Suricata 进程,就可以试试生效。要启用实时重新加载选项,在配置文件的底部并添加以下行:

/etc/suricata/suricata.yaml

. . .

detect-engine:
  - rule-reload: true

更新 Suricata 规则集

  • 添加初始免费规则集

如果直接启动 Suricata,可能日志中收到如下警告消息,这表明还没有加载规则:

Output<Warning> - [ERRCODE: SC_ERR_NO_RULES(42)] - No rule files match the pattern /var/lib/suricata/rules/suricata.rules

Suricata 包含一个名为suricata-update的工具,可以从外部获取规则集。运行sudo suricata-update为 Suricata 服务器下载最新的规则集:

19/10/2021 -- 19:31:07 - <Info> -- Testing with suricata -T.
19/10/2021 -- 19:31:32 - <Info> -- Done.

以上的回显表示suricata-update已获取免费的Open Rules,并将它们保存到 Suricata 的/var/lib/suricata/rules/suricata.rules文件中。

  • 添加规则集

suricata-update工具可以从各种免费和商业规则集提供者那里获取规则。某些规则集(例如已添加的 Open 集)可免费使用,而其他规则集则需要付费订阅。

可以使用sudo suricata-update list-sources列出默认的规则提供程序集,返回示例:

7/11/2022 -- 17:08:58 - <Info> -- Using data-directory /var/lib/suricata.
7/11/2022 -- 17:08:58 - <Info> -- Using Suricata configuration /etc/suricata/suricata.yaml
7/11/2022 -- 17:08:58 - <Info> -- Using /etc/suricata/rules for Suricata provided rules.
7/11/2022 -- 17:08:58 - <Info> -- Found Suricata version 6.0.6 at /usr/bin/suricata.
Name: et/open
  Vendor: Proofpoint
  Summary: Emerging Threats Open Ruleset
  License: MIT
Name: et/pro
  Vendor: Proofpoint
  Summary: Emerging Threats Pro Ruleset
  License: Commercial
  Replxces: et/open
  Parameters: secret-code
  Subscription: https://www.proofpoint.com/us/threat-insight/et-pro-ruleset
. . .

例如,如果想包含tgreen/hunting规则集,可以使用以下命令启用源:

sudo suricata-update enable-source tgreen/hunting

然后再运行suricata-update,将新添加的规则集导入到本地。

测试 Suricata 的配置文件

Suricata 有一个内置的测试模式,它将检查配置文件和任何包含的规则的有效性。-T使用标志在测试模式下运行 Suricata验证您在上一节中所做的更改。-v标志将打印一些附加信息,-c标志告诉 Suricata 在哪里可以找到其配置文件:

sudo suricata -T -c /etc/suricata/suricata.yaml -v

测试花费的时间具体取决于分配给 Suricata 的 CPU 数量和添加的规则数量。使用默认的Open 规则集,应该会收到如下输出:

7/11/2022 -- 17:10:18 - <Info> - 1 rule files processed. 27200 rules successfully loaded, 0 rules failed
7/11/2022 -- 17:10:18 - <Info> - Threshold config parsed: 0 rule(s) found
7/11/2022 -- 17:10:18 - <Info> - 27203 signatures processed. 1280 are IP-only rules, 4612 are inspecting packet payload, 21107 inspect application layer, 108 are decoder event only
7/11/2022 -- 17:10:24 - <Notice> - Configuration provided was successfully loaded. Exiting.
7/11/2022 -- 17:10:24 - <Info> - cleaning up signature grouping structure... complete

如果配置文件中有错误,那么测试模式将生成一个特定的错误代码和消息,可以用来帮助排除故障。

Suricata 测试模式运行成功完成,就可以进入下一步,启动 Suricata。

运行 Suricata

现在 Suricata 配置和规则集都OK了,可以启动 Suricata 服务器。运行:sudo systemctl start suricata.service

可以使用sudo systemctl status suricata.service命令检查服务的状态:

如下输出:

● suricata.service - LSB: Next Generation IDS/IPS
     Loaded: loaded (/etc/init.d/suricata; generated)
     Active: active (running) since Tue 2022-08-30 16:27:51 CST; 2 months 8 days ago
       Docs: man:systemd-sysv-generator(8)
      Tasks: 22 (limit: 18766)
     Memory: 2.7G
     CGroup: /system.slice/suricata.service
             └─35050 /usr/bin/suricata -c /etc/suricata/suricata.yaml --pidfile /var/run/suricata.pid --af-packet -D -vvv

与测试模式命令一样,Suricata 需要一两分钟来加载和解析所有规则。现在 Suricata 正常运行了,下一步是检查 Suricata 是否检测到测试 URL 的请求并生成警报。

测试 Suricata 规则

前面下载的Open 规则集包含超过 30000 条规则。Suricata 快速入门建议使用curl发一些包,来触发2100498规则。

运行curl http://testmynids.org/uid/index.html生成一个 HTTP 请求,该请求将返回一个匹配 Suricata 警报规则的响应:

Outputuid=0(root) gid=0(root) groups=0(root)

此示例响应数据会触发警报,假装返回通过 webshell 在受感染的远程系统上运行id命令的输出。

现在可以检查 Suricata 的日志,看看有没有触发告警。默认 Suricata 配置启用了两个日志。第一个是在/var/log/suricata/fast.log,第二个是json的/var/log/suricata/eve.log

/var/log/suricata/fast.log

输入grep 2100498 /var/log/suricata/fast.log 检查报警日志

Output10/21/2021-18:35:57.247239  [**] [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

如果有以上的回显,代表suricata检查到了威胁数据包,并且生成了一条记录。2100498就是Suricata 用于识别规则标号

/var/log/suricata/eve.log

Suricata 还使用JSON记录/var/log/suricata/eve.log。Suricata 文档建议使用该jq实用程序来读取和过滤eve.log。
如果系统上没有它,使用sudo apt install jq进行安装。

输入jq 'select(.alert .signature_id==2100498)' /var/log/suricata/eve.json检查,输出将类似于以下内容:

Output{
  "timestamp": "2022-08-03T16:34:20.041459+0800",
  "flow_id": 507569354027241,
  "in_iface": "wlp3s0",
  "event_type": "alert",
  "src_ip": "13.32.50.67",
  "src_port": 80,
  "dest_ip": "192.168.16.162",
  "dest_port": 60706,
  "proto": "TCP",
  "community_id": "1:3B+LBPCM3r+Ko4G03v361IZ7grA=",

如果有以上的回显,代表suricata检查到了威胁数据包,并且生成了一条记录。
后续,我们将探讨如何将 Suricata 警报集成到到ELK来组成一个开源SIEM (安全信息事件管理系统)。


文章来源: https://www.freebuf.com/articles/es/353548.html
如有侵权请联系:admin#unsafe.sh