查看「安全检测」日志
2024-09-05
本文档主要介绍观测云安全检测任务中产生的函数日志
1. 简介
与其他 DataFlux Func 中执行的函数一样,当配置了函数日志上报至观测云后,安全检测任务的日志同样可以方便地在观测云平台查询。
有关如何配置函数日志上报到观测云,以及上报的各字段说明,请参考 手册 / 部署和维护 / 上报自观测数据
2. 查询日志
关键字段:
| 字段 |
类型 |
说明 |
source |
str |
固定为 DFF_task_record_func |
func_id |
str |
函数 ID 检测触发任务日志:guance__api.siem_trigger 检测结果接收日志:guance__api.siem_receive_results |
workspace_uuid |
str |
所属观测云工作空间 UUID 格式为:wksp_xxxxx |
df_trigger_task_id |
str |
触发任务 ID 包含检测触发任务日志、检测结果接收日志 |
df_monitor_checker_id |
str |
安全检测 ID 格式为:srul_xxxxx |
event_count_total |
int |
本次任务产生的所有事件数量 |
exception_type |
str |
错误类型 如:调用 KodoAPI 错误 "KodoAPIError" |
exception |
str |
具体错误 如:KodoAPIError('Status Code: 400, ... <略>') |
如果需要查看某个工作空间的所有安全检测任务日志,使用以下条件查询:
| Text Only |
|---|
| source:DFF_task_record_func workspace_uuid:wksp_xxxxx df_monitor_checker_id:srul_*
|
如果需要查看某一个安全检测的任务日志,使用 df_monitor_checker_id 过滤:
| Text Only |
|---|
| source:DFF_task_record_func df_monitor_checker_id:srul_xxxxx
|
如果需要查看某个事件涉及的安全检测任务日志,使用「安全检测事件」中的 df_trigger_task_id 过滤:
| Text Only |
|---|
| source:DFF_task_record_func df_trigger_task_id:task-xxxxx
|
3. 分段解读
每一行日志遵循如下格式:
| 时间 |
与上一行日志 时间差(毫秒) |
任务开始至本行日志 总时间(毫秒) |
所在模块 |
内容 |
[07-30 14:52:12] |
[+0ms] |
[184ms] |
【函数】 |
调用函数:guance__api_impl.siem_trigger |
| 具体示例 |
|---|
| [07-30 14:52:12] [+0ms] [184ms] 【函数】 调用函数:guance__api_impl.siem_trigger
|
触发 Kodo SIEM 检测
DataFlux Func 侧本身并不执行 SIEM 检测处理,而是定期通过 HTTP API 将检测配置发送给 Kodo SIEM,由 Kodo SIEM 检测。
因此「触发检测」中主要处理即为调用 Kodo SIEM
| 示例 |
|---|
| [07-30 15:42:04] [+0ms] [467ms] 【KODO SIEM】 调用 KODO SIEM API -> POST http://arbiter-api.forethought-kodo:9601/v1/siem
[07-30 15:42:04] [+0ms] [468ms] 【KODO SIEM】 >> Body:{"task_id":"task-xxxxx","monitor_checker_id":"srul_xxxxx","monitor_checker_name":"<名称>","script":"<检测脚本>","trigger_time":1753858320,"time_range":[1753858200000,1753858320000],"workspace_uuid":"wksp_xxxxx","workspace_token":"tkn_xxxxx"}
[07-30 15:42:04] [+3ms] [472ms] 【KODO SIEM】 >> 响应:【200 OK】 {"status":"ok"}
|
日志记录了实际 HTTP API 调用的方法、URL 地址,请求体和响应值
获取告警策略
此部分与普通监控器相同,请参考 解读「监控器」日志 / 获取告警策略
写入事件
此部分与普通监控器相同,请参考 解读「监控器」日志 / 写入事件
4. 完整示例
每次迭代后日志内容可能有变化
由于存在新增、修改功能,或发现以往日志输出需要完善的地方
因此,每次迭代之后,日志具体内容细节可能多少都会有变动
以下是添加了解释的完整示例
在下方日志中:
# 开头的内容为说明解释,不是日志原文
同时额外加入了空行,方便阅读,日志原文中没有空行
其他内容为日志原文
| 日志解读 |
|---|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | # 观测云中「任务调度」计数
[07-30 15:42:04] [+10ms] [464ms] 【使用额度】 当前任务为免计量项目
# 本次任务执行的函数 ID 及其参数列表
[07-30 15:42:04] [+2ms] [467ms] 【函数】 调用函数:guance__api_impl.siem_trigger
[07-30 15:42:04] [+0ms] [467ms] 【函数】 --> 参数:workspace_uuid = "wksp_xxxxx"
[07-30 15:42:04] [+0ms] [467ms] 【函数】 --> 参数:checker_opt = {"id":"srul_xxxxx","name":"<名称>","label":["<标签>"],"title":"<事件标题模板>","message":"<事件详情模板>","script":"<检测脚本>","range":120,"status":"high"}
# 初始化 SIEM 任务上下文缓存
[07-30 15:42:04] [+0ms] [467ms] 【SIEM 任务上下文缓存】 从缓存中获取 field=`task-xxxxx` 的全量缓存数据
[07-30 15:42:04] [+0ms] [467ms] 【SIEM 任务上下文缓存】 --> 没有缓存数据
# 调用 Kodo SIEM 执行异步检测
[07-30 15:42:04] [+0ms] [467ms] 【KODO SIEM】 调用 KODO SIEM API -> POST http://arbiter-api.forethought-kodo:9601/v1/siem
[07-30 15:42:04] [+0ms] [468ms] 【KODO SIEM】 >> Body:{"task_id":"task-xxxxx","monitor_checker_id":"srul_xxxxx","monitor_checker_name":"<名称>","script":"<检测脚本>","trigger_time":1753858320,"time_range":[1753858200000,1753858320000],"workspace_uuid":"wksp_xxxxx","workspace_token":"tkn_xxxxx"}
[07-30 15:42:04] [+3ms] [472ms] 【KODO SIEM】 >> 响应:【200 OK】 {"status":"ok"}
# 检测配置写入缓存,供后续接收检测结果时取出使用
[07-30 15:42:04] [+1ms] [473ms] 【SIEM 任务上下文缓存】 更新缓存:
[07-30 15:42:04] [+0ms] [473ms] 【SIEM 任务上下文缓存】 --> task-xxxxx: {"context":{"checkOpt":{"id":"srul_xxxxx","name":"<名称>","label":["<标签>"],"title":"<事件标题模板>","message":"<事件详情模板>","script":"<检测脚本>","range":120,"status":"high"},"triggerTime":1753858320,"workspaceUUID":"wksp_xxxxx"},"timestamp":1753858320}
|
| 日志解读 |
|---|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95 | # 本次任务执行的函数 ID 及其参数列表
[07-30 15:42:07] [+1907ms] [1907ms] 【函数】 调用函数:guance__api_impl.siem_receive_result
[07-30 15:42:07] [+0ms] [1908ms] 【函数】 --> 参数:task_id = "task-xxxxx"
[07-30 15:42:07] [+0ms] [1908ms] 【函数】 --> 参数:results = [{"check_value":{"<检测值 Key>":"<值>"},"dimension_tags":{"<维度标签 Key>":"<值>"},"related_data":{"<关联数据 Key>":"<值>"},"status":"<级别,可为空>"}]
# 获取 SIEM 任务上下文缓存,并删除已收到结果的任务缓存
[07-30 15:42:07] [+0ms] [1909ms] 【SIEM 任务上下文缓存】 从缓存中获取 field=`task-xxxxx` 的全量缓存数据
[07-30 15:42:07] [+3ms] [1912ms] 【SIEM 任务上下文缓存】 --> {"task-xxxxx":{"context":{"checkOpt":{"id":"srul_xxxxx","name":"<名称>","label":["<标签>"],"title":"<事件标题模板>","message":"<事件详情模板>","script":"<检测脚本>","range":300,"status":"high"},"triggerTime":1753860000,"workspaceUUID":"wksp_xxxxx"},"timestamp":1753860000}}
[07-30 15:42:07] [+0ms] [1912ms] 【SIEM 任务上下文缓存】 在缓存中标记 field=`task-xxxxx` 的缓存数据为【待删除】
[07-30 15:42:07] [+0ms] [1912ms] 【SIEM 任务上下文缓存】 删除缓存:
[07-30 15:42:07] [+0ms] [1912ms] 【SIEM 任务上下文缓存】 --> task-xxxxx
# 获取事件故障信息缓存(用于故障持续时长计算)
[07-30 15:42:07] [+2ms] [1917ms] 【事件故障信息缓存】 从缓存中获取 field=`srul_xxxxx` 的全量缓存数据
[07-30 15:42:07] [+0ms] [1917ms] 【事件故障信息缓存】 --> check 包含 0 条缓存记录
[07-30 15:42:07] [+0ms] [1918ms] 【事件故障信息缓存】 --> nodata 包含 0 条缓存记录
[07-30 15:42:07] [+0ms] [1918ms] 【事件故障信息缓存】 ----> 共 0 条缓存记录
[07-30 15:42:07] [+0ms] [1918ms] 【事件故障信息缓存】 --> {"srul_xxxxx":{"check":{},"nodata":{}}}
[07-30 15:42:07] [+0ms] [1918ms] 【事件故障信息缓存】 --> 忽略非普通监控器事件(来源 security)
[07-30 15:42:07] [+0ms] [1918ms] 【事件分级故障信息缓存】 --> 忽略非普通监控器事件(来源 security)
[07-30 15:42:07] [+0ms] [1918ms] 【外部事件故障信息缓存】 --> 忽略非普通监控器事件(来源 security)
# 获取告警配置(用于发送告警)
[07-30 15:42:07] [+0ms] [1919ms] 【Studio】 告警信息缓存已禁用
[07-30 15:42:07] [+0ms] [1919ms] 【Studio】 调用 Studio Inner API -> GET http://inner.forethought-core:5000/api/v1/inner/alert_opt/get
[07-30 15:42:07] [+18ms] [1937ms] 【Studio】 >> Query:{"checkerUUID":"srul_xxxxx","workspaceUUID":"wksp_xxxxx"}
[07-30 15:42:07] [+33ms] [1971ms] 【Studio】 >> 响应:【200 OK】 <API 原始返回值,略>
[07-30 15:42:07] [+3ms] [1974ms] 【Studio】 告警配置(从 API 获取):srul_xxxxx => <完整告警策略配置,略>
# 依次处理事件
[07-30 15:42:07] [+2ms] [1976ms] 【事件告警器】 [事件 1/1] <high事件@security:{"host":"172.16.241.112"}:<事件标题>>
# 匹配静默规则
[07-30 15:42:07] [+0ms] [1976ms] 【事件告警器】 ---------------------- 静默处理 ----------------------
[07-30 15:42:07] [+0ms] [1976ms] 【事件告警器】 [静默规则 1/3] 在 【2024-10-10 00:00:00 以后】 ,按 Cron 表达式 0 0 * * 0,1,2,3,4,5,6 循环,每轮循环持续 86340 秒,对满足标签 {"df_monitor_checker_id":"rul_xxxxx","df_status":["ok"]} 的事件静默
[07-30 15:42:07] [+0ms] [1978ms] 【事件告警器】 --> 静默标签不匹配,跳过
[07-30 15:42:07] [+1ms] [1980ms] 【事件告警器】 [静默规则 2/3] 在 【2024-11-27 18:43:00 以后】 ,按 Cron 表达式 43 18 25,26,27,28,29 11,12 * 循环,每轮循环持续 32400 秒,对满足过滤条件 host:xxx* 的事件静默
[07-30 15:42:07] [+1ms] [1981ms] 【事件告警器】 --> 静默过滤条件不匹配,跳过
[07-30 15:42:07] [+0ms] [1981ms] 【事件告警器】 [静默规则 3/3] 在 【2025-02-20 17:57:00 以后】 ,按 Cron 表达式 57 17 * * * 循环,每轮循环持续 3600 秒,对满足标签 {"df_monitor_checker_id":"rul_xxxxx"} 的事件静默
[07-30 15:42:07] [+0ms] [1982ms] 【事件告警器】 --> 静默标签不匹配,跳过
[07-30 15:42:07] [+0ms] [1982ms] 【事件告警器】 未能匹配静默规则,不需要静默
# 依次判断静默规则
[07-30 15:42:07] [+0ms] [1982ms] 【事件告警器】 ---------------------- 告警策略 ----------------------
[07-30 15:42:07] [+0ms] [1982ms] 【事件告警器】 [告警策略 1/1] <告警策略名称> (high / ID: altpl_xxxxx)
[07-30 15:42:07] [+0ms] [1982ms] 【告警策略 REF 最后告警时间缓存】 从缓存中获取 field=`srul_xxxxx` 的全量缓存数据
[07-30 15:42:07] [+3ms] [1985ms] 【告警策略 REF 最后告警时间缓存】 --> 没有缓存数据
[07-30 15:42:07] [+0ms] [1985ms] 【事件告警器】 --> 首次告警(1)
[07-30 15:42:07] [+0ms] [1985ms] 【事件告警器】 ----> 当前不处于重复告警期内,需要发送告警
[07-30 15:42:07] [+0ms] [1985ms] 【事件告警器】 [告警规则(时间段) 1/1] 任意时间
[07-30 15:42:07] [+1ms] [1986ms] 【事件告警器】 成功匹配告警规则(时间段),继续处理通知对象
# 依次判断告警策略、规则(时间段)、通知对象
[07-30 15:42:07] [+0ms] [1986ms] 【事件告警器】 ~~~~~~~~~~ 处理告警通知对象 ~~~~~~~~~~
[07-30 15:42:07] [+0ms] [1986ms] 【事件告警器】 通知对象预过滤(status, isDisabled)
[07-30 15:42:07] [+0ms] [1987ms] 【事件告警器】 --> 过滤前数量:20,过滤后数量:0
[07-30 15:42:07] [+0ms] [1987ms] 【事件告警器】 通知对象预过滤(filterString,tags)
[07-30 15:42:07] [+0ms] [1987ms] 【事件告警器】 --> 过滤前数量:0,过滤后数量:0
[07-30 15:42:07] [+0ms] [1987ms] 【事件告警器】 没有匹配的告警通知对象
[07-30 15:42:07] [+0ms] [1987ms] 【事件告警器】 没有配置升级告警通知对象
# 渲染事件文案
[07-30 15:42:07] [+0ms] [1987ms] 【SIEM 检测事件】 渲染标题 / 内容 / 通知
# 渲染事件标题
[07-30 15:42:07] [+0ms] [1992ms] 【文本渲染器】 渲染模板:
<事件标题模板>
[07-30 15:42:07] [+2ms] [1994ms] 【文本渲染器】 --> 渲染成功。输出:
<事件标题,略>
# 渲染事件详情
[07-30 15:42:07] [+6ms] [2000ms] 【文本渲染器】 渲染模板:
<事件详情模板>
[07-30 15:42:07] [+2ms] [2003ms] 【文本渲染器】 --> 渲染成功。输出:
<事件详情,略>
# 更新告警策略 REF 最后告警时间缓存(用于后续重复告警间隔判断)
[07-30 15:42:07] [+0ms] [2003ms] 【告警策略 REF 最后告警时间缓存】 更新缓存:
# 更新事件故障信息缓存(用于后续判断故障时长等)
[07-30 15:42:07] [+0ms] [2004ms] 【事件故障信息缓存】 更新缓存:
[07-30 15:42:07] [+0ms] [2004ms] 【事件故障信息缓存】 --> srul_xxxxx: {}
# 写入 DataWay
[07-30 15:42:07] [+0ms] [2005ms] 【内部 DataWay】 写入事件
[07-30 15:42:07] [+0ms] [2005ms] 【内部 DataWay】 --> [事件 1/1] 0528add-rul(event-xxxxx)
[07-30 15:42:07] [+2ms] [2007ms] 【内部 DataWay】 行协议方式写入数据 -> POST /v1/write/keyevent,工作空间 Token:tkn_xxxxx
[07-30 15:42:07] [+0ms] [2007ms] 【内部 DataWay】 --> 第 1/1 条数据
[07-30 15:42:07] [+0ms] [2008ms] 【内部 DataWay】 ----> JSON 格式: <JSON 格式的事件数据,略>
[07-30 15:42:07] [+1ms] [2009ms] 【内部 DataWay】 ----> 行协议格式: <行协议格式的事件数据,略>
[07-30 15:42:07] [+0ms] [2009ms] 【内部 DataWay】 ----> 请求头:{"X-Pkg-Id":"gdff-xxxxx"} (包含 1 条数据)
[07-30 15:42:07] [+9ms] [2019ms] 【内部 DataWay】 --> 响应:【200 OK】 ""
# 本次检测产生事件数量
[07-30 15:42:07] [+0ms] [2019ms] 本次检测共产生 1 个 SIEM 事件
|