资讯动态

Suricata 文件规则关键字全解析:file.data、file.name、fileext、file.magic 与 filestore 实战指南

发布时间:2026/10/9 1:46:51 来源:尧图企业网站定制
网络安全【免费下载链接】suricataSuricata is a network Intrusion Detection System, Intrusion Prevention System and Network Security Monitoring engine developed by the OISF and the Suricata community.项目地址https://gitcode.com/gh_mirrors/su/suricata点击查看免费下载Suricata 提供了一组专门针对「文件」这一抽象实体的规则关键字用于匹配流中被传输文件的内容、文件名、扩展名、文件类型magic、校验和与大小并能把命中的文件直接落盘存储。本文以官方规则文档 file-keywords.rst 为主线结合仓库源码src/detect-file*.c与 文件提取指南完整讲解每个关键字的语法、行为差异、默认规则、底层实现与内存开销读完即可编写出可实际部署的文件检测与提取规则。前置条件这些关键字依赖文件提取机制文档开篇即强调所有文件关键字都依赖正确配置的**文件提取File Extraction**功能。文件提取代码运行在应用层协议解析器之上其支持的协议包括HTTPSMTPFTPNFSSMBHTTP2对应源码中的注册逻辑见src/detect-file-data.c的DetectFileRegisterFileProtocols各协议通过DetectFileRegisterProto登记到文件处理表。几个直接影响文件关键字可用性的关键设置详见 file-extraction.rststream.checksum_validation控制流引擎是否拒绝校验和错误的报文。若网卡开启校验和卸载checksum offloading建议设为no。file-store.stream-depth控制流重组进行到多远超过该值不再重组。默认 1 MB0表示无限no表示禁用并回退到stream.reassembly.depth非零值必须大于stream.stream-depth才会生效。libhtp.default-config.request-body-limit/response-body-limit限制 HTTP 请求/响应体被跟踪与检查的量0表示无限。此外若要真正观察到检测效果还需要在输出侧启用文件相关模块eve.files子日志器输出fileinfo元数据记录file-store模块则把文件本体按 SHA256 写入磁盘默认位于日志目录下的filestore/文件按 SHA256 前两个字符分目录存放例如filestore/f9。没有规则时不会发生任何提取。file.data匹配文件内容file.data是一个粘性缓冲区sticky buffer用于匹配 Suricata 所评估的流中出现的文件内容。它可以搭配各种载荷关键字使用例如startswith、nocase、bsize等。文档给出的跨协议示例alert smtp any any - any any (msg:smtp app layer file.data example; \ file.data; content:example file content; sid:1; rev:1;) alert http any any - any any (msg:http app layer file.data example; \ file.data; content:example file content; sid:2; rev:1;) alert http2 any any - any any (msg:http2 app layer file.data example; \ file.data; content:example file content; sid:3; rev:1;) alert nfs any any - any any (msg:nfs app layer file.data example; \ file.data; content: ; sid:5; rev:1;) alert ftp-data any any - any any (msg:ftp app layer file.data example; \ file.data; content:example file content; sid:6; rev:1;) alert tcp any any - any any (msg:tcp file.data example; \ file.data; content:example file content; sid:4; rev:1;)注意file_data是旧式写法但仍然可用。在源码中file.data与file_data互为别名注册时设置了alias file_data见 detect-file-data.c。从实现上看file.data是一个注册在文件处理表中的内容检查引擎DetectEngineInspectFiledata并配有 MPM 预过滤器PrefilterMpmFiledataRegister意味着命中file.data的规则会走「先匹配 content 快速模式、再深度检查文件内容」的标准流水线。file.name匹配文件名file.name是用于匹配流中文件名称的粘性缓冲区同样支持startswith、nocase、bsize等载荷关键字。示例file.name; content:examplefilename;file.name支持多重缓冲匹配multiple buffer matching可在一个规则里对同一缓冲区使用多个content参见 multi-buffer-matching.rst。源码中通过DetectBufferTypeSupportsMultiInstance(file.name)显式声明了这一能力见 detect-filename.c。旧式关键字filename仍然可以使用。它与file.name的一个显著差异是filename默认假定nocase忽略大小写而file.name需要显式写出nocase。因此下面两条规则等价filename:examplefilename; file.name; content:examplefilename; nocase;源码印证DetectFilenameSetup旧式写法在解析内容后调用DetectContentConvertToNocase强制转为不区分大小写见 detect-filename.c而粘性缓冲区的file.name版本DetectFilenameSetupSticky不做此默认转换大小写行为完全由规则里的nocase决定。src/detect-filename.c中的单元测试还验证了file.name支持content、nocase、endswith、startswith、bsize等组合以及「file.name只能用于 HTTP 等支持文件的应用层协议、不能直接用于裸 TCP」这一约束见 detect-filename.c。fileext匹配文件扩展名fileext用于匹配流中出现的文件的扩展名。示例fileext:pdf;两个关键行为需要注意fileext不允许部分匹配。例如一个 PDF 文件.pdf遇到fileext:pd的规则时不会产生告警。fileext默认假定nocase。扩展名为.PDF与.pdf的文件会被同等看待。fileext与file.name都能匹配扩展名下面两条规则等价fileext:pdf; file.name; content:.pdf; nocase; endswith;但二者仍有区别file.name允许对扩展名做部分匹配例如下面的规则会同时命中.pd和.pdf扩展名的文件file.name; content:.pd;源码实现揭示了fileext的底层机制见 detect-filename.c 的DetectFileextSetup解析时自动在扩展名前补一个点号.将其构造成content:.pdf然后强制设置DETECT_CONTENT_ENDS_WITH等价于endswith并调用DetectContentConvertToNocase等价于nocase最后把该 content 绑定到file.name缓冲区上。也就是说fileext:pdf在内部就是file.name; content:.pdf; endswith; nocase;——这也正是它不允许部分匹配、默认忽略大小写的根本原因。file.magic基于 libmagic 的文件类型匹配file.magic匹配 libmagic 对文件返回的类型信息。示例file.magic; content:executable for MS Windows;旧式关键字filemagic仍然可用二者唯一区别同样是大小写默认值filemagic默认nocase而file.magic需要显式声明。下面两条规则等价filemagic:executable for MS Windows; file.magic; content:executable for MS Windows; nocase;在源码中两者分别注册为DETECT_FILEMAGIC与DETECT_FILE_MAGIC共用同一套线程级上下文DetectFilemagicThreadInit等见 detect-filemagic.c。file.magic同样支持多重缓冲匹配multi-buffer-matching.rst。一个重要的工程提醒Suricata 使用底层操作系统的 libmagic 版本/实现不同版本与实现返回的信息并不一致且对 Suricata 的性能影响也各不相同。因此在生产环境中magic 匹配结果的准确性取决于部署机自身的 libmagic 行为。filestore把命中的文件落盘filestore在签名匹配时把文件存储到磁盘。它通常与文件名、扩展名、magic 或校验和关键字配合使用。语法filestore:direction,scope;**direction方向**取值request/to_server存储请求to_server方向的文件response/to_client存储响应to_client方向的文件both两个方向都存储**scope范围**取值file只存储匹配的那个文件适用于 filename、fileext、filemagic 等匹配tx存储该 HTTP 事务transaction中的所有文件ssn/flow存储该 TCP 会话/流中的所有文件默认行为若省略 direction 与 scope则 direction 与规则方向一致规则是 to_client 就存 to_clientscope 按单文件per file处理。源码对默认值的处理非常清晰见 detect-filestore.c 的DetectFilestoreSetup解析正则^\s*([A-z_])\s*(?:,\s*([A-z_]))?\s*(?:,\s*([A-z_]))?\s*$提取最多三个参数request/to_server映射为FILESTORE_DIR_TOSERVERresponse/to_client映射为FILESTORE_DIR_TOCLIENTboth映射为FILESTORE_DIR_BOTH——值得注意的是一旦指定了 directionscope 会被默认置为tx第二参数显式给出file/tx/ssn/flow时才覆盖该默认。落盘动作由后置匹配函数DetectFilestorePostMatch完成单文件场景调用FileStoreFileByIdtx 场景通过AppLayerTxData-file_flags设置FLOWFILE_STORE_TC/TSflow 场景则写入流与应用层状态数据见 detect-filestore.c。两个重要的工程约束均有源码佐证filestore不能与bypass关键字同时使用——DetectFilestoreSetup中若发现SIG_FLAG_BYPASS会直接报错拒绝加载规则对应单元测试DetectFilestoreTest01见 detect-filestore.c。规则依赖file-store输出模块——加载时若检测到FEATURE_OUTPUT_FILESTORE未启用会输出警告「Enable the output file-store」。文件提取指南中的配套示例规则见 file-extraction.rstalert http any any - any any (msg:FILE store all; filestore; sid:1; rev:1;) alert http any any - any any (msg:FILE PDF file claimed; fileext:pdf; filestore; sid:2; rev:1;) alert http any any - any any (msg:FILE pdf detected; filemagic:PDF document; filestore; sid:3; rev:1;) alert http any any - any any (msg:Black list checksum match and extract MD5; filemd5:fileextraction-chksum.list; filestore; sid:4; rev:1;) alert http any any - any any (msg:Black list checksum match and extract SHA1; filesha1:fileextraction-chksum.list; filestore; sid:5; rev:1;) alert http any any - any any (msg:Black list checksum match and extract SHA256; filesha256:fileextraction-chksum.list; filestore; sid:6; rev:1;)此外可存储文件的最大尺寸受file-store.stream-depth约束达到该值后文件可能被截断而无法完整存储。filestore关键字生效时file-store.stream-depth会覆盖stream.reassembly.depth但前者不能设为小于后者否则被忽略并出现警告。filemd5 / filesha1 / filesha256校验和黑名单 / 白名单这三个关键字把文件的校验和与外部列表文件中的值进行匹配。语法三者完全一致filemd5:[!]filename; filesha1:[!]filename; filesha256:[!]filename;filename 会被展开为包含规则目录的完整路径。默认情况下等价于/etc/suricata/rules/filename。加感叹号!表示取反匹配可用于白名单场景。示例filemd5:md5-blacklist; filemd5:!md5-whitelist; filesha1:sha1-blacklist; filesha1:!sha1-whitelist; filesha256:sha256-blacklist; filesha256:!sha256-whitelist;列表文件格式非常简单每行一个校验和以十六进制写在行首行内多余的信息会被忽略。因此md5sum的输出可以直接使用2f8d0355f0032c3e6311c6408d7c2dc2 util-path.c b9cf5cf347a70e02fde975fc4e117760 util-pidfile.c 02aaa6c3f4dbae65f5889eeb8f2bbb8d util-pool.c dd5fc1ee7f2f96b5f12d1a854007a818 util-print.c纯校验和列表同样有效2f8d0355f0032c3e6311c6408d7c2dc2 b9cf5cf347a70e02fde975fc4e117760 02aaa6c3f4dbae65f5889eeb8f2bbb8d dd5fc1ee7f2f96b5f12d1a854007a818内存开销每个 MD5 占用 16 字节。2000 万20 Million个 MD5 大约占用310 MiB内存。SHA120 字节与 SHA25632 字节的逐项开销相应更大规划大列表前应先评估内存预算。实现上三个关键字共用DetectFileHashMatch与DetectFileHashSetup通用逻辑列表在规则加载时通过LoadHashTable装载进只读哈希表ROHashTable匹配时按字节解析出二进制摘要后做哈希查找见 detect-filemd5.c 的MD5MatchLookupString与单元测试MD5MatchTest01。MD5 的 32 位十六进制串会被转换为 16 字节二进制键值这也是「每个 MD5 16 字节」的由来。SHA1 与 SHA256 的注册分别在 detect-filesha1.c 与 detect-filesha256.c。filesize按传输中的文件大小匹配filesize匹配文件在传输过程中的大小采用无符号 64 位整数关于整数关键字见 integer-keywords.rst。语法filesize:value;可选单位是KB、MB、GB不加单位时默认按字节计。示例filesize:100; # 恰好 100 字节 filesize:100200; # 大于 100 且小于 200 filesize:100MB; # 大于 100 兆字节 filesize:100MB; # 小于 100 兆字节注意对于因丢包或达到stream.reassembly.depth而未能完整跟踪的文件只检查「大于」类条件。原因是Suricata 已经看到部分数据可以断定文件大于某个值但无法断定其最终大小会落在某个区间、等于某个精确值或小于某个值。这一点在源码中有精确的对应实现见 detect-filesize.c当文件状态为FILE_STATE_CLOSED正常结束时按完整匹配逻辑DetectU64Match处理当状态超过FILE_STATE_CLOSED文件被截断/异常终止时仅在模式为DETECT_UINT_GT或DETECT_UINT_GTE大于 / 大于等于时才进行匹配其余模式直接返回不命中。单元测试DetectFilesizeParseTest0105验证了10精确等于、 10小于、 10大于、5 10/510区间等解析结果对应的模式枚举见 detect-filesize.c。综合实战一个完整的检测与提取规则示例结合以上关键字可以构造一条「发现传输中的 PDF 文件并落盘存储」的完整规则alert http any any - any any (msg:PDF file detected and stored; \ fileext:pdf; file.magic; content:PDF document; nocase; \ filestore:response,tx; sid:1000001; rev:1;)其语义为在 HTTP 响应方向识别扩展名为.pdf且 libmagic 确认为 PDF 文档的文件并把该 HTTP 事务中的相关文件全部写入file-store目录。配合 file-extraction.rst 中的输出配置eve.files记录fileinfo元数据、file-store落盘本体即可形成「检测 → 取证 → 归档」的完整闭环。需要再次强调的是所有文件关键字都建立在文件提取机制之上部署前请确认协议解析器、file-store.stream-depth等流重组设置以及file-store/eve.files输出模块均已正确启用否则规则虽能加载却无法产生预期的提取效果。赞分享网络安全【免费下载链接】suricataSuricata is a network Intrusion Detection System, Intrusion Prevention System and Network Security Monitoring engine developed by the OISF and the Suricata community.项目地址https://gitcode.com/gh_mirrors/su/suricata点击查看免费下载相关推荐Suricata DCERPC 规则关键字全解析dcerpc.iface / dcerpc.opnum / dcerpc.stub_data 实战指南Suricata DCERPC 规则关键字全解析dcerpc.iface / dcerpc.opnum / dcerpc.stub_data 实战指南 本文围网络安全Suricata 文件提取与 File-Store 落盘实战指南从协议解析到 filestore 规则全解析Suricata 文件提取与 File Store 落盘实战指南从协议解析到 filestore 规则全解析 导读 本文围绕 Suricata 的 文件提取网络安全Suricata 解码层事件匹配decode-event 规则关键字完全指南Suricata 解码层事件匹配decode event 规则关键字完全指南 decode event 是 Suricata 规则语言中用于匹配 解码层de网络安全上一篇企业级AI自动化神器Chrome MCP Server团队协作完全指南下一篇OpenDoas常见问题解答新手必知的10个实用技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑