跳转到主要内容
Webhook 在事件发生时将其推送到你的端点,因此你无需轮询 GET /v1/findings。注册一个 URL,选择想要接收的事件类型,并验证每次投递的签名。

注册 Webhook

Webhook 在仪表盘的管理 → Webhooks(需要管理员角色)中管理:
  1. 点击添加 Webhook,输入你的端点 URL(建议使用 https://;本地部署的内网地址也可以)。
  2. 选择要接收的事件类型。
  3. 复制注册后显示的签名密钥(whsec_...)——与 API 密钥一样,它只显示一次。
同一页面还显示每个 Webhook 的投递日志:每条投递一行,包含尝试次数、当前状态(delivered、retrying、failed、pending)、最近一次尝试的 HTTP 状态码和错误详情,以及创建/下次重试/完成时间。

事件类型

检测规则的匹配以 detection_rule.matched 投递,而不是 finding.created—— 要覆盖 GET /v1/findings 中出现的全部内容,请同时订阅这两种事件类型。 事件同样受权限范围约束:Webhook 只接收其注册用户可见主机的事件。

负载

每次投递是一个 JSON 请求体的 POST:
  • finding.reviewed 在 data 中另有 status(accepted/denied)、reviewed_by 和 notes。
  • detection_rule.matched 在 data 中另有 rule({id, name, label})。
  • data.finding_id 始终存在;之后如需完整对象,可配合 GET /v1/findings/{id} 使用。

验证签名

每次投递携带以下请求头: 用你的签名密钥对时间戳、一个字面量 . 和原始请求体重新计算 HMAC,然后做恒定时间比较:
请拒绝签名不匹配的投递,并考虑拒绝时间戳早于几分钟前的请求以防重放。

投递与重试

  • 在 15 秒内返回任意 2xx 即确认收到投递。重定向不会被跟随,会计为失败。
  • 投递失败后按递增间隔重试——1 分钟、5 分钟、30 分钟、然后 2 小时——共 5 次尝试后标记为 failed。每条投递的尝试次数和最新结果都记录在投递日志中。
  • 投递语义为至少一次(at-least-once):极少数情况下可能重复,如果你的处理器不是幂等的,请按 X-Hilt-Event-Id 去重。
  • 新注册的 Webhook 从注册时刻开始接收事件——不会重放历史检测发现。
最后修改于 2026年10月8日