【雷池】syslog 详解
背景
常见咨询:
- syslog 配置;
- syslog 投递格式;
- syslog 日志字段;
扩展知识: - syslog投递原理
- syslog注意事项
常见咨询
syslog 配置
系统设置->告警收信配置->告警配置方式配置->添加一个新的告警服务->告警方式选择syslog;


配置后如下图所示:

告警方式
告警方式主要有sysLog和email
两者区别sysLog可以投递所有日志信息,而email不支持访问、攻击以及频率日志。

syslog 服务器

填写服务器地址和端口,只要是能接收日志消息,可以是logstash、elasticsearch等等...
在填写时需要确定,IP和端口可以正常访问。
RFC
Syslog常被用来日志等数据的传输协议,数据格式遵循规范主要有RFC3164,RFC5424;
RFC5424 相比 RFC3164 主要是数据格式的不同,RFC3164相对来说格式较为简单,能适应大部分使用场景,但是已废弃,RFC5424已作为Syslog的业界规范。

协议
雷池默认选择是tcp协议,但是在市面上常用日志协议是udp方式,在这需要根据实际需求选择。

通用与安全
通用选项,主要是管理节点数据监控,syslog和email均支持发送。
安全,主要为策略日志和域名管理记录,比如编辑站点或策略都可记录系统日志,而这可选择使用syslog投递或者email告警。访问、攻击以及频率日志只支持syslog投递。
可根据需求选择,需要投递哪些类型日志。

投递格式
syslog 默认投递都是json,在投递的日志中有syslog消息头,在此之后便是完整消息内容。

如果有不想投递的字段可以使用自定义格式,本次以攻击日志为例:

因在waf上默认即使json,如果业务需求是数组、元组、或者其他日志格式,即可通过自定义方式设置,自定义日志字段和格式。
- 数组格式
![]()
- 验证结果
![]()
日志字段
在自定义格式的格式化字符串中,以美元符()开头的单词代表一个字段,在 Syslog 发送的时候会被检测日志中对应的字段替换。假设请求的源 IP 是 127.0.0.1,src_ip 会被替换 127.0.0.1。若希望对应的字段被替换时其包含的特殊字符串(控制字符 \r \n、不可见字符、引号)被转义,可以使用双引号将其包裹,即 "src_ip" 会被替换为 "127.0.0.1"。如果希望在格式化字符串中使用美元符,可以使用两个美元符 :即 src_ip 不会被认为是字段,而会直接输出为 src_ip。
日志字段介绍
| 字段(key) | 字段解释名 | 值(value) |
|---|---|---|
| $action | 雷池对于该攻击所执行的动作 | deny(拦截)、allow(放行)、unknown(未知) |
| $attack_type | 攻击类型 | 见下表详情 |
| $body | 原始 HTTP 请求体 | - |
| $cookie | HTTP 请求的 cookie | |
| $country | 攻击 IP 的归属国家 | CountryCode,对应的国家字段 |
| $decode_path | 解码攻击载荷的方式 | - |
| $dest_ip | HTTP 请求的目的 IP | 普通 IP 字段 |
| $dest_port | HTTP 请求的目的端口 | 普通字段 |
| $event_id | 攻击事件的 ID | 普通 ID 字段 |
| $host | HTTP 请求的 Host | - |
| $location | 攻击载荷所处于请求中的位置 | - |
| $method | HTTP 请求的 Method | - |
| $module | 检测到该攻击的检测模块名称 | 见下表详情 |
| $node | 检测到该攻击的检测节点名称 | 普通字段 |
| $payload | 攻击载荷 | Payload 字段 |
| $protocol | 请求的协议类型 | http、https |
| $province | 攻击 IP 的归属省份 | 国内对应省份的汉字,国外对应 IP 数据库中的 NAME ,格式比较乱 |
| $referer | HTTP 请求的 Referer | - |
| $req_header_raw | 原始 HTTP 请求头 | - |
| $resp_body | 原始 HTTP 返回体 | - |
| $resp_header_raw | HTTP 的原始返回头 | - |
| $resp_reason_phrase | HTTP 返回状态码的解释 | - |
| $resp_status_code | 原始 HTTP 返回状态码 | - |
| $risk_level | 攻击危害等级 | high(高危)、low(低危)、none(无威胁)、medium(中危)、unknown(未知) |
| $rule_id | 命中的自定义规则 ID | 普通 ID 字段 |
| $selector_id | 请求所使用的策略组 ID | 普通 ID 字段 |
| $session | HTTP 请求的 session | session 字段 |
| $src_ip | 发起攻击的源 IP | 普通 IP 字段 |
| $src_port | 发起攻击的源端口 | 普通字段 |
| $timestamp | 攻击记录时间 | Unix 的时间戳形式 |
| $timestamp_human | 人可读的时间戳 | 如:2019-05-17 23:59:20 |
| $urlpath | HTTP 请求的 URL | - |
| $user_agent | HTTP 请求的 User-Agent | - |
| challenge_id | 主动 BOT 防护中,通过 challenge_id 标识 challenge 的唯一性 | - |
| detector_ip_source | 源IP获取方式 | - |
| is_bot | 取值范围为[0,1,2];为 1 表示未通过验证;为 2 表示通过验证;为 0 表示请求第一次到达,还未进行验证 | |
| query_string | - | 请求参数,不包括问号(?)前缀,且已被 URL encoding 解码 |
| reason | 拦截原因 | - |
| req_action | 检测服务对该 请求 执行的动作 | - |
| req_attack_type | 请求攻击类型 | |
| req_block_reason | 检测服务拦截该 请求 的原因 | |
| req_body | 请求体(存在于请求阶段,明确截断) | |
| req_decode_path | req_payload 对应的解码路径,内部为不透明的结构化数据 | |
| req_detector_name | 处理该 请求 的检测服务所在的节点名称检测是无状态的,因此存在同一会话的请求和响应被不同的检测服务处理的情况 | |
| req_end_time | 请求结束时间 | 单位为毫秒(millisecond)的 Unix 时间戳 |
| req_header | 请求头 | 包含 HTTP request line,末尾需保留两个 \r\n |
| req_location | req_payload/rsp_payload 在 请求 中所处的位置 | |
| req_payload | 请求/响应 中触发攻击的部分,即「有效载荷」 | |
| req_policy_group_id | 策略 ID | |
| req_policy_id_list | 请求/响应的历史自定义规则 ID 列表 | |
| req_proxy_name | 处理该 请求 的「代理服务」节点名称 | |
| req_risk_level | ||
| req_rule_id | rule_id 把 "/" 前的部分拆分之后单独存成一个字段,比如"m_sql/xxxx",这里存 "m_sql" | |
| req_start_time | 请求开始时间(proxy 收到来来自 client 的 request 的第一个 byte 的时间) | 单位为毫秒(millisecond)的 Unix 时间戳 |
| rsp_action | 检测服务对该 响应 执行的动作,对应 patronus/skynet-interface 中提供的 skynet_action_t | |
| rsp_attack_type | ||
| rsp_block_reason | 检测服务拦截该 响应 | |
| rsp_body | 响应体存在于响应阶段,明确截断 | |
| rsp_decode_path | rsp_payload 对应的解码路径,内部为不透明的结构化数据 | |
| rsp_detector_name | 处理该 响应 的检测服务所在的节点名称检测是无状态的,因此存在同一会话的请求和响应被不同的检测服务处理的情况 | |
| rsp_end_time | 响应结束时间 | 位为毫秒(millisecond)的 Unix 时间戳 |
| rsp_header | 响应头,包含 HTTP response line,末尾需保留两个 \r\n | |
| rsp_location | req_payload/rsp_payload 在 响应 中所处的位置 | |
| rsp_payload | 请求/响应 中触发攻击的部分,即「有效载荷」 | |
| rsp_policy_group_id | 策略 ID | |
| rsp_policy_id_list | 请求/响应的历史自定义规则 ID 列表 | |
| rsp_proxy_name | 处理该 响应 的「代理服务」节点名称,「代理服务」可能是 Nginx、Ripley 或者Evnoy; | |
| rsp_risk_level | ||
| rsp_rule_id | 响应命中的规则 ID并非特指自定义规则) | |
| rsp_rule_module | rule_id 把 "/" 前的部分拆分之后单独存成一个字段,比如"m_sql/xxxx",这里存 "m_sql" | |
| rsp_start_time | 响应开始时间(proxy 收到来自 upstream 的 response 的第一个 byte 的时间) | 单位为毫秒(millisecond)的 Unix 时间戳 |
| scheme | http/https | |
| site_uuid | 站点 id | |
| socket_ip | socket_ip | |
| status_code | 响应码 | |
| tenant_id | 租户 ID,非多租户模式下无此字段 | |
| url_path | 请求路径,包含 root(/) 前缀(如果有的话)且已被 URL encoding 解码;不包含请求参数(即 query_string) | |
| verify_mode | 取值范围为[1,2],分别表示验证方式为浏览器验证和验证码验证 |

