ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ThreatMapper 通知集成指南:把漏洞、恶意软件与密钥扫描结果实时推送到 Slack、JIRA、Splunk 等通知渠道

ThreatMapper 通知集成指南:把漏洞、恶意软件与密钥扫描结果实时推送到 Slack、JIRA、Splunk 等通知渠道
  • 网络安全
  • 应用安全
  • 云原生
  • 漏洞扫描

【免费下载链接】ThreatMapper

Open Source Cloud Native Application Protection Platform (CNAPP)

项目地址:https://gitcode.com/gh_mirrors/th/ThreatMapper
点击查看免费下载

ThreatMapper(Deepfence ThreatMapper)是一款开源云原生应用保护平台(CNAPP),其核心能力之一是把扫描结果"主动送出去":无论新漏洞是在 CI 流水线中发现,还是在自动化扫描中被检出,ThreatMapper 都会把详情投递给你在控制台(Management Console)中配置的通知服务。本文将以官方 Integrations 文档为主线,结合仓库源码,完整讲解各通知服务的配置步骤、订阅筛选机制与底层实现原理,帮助你按需搭建"扫描即通知"的实时安全告警链路。

集成机制总览:一次扫描,多渠道通知

ThreatMapper 的通知集成遵循"一次扫描事件,分发到多个已订阅渠道"的设计。官方文档明确指出:任何时刻检测到新的漏洞(例如在 CI 中扫描或执行自动化扫描时),ThreatMapper 都会将详情提交给所有已配置的通知服务。

可通知的扫描资源类型

从源码 ScanTypeDetectedNode 映射表可以看出,通知系统覆盖五类扫描结果:

扫描类型通知资源名(Resource)
漏洞扫描(NEO4JVulnerabilityScan)Vulnerability
密钥扫描(NEO4JSecretScan)Secret
恶意软件扫描(NEO4JMalwareScan)Malware
合规扫描(NEO4JComplianceScan)Compliance
云合规扫描(NEO4JCloudComplianceScan)CloudCompliance

在创建集成时,你需要为每一条集成选择一个"订阅的资源类型",只有与该类型匹配的扫描结果才会触发通知。notify.go 的分发逻辑会先取出数据库中的全部集成,再用ScanTypeDetectedNode判断当前扫描类型是否命中该集成的订阅资源。

统一抽象:Integration 接口与工厂

所有通知渠道在代码层都实现了同一个 Integration 接口:

  • SendNotification(ctx, message, extras):投递通知正文;
  • ValidateConfig(validator):校验配置合法性;
  • IsValidCredential(ctx):校验凭证(多数渠道会实际发送一条测试消息);
  • SendSummaryLink():是否支持发送"扫描摘要链接"(目前只有 Slack 与 Teams 返回 true)。

GetIntegration 工厂函数根据integration_type字符串创建对应实现,支持的类型常量定义在 constants.go:slack、http_endpoint、teams、splunk、s3、pagerduty、elasticsearch、googlechronicle、aws_security_hub、email、jira、sumologic。

在 Management Console 中配置通知服务:通用流程

打开 ThreatMapper 控制台的Integrations页面,即可新增、编辑与删除通知集成。无论选择哪种渠道,AddIntegration 处理流程都会依次执行以下校验:

  1. 必填项检查:integration_type与notification_type(订阅资源)均不可为空;
  2. 配置校验:调用ValidateConfig,如 Slack 要求webhook_url必须是合法 URL;
  3. 凭证校验:调用IsValidCredential,多数渠道会真实发送一条 "Test message from Deepfence" 测试消息,失败则返回ErrInvalidCredential;
  4. 重复检查:对筛选条件计算filter_hash(FNV-32a 哈希,见 GetFilterHash),相同配置与订阅资源的集成不可重复创建;
  5. 入库与审计:成功后写入 PostgreSQL 并记录审计日志。

每个集成还可以配置订阅筛选(Filters),用于限定通知范围,字段见 IntegrationFilters 结构:

  • node_ids:只通知指定节点(主机/容器/镜像)的扫描结果;
  • container_names:限定容器名;
  • cloud_provider:限定云厂商(用于云合规扫描);
  • fields_filters:字段级过滤条件。

另外,创建/更新集成时若勾选"发送摘要链接",handler 会校验渠道是否支持(仅 Slack 与 Teams 支持,其他渠道会返回ErrSendSummaryNotSupported),并把send_summary=true写入配置。

Slack:Webhook 实时告警(支持摘要卡片)

ThreatMapper 通过 Slack Webhook 向 Slack 工作区推送通知。配置步骤(详见 Slack 集成文档):

  1. 访问https://[YourWorkspace].slack.com/apps,搜索 Slack 官方Incoming Webhooks应用;
  2. 点击Add to Slack,选择要接收告警的频道;
  3. 复制生成的Webhook URL;
  4. 在 ThreatMapper 的 Slack 集成页面粘贴 Webhook URL,并填写对应的频道名,选择订阅资源后保存。

Slack 配置结构要求webhook_url(必填、必须是 URL)与channel(必填、非空),并可选send_summary。源码实现中有几个值得注意的行为:

  • 按 5 条一批(BatchSize = 5)分批发送,避免单条消息过长;
  • 消息体使用 Slack Block Kit,且会根据严重级别显示彩色方块:critical 为红色、high 为橙色、medium 为黄色、low 为蓝色(见 FormatMessage 中的严重级别映射);
  • 开启摘要模式后,会发送包含节点类型/名称、扫描开始/结束时间、严重级别计数以及"Click here to view scan results on Console"链接的摘要卡片(见 FormatSummaryMessage);
  • 创建集成时IsValidCredential会向 Webhook 发送一条测试消息,非 200 响应即判定凭证无效。

Microsoft Teams:Webhook 消息卡片

ThreatMapper 通过 Teams Webhook 向频道推送通知。配置步骤(详见 Microsoft Teams 集成文档):

  1. 打开目标频道,点击顶部导航栏的••• More options;
  2. 选择Connectors;
  3. 搜索Incoming Webhook并点击Add;
  4. 点击Configure,为 Webhook 命名(可上传图片);
  5. 复制对话框中的唯一 Webhook URL(该 URL 与频道绑定),点击Done;
  6. 在 ThreatMapper 的 Microsoft Teams 集成页面粘贴 Webhook URL 与频道名,保存即可。

Teams 实现(teams.go)与 Slack 类似:按 5 条一批发送 MessageCard,支持并发发送(最多 10 个 goroutine);开启摘要模式后改用 Adaptive Cards 渲染扫描摘要卡片(节点信息、严重级别计数、控制台链接)。

Email:按订阅周期投递邮件

ThreatMapper 支持把选定资源的扫描详情发送到指定邮箱。前置条件:必须先完成邮件服务器配置(Settings → Email Configuration),否则创建 Email 集成会被拒绝——Email.New 会显式检查邮件配置是否存在。

配置步骤(详见 Email 集成文档):

  1. 输入接收通知的邮箱地址;
  2. 选择要订阅的资源;
  3. 点击订阅按钮保存。

邮件实现细节(email.go):邮件标题为Deepfence {资源名} Subscription,正文包含severity_counts等附加字段,同时以scan-results.json附件携带完整扫描结果;发送依赖 sendemail 模块。

HTTP Endpoint:转发到任意自建 API

适合对接自研告警系统或 Webhook 网关。配置步骤(详见 HTTP Endpoint 集成文档):

  1. 填写接收通知的 HTTP 端点地址,例如http://10.3.16.2:8080;
  2. 如果目标 API 需要鉴权,可选填写Authentication HTTP Header值;
  3. 选择订阅资源并保存。

实现上(http-endpoint.go)会向该地址POSTJSON 数据,若配置了auth_header则自动附加Authorization请求头;IsValidCredential同样发送一条测试消息并校验返回是否为 200。

JIRA:自动创建工单(漏洞与密钥)

ThreatMapper 可以为漏洞(vulnerabilities)和密钥(secrets)扫描结果自动创建 JIRA 工单。最低支持 JIRA 7.13。认证方式二选一:用户账户密码或 API Token(详见 JIRA 集成文档)。

生成 API Token 的步骤:

  1. 点击设置图标,进入Atlassian account settings;
  2. 切换到Security标签页;
  3. 点击Create API Token,设置标签并创建;
  4. 在 ThreatMapper 的 JIRA 集成页面填写:
    • JIRA Site URL(站点地址);
    • Username(用户名);
    • API Token(或使用密码认证);
    • JIRA Project Key:即工单编号前缀,例如工单 "JRA-123" 对应的项目键为JRA;
    • Issue Type:希望创建的工单类型(Task / Bug 等);
    • 可选:Assignee(经办人)与 Custom Fields(自定义字段)。

源码实现(jira.go)使用go-jira客户端以 Basic Auth 连接 JIRA,工单标题格式为Deepfence {scan_type} Scan Issues for {node_type} - {node_name},正文包含扫描附加信息,并会把扫描结果以scan-results.json附件挂到工单上;配置了自定义字段时,附件仅包含你指定的字段。

PagerDuty:接入值班与事件响应

ThreatMapper 通过 PagerDuty API(v1 或 v2)触发事件。配置步骤(详见 PagerDuty 集成文档):

  1. 在 PagerDuty 控制台进入Configuration → Services,新建服务(Add New Service)或在现有服务的Integrations标签页点击New Integration;
  2. 选择相应的 API 版本创建新集成;
  3. 回到 ThreatMapper 控制台,粘贴新集成的Integration Key,订阅漏洞资源即可。

PagerDuty 实现会向https://events.pagerduty.com/v2/enqueue发送trigger事件,并把 ThreatMapper 的严重级别映射为 PagerDuty 级别:critical→critical、high→error、medium→warning、low→info。需要同时提供 PagerDuty API Key 与 Service Key(即集成 Key)。

Splunk:通过 HTTP Event Collector 接入 SIEM

ThreatMapper 使用 Splunk HTTP Event Collector(HEC)投递扫描结果。配置步骤(详见 Splunk 集成文档):

  1. 登录 Splunk 云平台,点击Add data;
  2. 选择HTTP Event Collector作为数据输入;
  3. 复制Endpoint URL与生成的Token,端点形如https://SPLUNK_CLOUD_URL:8088/services/collector/event;
  4. 在 ThreatMapper 的 Splunk 集成页面填写 Endpoint URL 与 Token,选择订阅资源;
  5. 之后即可在 Splunk 中直接搜索扫描结果。

splunk.go 的实现要点:每条事件会附带timestamp与@timestamp(微秒级时间戳);事件按约 10KB(MaxContentLength = 10000)分块缓冲发送,最多并发 10 个发送协程;请求头使用Authorization: Splunk <token>。

Sumo Logic:Hosted Collector 接收 JSON 日志

配置步骤(详见 Sumo Logic 集成文档):

  1. 在Manage data下进入Collection;
  2. 点击Add Collector,选择Hosted Collector;
  3. 填写信息并保存新 Collector;
  4. 为新 Collector 添加Source,类型选择HTTP Logs & Metrics;
  5. 填写 Source 详情并保存;
  6. 将显示的HTTP Endpoint URL粘贴到 ThreatMapper 的 Sumo Logic 集成页面。

sumologic.go 会把每条扫描结果序列化为 JSON 并按行(newline-delimited)POST 到该端点,HTTPEndpoint为空时创建集成会直接报错。

Elasticsearch:批量写入索引

把扫描结果写入 Elasticsearch 便于集中检索与告警联动。配置步骤(详见 Elasticsearch 集成文档):

  1. 填写 Elasticsearch 端点 URL,例如http://10.108.0.2:9200;
  2. 填写索引名称(Index Name);
  3. 填写 Doc Type:版本为 5.x 时填写对应 doc type,6.0 及以上填写_doc;
  4. 若实例启用了认证,设置认证请求头(Auth Header);
  5. 生成 Basic Auth Header:例如用户名为demo、密码为p@55w0rd,可执行echo -n 'demo:p@55w0rd' | base64生成;
  6. 将值填写为Basic dXNlcm5hbWU6cGFzc3dvcmQ=这类格式;未启用认证则留空;
  7. 选择要投递的资源并点击订阅保存。

elasticsearch.go 默认使用/_bulk批量接口(NDJSON 格式),批量失败后自动降级为逐条POST /{index}/_doc;IsValidCredential会对索引发送 HEAD 请求验证连通性。

S3:扫描结果归档(gzip 压缩 JSON)

把选定资源归档到 AWS S3 桶,文件格式为.json。配置步骤(详见 S3 集成文档):

  1. 填写 S3 桶名(桶需提前创建);
  2. 设置 S3 文件夹名(若不存在会在桶内创建);
  3. 填写 AWS 提供的 Access Key 与 Secret Access Key;
  4. 选择 Region;
  5. 选择订阅资源;
  6. 点击Add保存。

s3.go 的实现细节:结果先经 gzip 压缩,再以{S3FolderName}/{当前时间}.json为 Key 上传(Content-Encoding: gzip);除静态密钥外,代码还支持UseIAMRole与跨账号TargetAccountRoleARN(STS AssumeRole)两种凭证方式;凭证校验通过ListBuckets完成。注意 S3 集成不支持摘要链接(SendSummaryLink()返回 false)。

其他渠道:Google Chronicle 与 AWS Security Hub

除文档目录中单独成篇的渠道外,源码 integration.go 还注册了Google Chronicle(googlechronicle,配置 URL 与 Auth Key,见 googlechronicle.go)与AWS Security Hub(aws_security_hub)。这两类渠道在代码层与上述渠道走完全相同的Integration接口,可直接在控制台的 Integrations 页面配置使用。

ThreatRx:LLM 辅助的修复建议

ThreatRx 是 ThreatMapper 的 **LLM 辅助修复(remediation)**能力,面向云错误配置(CSPM 扫描)、漏洞、恶意软件和密钥的扫描结果,由 AI 直接给出修复步骤。目前支持两种 LLM 后端(详见 ThreatRx 集成文档)。

OpenAI

  1. 在 OpenAI 平台创建 API Key;
  2. 在 Integrations 页面选择ThreatRx,点击OpenAI新建集成,选择模型、填入 API Key 并保存;
  3. 进入云态势(cloud posture)或漏洞扫描结果页,点击结果侧边栏的ThreatRx按钮,即可获取修复步骤。

Amazon Bedrock

  1. 在 Amazon Bedrock 中启用任意文本/对话模型;
  2. 在 Integrations 页面选择ThreatRx,点击Amazon Bedrock新建集成,选择模型、填入 Access Key 与 Secret Key 并保存;若控制台通过实例 IAM 角色对 Bedrock 具备写权限,也可以选择自动添加模型;
  3. 同样在扫描结果侧边栏点击ThreatRx按钮获取修复建议。

对应的代码实现在 generative-ai-integration 模块,通过统一的GenerativeAiIntegration接口支持 OpenAI 与 Amazon Bedrock 两种后端,密钥在入库前会经 AES 加密(见 bedrock.go 中的 EncryptSecret)。

Reports:导出 XLSX / PDF 扫描报表

除实时通知外,ThreatMapper 还支持按需生成并下载扫描报表(详见 Reports 集成文档):

  1. 选择要导出的资源,指定节点类型(host / container / image),可选设置节点过滤器;
  2. 报表生成完成后,点击下载链接即可获取。

报表由 worker 侧的任务生成,XLSX 与 PDF 的实现分别在 xlsx.go、pdf.go 以及按扫描类型细分的pdf_vulnerability.go、pdf_secret.go、pdf_malware.go、pdf_compliance.go、pdf_cloud_compliance.go中。

配置参数速查表

集成类型关键配置项凭证校验方式摘要链接支持
Slackwebhook_url、channel、send_summary发送测试消息✅
Microsoft Teamswebhook_url、channel、send_summary发送测试消息✅
Email邮箱地址(需先配置邮件服务器)基础校验❌
HTTP Endpointurl、可选auth_header发送测试消息并检查 200❌
JIRAjira_site_url、username、api_token/password、project_key、issue_type、可选assignee/custom_fields调用用户信息 API❌
PagerDutyapi_key、service_key(集成 Key)基础校验❌
Splunkendpoint_url(HEC 端点)、token基础校验❌
Sumo Logichttp_endpoint基础校验❌
Elasticsearchendpoint_url、index、doc_type、可选auth_headerHEAD 检查索引❌
S3s3_bucket_name、s3_folder_name、aws_access_key、aws_secret_key、aws_region(或 IAM Role)ListBuckets❌
ThreatRx (OpenAI)模型、api_key密钥校验—
ThreatRx (Bedrock)模型、aws_access_key、aws_secret_key(或 IAM Role)会话校验—

源码级补充:通知分发的完整调用链

一条通知从扫描完成到送达渠道,主要经历以下环节(可结合 notify.go 阅读):

  1. 扫描完成后,扫描上报处理器调用NotifyT;
  2. 从 PostgreSQL 读取全部(或指定 ID 的)集成,并用ScanTypeDetectedNode过滤出与本次扫描类型匹配的集成;
  3. 调用injectNodeData把节点信息注入每条结果:node_id、scan_id、node_name、node_type,以及容器名/镜像名/主机名/集群名(如有);
  4. 对消息类渠道(Slack、Teams、PagerDuty、Email、JIRA),时间戳会格式化为可读文本;
  5. 通过GetIntegration工厂获取实现,执行SendNotification完成投递,错误记录在日志与集成的last_error_msg字段中。

失败处理:多数渠道在发送失败时会记录last_error_msg(在 Integrations 列表中可见);Slack、Teams、Splunk 等渠道按批次/并发发送,单批失败不影响其他批次。Slack 会显式检查响应状态码并返回包含批次号与状态码的错误信息(见 slack.go SendNotification)。

敏感信息保护:集成配置中的webhook_url、api_key、aws_secret_key、auth_header、api_token等字段属于 SensitiveFields,在列表接口返回时会执行后半段脱敏(如xxxx****),避免凭证泄露。

小结

ThreatMapper 的通知集成体系覆盖了从即时消息(Slack、Teams)、事件响应(PagerDuty)、工单系统(JIRA)、SIEM/日志平台(Splunk、Sumo Logic、Elasticsearch、Google Chronicle、AWS Security Hub)、对象存储归档(S3)到 AI 辅助修复(ThreatRx)的完整链路,全部通过控制台 Integrations 页面以"配置 + 订阅筛选"的方式统一管理。配合各渠道的凭证校验、摘要卡片、敏感字段脱敏与分批并发投递等实现细节,你可以快速把 ThreatMapper 的扫描结果接入现有安全运营体系。各渠道更详细的图文配置步骤可继续阅读 integrations 目录下的逐篇文档,或直接查阅 集成源码实现 了解底层逻辑。

  • 网络安全
  • 应用安全
  • 云原生
  • 漏洞扫描

【免费下载链接】ThreatMapper

Open Source Cloud Native Application Protection Platform (CNAPP)

项目地址:https://gitcode.com/gh_mirrors/th/ThreatMapper
点击查看免费下载

相关推荐

上一篇:SmartTube终极指南:在Android电视上享受无广告纯净观影体验的完整解决方案
下一篇:OpenVINO动态批处理终极指南:如何显著提升AI推理吞吐量

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进