.. _File Extraction:

21. 文件提取

21.1. 架构

文件提取功能基于选定的协议解析器运行(参见下方支持的协议列表)。应用层解析器依赖于流重组引擎和UDP流追踪机制。

对于HTTP协议,解析器会在必要时处理请求和/或响应数据的解块(dechunking)与解压(unzipping)操作。

这意味着流引擎、重组引擎以及应用层解析器的设置都会影响文件提取功能的运行效果。

通过规则语言可控制哪些文件需要被提取并存储到磁盘。

当前支持的协议包括:

  • HTTP

  • SMTP

  • FTP

  • NFS

  • SMB

  • HTTP2

21.2. 配置参数

stream.checksum_validation 控制流引擎是否拒绝校验和无效的数据包。通常建议开启,但如果网卡启用了校验和卸载功能,大量数据包可能被误判为损坏。该参数默认启用,设为"no"可禁用。注意校验和检查可基于每个接口单独配置,参考示例配置中的"checksum_checks"。

file-store.stream-depth 控制流重组处理的深度。超过该值后将停止重组,意味着HTTP会话在此之后不再被追踪。默认设置为1MB。0表示无限制。若设为no则禁用此功能,转而采用stream.reassembly.depth的值。非零值必须大于 stream.stream-depth 才会生效。

libhtp.default-config.request-body-limit / libhtp.server-config.<config>.request-body-limit 控制HTTP请求体的检测范围(用于`http_client_body`关键字),同时也限制文件检查范围。0表示无限制。

libhtp.default-config.response-body-limit / libhtp.server-config.<config>.response-body-limit 功能类似请求体限制,但作用于HTTP响应体。

21.3. 输出模块

21.3.1. 文件存储与EVE文件信息

提供两种记录提取文件信息的输出模块: 第一种是 eve.files ,作为 eve 的子日志模块, 记录 fileinfo 元数据(不包含文件实际内容)。

需在 eve 输出中启用::

  • outputs:
    • eve-log: types:

      • files:

        force-magic: no force-hash: [md5,sha256]

详见 Eve(可扩展事件格式) 获取 eve 输出的详细说明。

第二种 file-store 模块则将文件实体存储到磁盘。

file-store 使用独立日志目录(默认位于日志目录下的 filestore 子目录), 以文件内容的SHA256值为文件名存储。文件会被归类到 00ff 的二级目录, 目录名对应哈希值前两位。例如某文件SHA256以"f9bc6d..."开头, 则存储路径为 filestore/f9

可存储文件大小受限于 file-store.stream-depth , 若达到此阈值文件可能被截断存储。 若未启用该参数,则采用 stream.reassembly.depth 的值。

设置 file-store.stream-depth 为0允许存储完整文件(0表示"无限制")。

当使用filestore关键字时, file-store.stream-depth 始终优先于 stream.reassembly.depth 。 但不可将其设置为小于 stream.reassembly.depth 的值, 否则会忽略该设置并显示警告。

某些协议解析器(如modbus)允许设置独立的存储深度值, 此时将优先使用该值而非 file-store.stream-depth

采用SHA256命名可实现自动去重。当重复提取相同文件时, 已有文件的更新时间戳会被刷新(类似 touch 命令行为)。

可选地将 fileinfo 记录写入同名JSON文件(扩展名不同)。 为确保每次提取记录的独立性,文件名附加额外字段::

<SHA256>.<SECONDS>.<ID>.json

其中 <SECONDS> 表示触发文件关闭的数据包时间戳(秒级), <ID> 是Suricata运行实例的唯一ID。这些值仅用于保证唯一性, 不应作为依赖项。

这些 fileinfo 记录与 eve 输出的记录完全一致。

更多配置详情参见 suricata-yaml-file-store

Note

本文档描述的是 file-store 第2版。自Suricata 6起已移除第1版文件存储功能。

21.4. 规则示例

无规则配置时不会执行文件提取。最简规则示例::

alert http any any -> any any (msg:"FILE store all"; filestore; sid:1; rev:1;)

此规则会存储所有文件到磁盘。

仅存储PDF扩展名文件?:

alert http any any -> any any (msg:"FILE PDF file claimed"; fileext:"pdf"; filestore; sid:2; rev:1;)

或仅存储实际PDF文件?:

alert http any any -> any any (msg:"FILE pdf detected"; filemagic:"PDF document"; filestore; sid:3; rev:1;)

或仅存储MD5黑名单匹配文件?:

alert http any any -> any any (msg:"Black list checksum match and extract MD5"; filemd5:fileextraction-chksum.list; filestore; sid:4; rev=1;)

或仅存储SHA1黑名单匹配文件?:

alert http any any -> any any (msg:"Black list checksum match and extract SHA1"; filesha1:fileextraction-chksum.list; filestore; sid:5; rev=1;)

或最终存储SHA256黑名单匹配文件?:

alert http any any -> any any (msg:"Black list checksum match and extract SHA256"; filesha256:fileextraction-chksum.list; filestore; sid:6; rev=1;)

Suricata安装包中包含更多示例规则,位于压缩包的 rules 目录下,参考 files.rules 文件。

MD5功能 ~~~

Suricata支持实时计算文件MD5校验并记录。启用方法详见 存储MD5校验值

21.5. 更新文件存储配置