5. 安全注意事项

Suricata 是一款处理不可信网络数据的安全工具,同时需要提升系统权限来获取这些数据。这种特性组合需要额外的安全预防措施,我们将在下文讨论。

此外,供应链攻击(尤其是围绕规则分发的攻击)可能针对 Suricata 的安装实例。

5.1. 以非 Root 用户身份运行

Note

如果使用来自 OISF COPR 仓库或 EPEL 仓库的 Suricata RPM 包,以下配置已预先完成。您唯一可能需要做的就是将管理用户加入 suricata 组。

许多 Suricata 示例和指南会展示以 root 用户身份运行 Suricata,尤其是在处理实时流量时。由于 Suricata 通常需要底层读取(在 IPS 模式下还需要写入)网络流量的权限,因此必须以 root 身份启动。但 Suricata 具备启动后降权至非 root 用户的能力,这可以限制 Suricata 自身安全漏洞的影响范围。

Note

目前启动后降权功能仅支持 Linux 系统。

5.1.1. 创建用户

在以非 root 用户运行前,需选择或创建 Suricata 的运行用户和组。通常这是一个名为 suricata 的系统用户,可通过以下命令创建:

useradd --no-create-home --system --shell /sbin/nologin suricata

这将创建名为 suricata 的用户和组。

5.1.2. 文件系统权限

在以 suricata 用户运行前,需要更新部分目录权限以保证其读写访问权。

假设您通过源码安装 Suricata 并使用推荐配置:

./configure --prefix=/usr/ --sysconfdir=/etc/ --localstatedir=/var/

则需要更新以下目录权限:

目录

权限要求

/etc/suricata

读取

/var/log/suricata

读写

/var/lib/suricata

读写

/var/run/suricata

读写

以下命令可设置正确权限:

  • /etc/suricata:

    chgrp -R suricata /etc/suricata
    chmod -R g+r /etc/suricata
    
  • /var/log/suricata:

    chgrp -R suricata /var/log/suricata
    chmod -R g+rw /var/log/suricata
    
  • /var/lib/suricata:

    chgrp -R suricata /var/lib/suricata
    chmod -R g+srw /var/lib/suricata
    
  • /var/lib/suricata:

    chgrp -R suricata /var/run/suricata
    chmod -R g+srw /var/run/suricata
    

5.1.3. 配置 Suricata 以 suricata 用户运行

可通过修改配置文件或命令行参数配置 Suricata 以指定用户运行。

  • 在配置文件中更新 run-as 部分:

    run-as:
      user: suricata
      group: suricata
    
  • 或通过命令行参数添加:

    --user suricata --group suricata
    

5.1.4. 启动 Suricata

需特别注意:大多数情况下仍需以 root 权限启动 Suricata。以 root 启动可使 Suricata 获取网络接口访问权,并在切换至配置用户前设置运行时所需的 capabilities

5.1.5. 其他命令:Suricata-Update 与 SuricataSC

通过前述权限设置,suricata-updatesuricatasc 也可无需 root 或 sudo 执行。要允许用户使用这些命令,将其加入 suricata 组即可。

5.2. 容器化部署

Docker 和 Podman 等容器技术是隔离 Suricata 与宿主机的另一种方法。但我们仍建议即使在容器中也以非 root 用户运行。

5.2.1. Capabilities 配置

对于 Docker 和 Podman,需为运行 Suricata 的容器提供以下 capabilities 以保证正常运作:

--cap-add=net_admin --cap-add=net_raw --cap-add=sys_nice

5.2.2. Podman 注意事项

Suricata 无法在 rootless 模式的 Podman 中运行,这是因为 Suricata 需要 root 权限来获取网络接口访问权。但如果按上述方式配置 capabilities 并以非 root 用户运行,它会在处理网络数据前主动降权。