Suricata.yaml ============= Suricata 使用 Yaml 格式进行配置。源代码中包含的 Suricata.yaml 文件是 Suricata 的示例配置文件。本文将解释每个选项。 在 YAML 文件的顶部,你会看到 % YAML 1.1。Suricata 读取文件并将其识别为 YAML 格式。 .. _suricata-yaml-max-pending-packets: 最大待处理数据包数 ------------------- 通过 max-pending-packets 设置,你可以设定 Suricata 允许同时处理的数据包数量。这个值可以从一个数据包到数万/数十万个数据包不等。这是在高性能和更多内存(RAM)使用之间的权衡。处理大量数据包会提高性能但消耗更多内存。处理少量数据包会降低性能但减少内存使用。在处理数据包数量较少的情况下,如果拥有多个 CPU/CPU 核心,可能会导致无法充分利用计算机的全部能力。(例如:使用一个核心而其他三个核心在等待处理数据包。) :: max-pending-packets: 1024 运行模式 -------- 默认情况下,runmode 选项是禁用的。通过 runmodes 设置,你可以设定想要使用的运行模式。要查看所有可用的运行模式,请在命令行输入 **--list-runmodes**。更多信息请参阅 :doc:`../performance/runmodes`。 :: runmode: autofp 默认数据包大小 ------------------- 对于 max-pending-packets 选项,Suricata 需要在内存中保存数据包。通过 default-packet-size 选项,你可以设置网络中数据包的大小。有时可能需要处理更大的数据包。引擎仍然可以处理这些更大的数据包,但处理它们会降低性能。 :: default-packet-size: 1514 用户和组 -------------- 可以设置运行 Suricata 的用户和组: :: run-as: user: suri group: suri PID 文件 -------- 此选项设置 Suricata 在守护进程模式下运行时 PID 文件的名称。该文件记录 Suricata 的进程 ID。 :: pid-file: /var/run/suricata.pid .. note:: 此配置文件选项仅在守护进程模式下运行时设置 PID 文件。要在非守护进程模式下强制创建 PID 文件,请使用 :option:`--pidfile` 命令行选项。 此外,如果运行多个 Suricata 进程,每个进程需要指定不同的 pid-file 位置。 .. _suricata-yaml-action-order: 动作顺序 ------------ 所有签名都有不同的属性。其中之一是 Action 属性,它决定了签名匹配时会发生什么。有四种类型的 Action。以下是签名匹配并包含其中一种 Action 时的行为摘要: 1) 通过 (Pass) 如果签名匹配且包含 pass,Suricata 停止扫描该数据包并跳过所有规则的末尾(仅针对当前数据包)。如果签名在 TCP 连接上匹配,整个流将被通过,但流的详细信息仍会被记录。 2) 丢弃 (Drop) 这仅涉及 IPS/内联模式。如果程序找到匹配的签名且包含 drop,它会立即停止。数据包不会被进一步发送。缺点:接收方不会收到任何关于发生了什么的提示,导致超时(特别是 TCP 协议)。Suricata 会为此数据包生成警报。 3) 拒绝 (Reject) 这是对数据包的主动拒绝。接收方和发送方都会收到一个拒绝数据包。有两种类型的拒绝数据包会自动选择。如果违规数据包涉及 TCP,将发送一个 Reset 数据包。对于所有其他协议,将发送一个 ICMP 错误数据包。Suricata 也会生成警报。在内联/IPS 模式下,违规数据包也会像 'drop' 动作一样被丢弃。 4) 警报 (Alert) 如果签名匹配且包含 alert,数据包将像任何其他非威胁数据包一样被处理,但 Suricata 会为此生成一个警报。只有系统管理员可以注意到此警报。 内联/IPS 可以通过两种方式阻止网络流量。一种是通过 drop,另一种是通过 reject。 规则将按照它们在文件中出现的顺序加载。但它们将以不同的顺序进行处理。签名有不同的优先级。最重要的签名将首先被扫描。可以更改优先级顺序。默认顺序是:pass, drop, reject, alert。 :: action-order: - pass - drop - reject - alert 这意味着 pass 规则在 drop 规则之前被考虑,drop 规则在 reject 规则之前被考虑,依此类推。 数据包警报队列设置 --------------------------- 可以配置用于附加由每个数据包触发的警报队列的大小。 这将影响感知到针对给定数据包匹配的警报数量。默认值为 15。如果提供无效设置或未提供值,引擎将回退到默认值。 :: #定义可以针对同一数据包触发的最大可能警报数。默认为 15 packet-alert-max: 15 我们建议你使用此设置的默认值,除非你看到大量被丢弃的警报(``alert_queue_overflow``)—— 更多详情请参阅 `丢弃和抑制的警报统计`_ 部分。 对引擎行为的影响 ~~~~~~~~~~~~~~~~~~~~~~~~~ 在内部,Suricata 引擎用具有自己的警报队列的数据结构表示每个数据包。队列的最大大小由 ``packet-alert-max`` 定义。同一规则可以被同一数据包多次触发。只要警报队列中还有空间,这些警报就会被附加。 具有 ``noalert`` 关键字的规则将被检查 —— 如果它们的签名有必须应用于数据包或流的动作,则会被抑制。它们对最终的警报队列没有影响。 规则按优先级排队:如果 Suricata 达到给定数据包的 ``packet-alert-max``(即数据包警报队列溢出),高优先级规则可能会被保留,而低优先级规则可能会被替换。 数据包警报队列溢出 ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 一旦警报队列达到最大大小,我们可能面临数据包警报队列溢出,因此新警报只有在它们的规则具有更高的优先级 ID(这是引擎分配的内部 ID,不是签名 ID)时才会被附加。 这可能在两种不同的情况下发生: - 高优先级规则在低优先级规则之后触发:低优先级规则在队列中被替换; - 低优先级规则触发:规则直接被丢弃。 .. note :: 这种行为并不意味着在 IPS 模式下触发的 ``drop`` 规则的动作会被忽略。 .. _alerts stats: 丢弃和抑制的警报统计 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 上述两种场景都将被记录为 *detect.alert_queue_overflow* 在统计日志中(stats.log 和 eve-log 的 stats 事件)。 当 ``noalert`` 规则匹配时,它们会以 *detect.alerts_suppressed* 的形式出现在统计日志中。 :: Date: 4/6/2022 -- 17:18:08 (uptime: 0d, 00h 00m 00s) ------------------------------------------------------------------------------------ Counter | TM Name | Value ------------------------------------------------------------------------------------ detect.alert | Total | 3 detect.alert_queue_overflow | Total | 4 detect.alerts_suppressed | Total | 1 在这个来自 stats.log 的示例中,我们读到生成了 8 个警报:3 个被保留在数据包队列中,4 个由于数据包达到警报队列的最大大小而被丢弃,1 个由于来自 ``noalert`` 规则而被抑制。 将配置拆分为多个文件 ----------------------------------------- 一些用户可能希望将他们的 suricata.yaml 文件拆分为多个单独的文件,这可以通过 'include' 和 '!include' 关键字实现。第一个示例是将 outputs 部分的内容存储到 outputs.yaml 中。 :: # outputs.yaml - fast enabled: yes filename: fast.log append: yes ... :: # suricata.yaml ... outputs: !include outputs.yaml ... 第二种场景是将多个部分迁移到不同的 YAML 文件中。 :: # host_1.yaml max-pending-packets: 2048 outputs: - fast enabled: yes filename: fast.log append: yes :: # suricata.yaml include: host_1.yaml ... 如果在 include 语句之后重新定义了相同的部分(例如 outputs),它将覆盖包含的文件。因此,文档末尾的任何 include 语句都将覆盖已配置的部分。 事件输出 ------------ 默认日志目录 ~~~~~~~~~~~~~~~~~~~~~~~~~ 在 /var/log/suricata 目录中,将存储 Suricata 的所有输出(警报和事件)。 :: default-log-dir: /var/log/suricata 可以通过输入 -l 命令行参数或直接在 Yaml 中更改目录来覆盖此目录。要使用 -l 命令行参数更改它,请输入以下内容: :: suricata -c suricata.yaml -i eth0 -l /var/log/suricata-logs/ .. _suricata_yaml_outputs: 统计 ~~~~~ 引擎统计信息(如数据包计数器、内存使用计数器等)可以通过多种方式记录。默认情况下启用单独的文本日志 'stats.log' 和 EVE 记录类型 'stats'。 统计信息有全局配置和每个记录器的配置。这里记录的是全局配置。 :: # 全局统计配置 stats: enabled: yes # interval 字段(以秒为单位)控制记录器被调用的间隔。 interval: 8 # 将解码事件添加为统计信息。 #decoder-events: true # 统计信息中的解码事件前缀。之前是 'decoder',但这会导致 eve.stats 记录中缺少事件。参见 issue #2225。 #decoder-events-prefix: "decoder.event" # 将流事件添加为统计信息。 #stream-events: false # 异常策略统计计数器选项 # (注意:如果异常策略为 ignore,则不记录计数器) exception-policy: #per-app-proto-errors: false # 默认:false。True 将为每个应用协议记录错误。警告:非常详细 可以在此处启用或禁用统计信息。 统计信息以 `interval` 为间隔进行转储。将此值设置为低于 3 或 4 秒没有意义,因为线程在内部是如何同步的。 解码层生成的解码事件可以创建每种事件类型的计数器。默认情况下启用此行为。可以将 `decoder-events` 选项设置为 `false` 来禁用。 在 4.1.x 版本中,常规解码计数器和解码事件计数器之间存在命名冲突。这导致相当数量的解码事件计数器未显示在 EVE.stats 记录中。为了解决这个问题而不破坏现有设置,添加了一个配置选项 `decoder-events-prefix`,将解码事件的名称从 decoder.. 更改为 decoder.event..。在 5.0 版本中,这成为默认设置。参见 `issue 2225 `_。 类似于 `decoder-events` 选项,`stream-events` 选项控制是否也将流事件添加为计数器。默认情况下禁用。 如果启用了任何异常策略,则会记录统计计数器。要控制应用层协议错误的详细程度,请将 `per-app-proto-errors` 保持为 false。 输出 ~~~~~~~ 有几种类型的输出。一般结构如下: :: outputs: - fast: enabled: yes filename: fast.log append: yes/no 启用所有日志会显著降低性能并占用更多磁盘空间,因此只启用你需要的输出。 基于行的警报日志(fast.log) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 此日志包含由单行组成的警报。以下是 fast.log 文件中一行的示例: :: 10/05/10-10:08:59.667372  [**] [1:2009187:4] ET WEB_CLIENT ACTIVEX iDefense COMRaider ActiveX Control Arbitrary File Deletion [**] [Classification: Web Application Attack] [Priority: 3] {TCP} xx.xx.232.144:80 -> 192.168.1.4:56068 :: -fast: #日志名称。 enabled:yes #此日志已启用。设置为 'no' 以禁用。 filename: fast.log #默认日志目录中的文件名。 append: yes/no #如果此选项设置为 yes,则在重新启动 Suricata 时不会覆盖最后一个填充的 fast.log 文件。 .. _suricata-yaml-outputs-eve: Eve(可扩展事件格式) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 这是警报和事件的 JSON 输出。它便于与第三方工具(如 logstash)集成。 .. literalinclude:: ../partials/eve-log.yaml 更多高级配置选项,请参阅 :ref:`Eve JSON 输出 `。 格式记录在 :ref:`Eve JSON 格式 ` 中。 .. _suricata-yaml-outputs-tls: TLS 参数和证书日志(tls.log) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. attention:: tls-log 在 Suricata 8.0 中已弃用,将在 Suricata 9.0 中移除。 TLS 握手参数也可以记录在基于行的日志中。默认情况下,日志文件是 suricata 日志目录中的 `tls.log`。有关日志格式的配置和自定义的详细信息,请参阅 :ref:`自定义 TLS 日志 `。 此外,还有一个输出模块用于将 TLS 证书文件存储到磁盘。这与 :ref:`文件存储(文件提取)` 类似,但针对的是 TLS 证书。 示例: :: # 输出模块,用于将证书链存储到磁盘 - tls-store: enabled: yes #certs-log-dir: certs # 存储证书文件的目录 基于行的 HTTP 请求日志(http.log) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. attention:: http-log 在 Suricata 8.0 中已弃用,将在 Suricata 9.0 中移除。 此日志跟踪所有 HTTP 流量事件。它包含 HTTP 请求、主机名、URI 和 User-Agent。这些信息将存储在 http.log(默认名称,位于 suricata 日志目录中)。也可以通过使用 :ref:`Eve-log 功能 ` 进行此日志记录。 非扩展日志记录的 HTTP 日志行示例: :: 07/01/2014-04:20:14.338309 vg.no [**] / [**] Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36 [**] 192.168.1.6:64685 -> 195.88.54.16:80 扩展日志记录的 HTTP 日志行示例: :: 07/01/2014-04:21:06.994705 vg.no [**] / [**] Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36 [**] [**] GET [**] HTTP/1.1 [**] 301 => http://www.vg.no/ [**] 239 bytes [**] 192.168.1.6:64726 -> 195.88.54.16:80 :: - http-log: #日志名称。 enabled: yes #此日志已启用。设置为 'no' 以禁用。 filename: http.log #默认日志目录中的文件名。 append: yes/no #如果此选项设置为 yes,则在重新启动 Suricata 时不会覆盖最后一个填充的 http.log 文件。 extended: yes #如果设置为 yes,将写入关于事件的更多信息。 .. _suricata_yaml_pcap_log: 数据包日志(pcap-log) ~~~~~~~~~~~~~~~~~~~~~ 通过 pcap-log 选项,你可以将所有由 Suricata 注册的数据包保存到名为 _log.pcap_ 的日志文件中。这样,你可以随时查看所有数据包。在正常模式下,pcap 文件会在 default-log-dir 中创建。如果 yaml 文件中设置了绝对路径,也可以在其他地方创建。 保存在 ``default-log-dir`` `/var/log/suricata` 中的文件可以用任何支持 pcap 文件格式的程序打开。这可以是 Wireshark、TCPdump、Suricata、Snort 等。 pcap-log 选项可以启用和禁用。 可以设置 pcap-log 文件的大小限制。默认限制是 32 MB。如果日志文件达到此限制,文件将被轮换并创建一个新文件。 记住,在 'normal' 模式下,文件将保存在 default-log-dir 或绝对路径中(如果设置)。 通过将 compression 选项设置为 lz4,可以在写入磁盘之前压缩 pcap 文件。 注意:在 Windows 上,此选项会增加磁盘 I/O 而不是减少它。当使用 lz4 压缩时,可以使用 lz4-checksum 选项启用校验和,并且可以将压缩级别 lz4-level 设置为 0 到 16 之间的值,其中更高的级别会导致更高的压缩率。 默认情况下,所有数据包都会被记录,除了: - 超过 stream.reassembly.depth 的 TCP 流 - 密钥交换后的加密流 - 如果设置了 ``bpf-filter``,不匹配过滤器的数据包将不会被记录 可以通过在 pcap-log 部分使用 `conditional` 选项进行条件性 pcap 日志记录。默认情况下,变量设置为 `all`,因此所有数据包都会被记录。如果变量设置为 `alerts`,则只有带有警报的流会被记录。如果变量设置为 `tag`,则只有被签名使用 `tag` 关键字标记的数据包会被记录到 pcap 文件中。请注意,如果使用 `alerts` 或 `tag`,则在 TCP 会话的情况下,Suricata 将使用流引擎中的可用信息记录触发警报的数据。 :: - pcap-log: enabled: yes filename: log.pcap # 限制大小(MB)。 limit: 32 mode: normal # "normal" 或 multi conditional: alerts # 应用于所有被记录的数据包的 BPF 过滤器。如果设置,数据包必须匹配此过滤器,否则不会被记录。 #bpf-filter: 在 ``normal`` 模式下,pcap 文件 "filename" 会在 default-log-dir 或由 "dir" 指定的位置创建。``normal`` 模式通常不如 ``multi`` 模式性能好。 在 multi 模式下,会创建多个 pcap 文件(每个线程一个),