.. _eve-json-output: EVE JSON 输出 ============= EVE 输出功能通过 JSON 格式输出告警、异常、元数据、文件信息及协议特定记录。 最常用的方式是通过 'EVE' 实现,这是一种将所有日志汇集到单一文件的"消防栓"式方法。 .. literalinclude:: ../../partials/eve-log.yaml 每条告警、HTTP日志等都将写入此单一文件:'eve.json'。该文件可被Logstash (ELK) 或 jq 等第三方工具处理。 若 ``ethernet`` 设为 yes,则事件中将添加可用的以太网头部信息。若 ``pkt_src`` 值为 ``stream (flow timeout)``,则 ``ethernet`` 值将填充为流首包携带的以太网头部MAC地址。 若 ``suricata-version`` 设为 yes,则事件中将添加Suricata版本信息(含Git修订号,如可用)作为 ``suricata_version``。 输出缓冲 ~~~~~~~~ 输出刷新由配置段 ``heartbeat`` 中的值控制。默认情况下,Suricata的输出是同步的,几乎不存在数据未持久化的可能。然而,若 ``output.buffer-size`` 设定了非零值,则部分输出数据可能被写入但未实际刷新。最多 ``buffer-size`` 字节的数据会暂存内存,稍后写入,这为输出数据丢失提供了有限的可能性。 因此,引入了心跳机制来限制缓冲数据在被刷新前的存活时间。通过配置可指示Suricata检测线程以心跳方式刷新EVE输出。默认值下,输出缓冲和刷新行为不变。``output-flush-interval`` 控制检测线程刷新输出的频率。值为 ``0`` 表示"从不";非零值须在 ``[1-60]`` 秒之间。 当 ``outputs.buffer-size`` 大于0时,应考虑启用刷新以限制未持久化输出数据的量和时效。若 ``buffer-size`` 为 ``0`` 则无需刷新。 :: heartbeat: #output-flush-interval: 0 输出类型 ~~~~~~~~~~~~ EVE支持多种输出方式。``regular`` 为常规文件。其他选项包括 ``syslog``、``unix_dgram``、``unix_stream`` 和 ``redis``。 输出类型示例:: filetype: regular #regular|syslog|unix_dgram|unix_stream|redis filename: eve.json # 启用多线程eve.json输出;输出文件名会附加标识符,如eve.9.json。默认:关闭 #threaded: off # 指定此输出类型的缓冲大小(字节)。 # 默认值0表示"无缓冲"。 #buffer-size: 0 #prefix: "@cee: " # 每条日志条目前缀 # 以下选项在type: syslog时有效 #identity: "suricata" #facility: local5 #level: Info ## 可选级别: Emergency, Alert, Critical, ## Error, Warning, Notice, Info, Debug #ethernet: no # 事件中记录可用的以太网头部 #suricata-version: no # 包含suricata版本。默认不包含。 #redis: # server: 127.0.0.1 # port: 6379 # async: true ## 是否异步读取redis回复 # mode: list ## 可选值: list|lpush (默认), rpush, channel|publish, xadd|stream # ## lpush和rpush使用Redis列表。"list"是lpush的别名 # ## publish使用Redis频道。"channel"是publish的别名 # ## xadd使用Redis流。"stream"是xadd的别名 # key: suricata ## 使用的键/频道/流名称(默认为suricata) # stream-maxlen: 100000 ## 自动将流长度修剪至最多此数量事件。 ## 设为0禁用修剪。仅mode为xadd/stream时有效。 # stream-trim-exact: false ## 精确修剪至上述最大流长度。 ## 默认:非精确修剪(允许少量偏差) ## 仅mode为xadd/stream时有效。 # Redis流水线设置。这将使每'batch-size'个事件才执行一次查询。 # 可降低网络延迟代价,但需消耗更多内存。无自动刷新机制, # 故仅建议高流量场景使用。 # pipelining: # enabled: yes ## 设为yes启用查询流水线 # batch-size: 10 ## 缓冲区内保留的条目数 .. _eve-output-alert: 告警 ~~~~~~ 告警是规则匹配产生的事件记录。可附加元数据,如触发告警的应用层记录(HTTP、DNS等)及规则元素。 使用应用层关键字的签名告警会附加应用层元数据。UDP协议亦如此,因每个单包预期包含PDU。 对于其他签名,可使用 ``guess-applayer-tx`` 选项强制检测引擎将事务与告警关联。 此事务不保证是相关事务,具体取决于使用场景及"相关"定义。 **警告:若存在多个活跃事务,则不会选择任何事务。** 此举旨在减少记录无关数据的概率,可能导致某些情况下告警无元数据记录。 此类告警事件将标记 ``tx_guessed: true``。 元数据配置:: - alert: #payload: yes # 启用Base64格式负载转储 #payload-buffer-size: 4kb # 输出到eve-log的最大负载缓冲区大小 #payload-printable: yes # 启用可打印(有损)格式负载转储 #payload-length: yes # 启用负载长度转储(含间隙) #packet: yes # 启用数据包转储(不含流分段) #http-body: yes # 需元数据;启用HTTP正文Base64转储 #http-body-printable: yes # 需元数据;启用HTTP正文可打印格式转储 # 元数据: # 包含解码后的应用层(如http、dns) #app-layer: true # 记录流记录的当前状态 #flow: true #rule: # 以结构化格式记录规则中的元数据字段 #metadata: true # 记录原始规则文本 #raw: false # 包含规则引用信息 #reference: false 异常 ~~~~~~~ 异常记录处理具有意外或异常值的数据包时创建的事件。包括协议值错误、协议长度值错误等可疑数据包条件。流正常进展中也可能出现其他条件;这些称为 ``stream`` 事件,包含值错误或顺序异常的控制序列。 异常按类型报告和配置: - 解码异常 - 流异常 - 应用层异常 元数据配置:: - anomaly: # 异常日志记录描述意外条件,如截断包、 # 无效IP/UDP/TCP长度值等使数据包无法继续处理的事件, # 或已建立流上的意外行为。高频异常网络可能导致数据包处理性能下降。 # # 报告以下异常: # 1. 解码异常:解码单个数据包时检测到的值和条件。包括底层协议长度的无效或意外值。 # 2. 流异常:包括流相关事件(TCP三次握手问题、意外序列号等)。 # 3. 应用层异常:指应用层特定条件下意外、无效或与监控状态不符的情况。 # # 默认禁用异常日志。启用后,默认开启应用层异常报告。 # # 选择一种或多种异常日志类型,及是否记录数据包异常的包头信息。 types: #decode: no #stream: no #applayer: yes #packethdr: no HTTP ~~~~ HTTP事务日志。 配置:: - http: extended: yes # 启用扩展日志信息 # custom允许在eve-log中添加额外HTTP字段 # 取消注释后,下方示例将添加三个额外字段 #custom: [Accept-Encoding, Accept-Language, Authorization] # 将此值设为{both, request, response}之一以转储 # 每个HTTP请求和/或响应的所有头部 # dump-all-headers: [both, request, response] 自定义字段列表: ====================== ====================== Yaml选项 HTTP头部 ====================== ====================== accept accept accept_charset accept-charset accept_encoding accept-encoding accept_language accept-language accept_datetime accept-datetime authorization authorization cache_control cache-control cookie cookie from from max_forwards max-forwards origin origin pragma pragma proxy_authorization proxy-authorization range range te te via via x_requested_with x-requested-with dnt dnt x_forwarded_proto x-forwarded-proto x_authenticated_user x-authenticated-user x_flash_version x-flash-version accept_range accept-range age age allow allow connection connection content_encoding content-encoding content_language content-language content_length content-length content_location content-location content_md5 content-md5 content_range content-range content_type content-type date date etag etags expires expires last_modified last-modified link link location location proxy_authenticate proxy-authenticate referer referer refresh refresh retry_after retry-after server server set_cookie set-cookie trailer trailer transfer_encoding transfer-encoding upgrade upgrade vary vary warning warning www_authenticate www-authenticate true_client_ip true-client-ip org_src_ip org-src-ip x_bluecoat_via x-bluecoat-via ====================== ====================== ``custom`` 选项中可使用两列的值。``HTTP Header`` 列不区分大小写。 .. _output-eve-dns: DNS ~~~ .. note:: Suricata 7.0起已移除v1 EVE DNS格式。 版本2 EVE DNS将在Suricata 9中移除。 DNS请求和响应分别记录为独立条目。 YAML配置:: - dns: #version: 3 # 启用/禁用此记录器。默认:启用。 #enabled: yes # 控制请求和响应记录: # - requests: 记录DNS查询 # - responses: 记录DNS应答 # 默认两者均记录。 #requests: no #responses: no # 应答记录格式: # - detailed: 每个应答单独条目 # - grouped: 按类型聚合应答 # 默认:全部 #formats: [detailed, grouped] # 基于查询类型的记录类型。 # 默认:全部。 #types: [a, aaaa, cname, mx, ns, ptr, txt] TLS ~~~ 每个TLS会话记录一条日志。 YAML配置:: - tls: extended: yes # 启用扩展日志信息 # custom用于控制包含哪些TLS字段 #custom: [subject, issuer, serial, fingerprint, sni, version, not_before, not_after, certificate, chain, ja3, ja3s, ja4] 默认记录证书主题和颁发者。启用 ``extended`` 后日志更详细。 通过 ``custom`` 可选择记录哪些TLS字段。 **注意:这将禁用 ``extended`` 日志。** ARP ~~~ ARP请求和响应分别记录为独立条目。 YAML配置:: - arp: enabled: no 默认禁用此记录器,因ARP可能生成大量事件。 Netflow ~~~~~~~ Netflow记录与流记录类似,但为单向记录(流记录为双向)。因此Netflow记录数量是流记录的两倍。 默认禁用Netflow记录。 YAML配置:: #- netflow 启用Netflow:: - netflow: enabled: yes MQTT ~~~~ EVE-JSON的MQTT输出每个事务为一个对象,含通用及类型特定字段。可配置两方面: YAML配置:: - mqtt: # passwords: yes # 启用密码明文输出 # string-log-limit: 1kb # 记录字符串的字节大小限制。 # 可用kb, mb, gb单位。纯数字视为字节。 # 默认1KB。设为0禁用限制。 # 注意大小也受最大解析消息限制(参见 # 应用层配置) 默认输出明文密码且不限制消息负载大小。根据解析器使用场景(公开输出、频繁二进制传输等),可针对常规 ``mqtt`` 事件进行配置。 丢包记录 ~~~~~~~ 丢包记录引擎丢弃数据包时生成的事件类型。 配置:: - drop: alerts: yes # 记录触发丢包的告警 flows: all # start或all:'start'仅记录每个流方向的首次丢包。 # all记录每个被丢包。 # 启用记录引擎对数据包的最终处置动作 # (若因'reject'导致丢包将显示更多信息) verdict: yes .. _eve-json-output-stats: 统计 ~~~~~ 零值计数器 """""""""""""""""""" 人性化的 `stats.log` 输出默认仅记录非零计数器,而EVE统计日志默认记录所有启用的计数器,可能导致日志冗长。 为减小日志体积,可设 `null-values` 为 false。注意这可能影响零值有意义的统计信息的可见性。 配置:: - stats: # 不记录零值统计计数器。默认:true #null-values: false # False将不记录值为0的统计计数器 文件名中的日期修饰符 ~~~~~~~~~~~~~~~~~~~~~~~~~~ 可在eve-log文件名中使用日期修饰符。 :: outputs: - eve-log: filename: eve-%s.json 上例在文件名中添加纪元时间。支持C库所有日期修饰符。参见 ``strftime`` 手册页了解全部支持修饰符。 .. _output_eve_rotate: 多线程文件输出 ~~~~~~~~~~~~~~~~~~~~ 默认所有输出写入outputs节指定的文件名。``threaded`` 选项使每个输出线程写入独立文件。此时 ``filename`` 将包含唯一标识符。 启用 ``threaded`` 后,输出将分散到多个文件——需将所有文件内容聚合处理。 :: outputs: - eve-log: filename: eve.json threaded: on 此例使每个Suricata线程写入各自的"eve.json"文件。文件名通过添加唯一标识符构造,如 ``eve.7.json``。 日志轮转 ~~~~~~~~~~~~~ Eve-log可配置基于时间的轮转。 :: outputs: - eve-log: filename: eve-%Y-%m-%d-%H:%M.json rotate-interval: minute 上例每分钟创建新日志文件,文件名含时间戳。其他支持的 ``rotate-interval`` 值为 ``hour`` 和 ``day``。 此外,还可将 ``rotate-interval`` 设为相对值。例如每X秒轮转日志文件。 :: outputs: - eve-log: filename: eve-%Y-%m-%d-%H:%M:%S.json rotate-interval: 30s 上例每30秒轮转eve-log。可替换为 ``30m``(30分钟)、``30h``(30小时)、``30d``(30天)或 ``30w``(30周)。 .. _multiple-eve-instances: 多记录器实例 ~~~~~~~~~~~~~~~~~~~~~~~~~ 可配置多个'EVE'实例,例如以下配置有效: :: outputs: - eve-log: enabled: yes type: file filename: eve-ips.json types: - alert - drop - eve-log: enabled: yes type: file filename: eve-nsm.json types: - http - dns - tls 此处告警和丢包记录到'eve-ips.json',而http、dns和tls记录到'eve-nsm.json'。 除 ``drop`` 外,可指定多个相同类型的记录器,但 ``drop`` 仅能使用一次。 .. note:: 独立json记录器(如alert-json-log、dns-json-log等)的使用已弃用, 将于2020年6月移除。请改用上述多eve-log实例。详见`弃用政策`_。 文件权限 ~~~~~~~~~~~~~~~~ 可为每个记录器单独设置日志文件权限。``filemode`` 用于控制日志文件权限,例如: :: outputs: - eve-log: enabled: yes filename: eve.json filemode: 600 上例将 ``eve.json`` 的文件权限设为600,即仅文件所有者可读写。 JSON标志 ~~~~~~~~~~ 可通过多个标志控制EVE中的JSON输出: :: outputs: - eve-log: json: # 按插入顺序排序对象键 preserve-order: yes # 使输出更紧凑 compact: yes # 转义ASCII范围外的所有Unicode字符 ensure-ascii: yes # 用'\/'转义字符串中的'/'字符 escape-slash: yes 这些标志默认均启用,可按EVE实例修改。 社区流ID ~~~~~~~~~~~~~~~~~ Suricata常与Bro/Zeek等工具配合使用。在eve-log节启用community-id选项会为每条输出添加 ``community_id`` 字段。 示例:: { "timestamp": "2003-12-16T13:21:44.891921+0000", "flow_id": 1332028388187153, "pcap_cnt": 1, "event_type": "alert", ... "community_id": "1:LQU9qZlK+B5F3KDmev6m5PMibrg=", "alert": { "action": "allowed", "gid": 1, "signature_id": 1, },