Nsdd

A personal wiki, chronicling hacking, data, and AI learning.

把安全告警交给 AI 之前:Defensive AI Agent 的工程化实践

TC / 2026-08-07


这个项目的起点很朴素:SOC 从来不缺告警,缺的是把告警变成判断所需的时间、上下文和一致性。

WAF 看到请求特征,RASP 看到运行时调用栈,HIPS 看到主机行为,NDR 看到网络连接,SIEM 再把其中一部分拼成事件。数据并不少,但字段、时间线、证据强度和处置口径各不相同。高峰期里,分析师最耗精力的工作往往不是发现一个从未见过的攻击,而是重复完成以下步骤:理解厂商日志、补齐证据、寻找相似事件、写研判意见、列处置项,再确认哪些动作需要审批。

Defensive AI Agent 想解决的正是这一段工作。它不是替代安全设备,也不是给日志系统加一个聊天窗口;它更接近一个位于检测产品与响应流程之间的“研判网关”:统一接入证据,让模型承担归纳、关联和假设生成,再用确定性代码、人工复核与审批系统约束模型能把事情推进到哪里。

AI 正从回答问题走向参与流程

过去两年,安全领域使用大模型的方式已经有了一次明显迁移。最早的需求大多是解释一条日志、生成一段查询语句或总结一份报告;现在更有价值的方向,是让模型在受控工具和明确状态机中持续工作:读取 Case、提出调查计划、补查证据、修正假设,最后生成可执行但尚未执行的响应方案。

这个变化也带来新的工程要求。模型一旦从“回答者”变成“流程参与者”,问题就不再只是答案是否准确,还包括它看到了什么、调用了什么、是否越权、失败后告警去了哪里,以及一条错误经验会不会污染后续判断。

NIST Cyber AI Profile 的初步草案把 AI 与网络安全的交叉点概括为三个方向:保护 AI 系统、用 AI 增强防御、应对 AI 增强的攻击。Defensive AI Agent 主要落在第二个方向,但要真正用于安全运营,前两个方向的控制也必须同时进入设计。换句话说,不能一边让 AI 帮忙防御,一边把它本身做成新的高权限入口。

OWASP 对 Agentic AI 的讨论则更直接:工具误用、身份与权限滥用、目标劫持、记忆与上下文污染,都是 Agent 获得行动能力以后才会被放大的风险。Excessive Agency把根因归纳为功能过多、权限过大和自主性过强。我们的设计几乎是反着这三点展开的:工具做窄、权限只读、高影响动作交给独立审批。

真正难的不是接一个模型 API

第一版原型很容易做:收到 JSON,拼出 Prompt,请求模型,再把结果显示在页面上。真正进入联调后,难点很快从模型调用转向了系统工程。

现场问题 如果只做“日志问答” 项目中的处理方式
五类产品字段与语义不同 Prompt 为每个厂商不断加例外 Mapping Profile 转换成稳定数据契约
模型慢、限流或暂时不可达 请求超时,告警状态不明 持久 Inbox、退避重试、deferred 与 DLQ
原始日志包含凭证、Cookie、个人信息 整段日志直接进入模型上下文 原文留在本地,模型只接收脱敏语义投影
同类告警反复到达 每条告警生成一套重复结论 按实体、规则与时间窗聚合 Case
模型结论听起来合理但证据不足 依赖分析师阅读后自行发现 Validator 独立检查证据、输出与权限
误报经验需要复用 把历史结论直接塞进 Prompt 分层记忆、人工晋升、范围与过期治理
建议动作可能影响生产 模型直接调用封禁或隔离接口 调查、审批、执行三层分离

项目由此形成了四条一直没有妥协的原则:事实与模型意见分开保存;概率分析与确定性门禁分开实现;调查与执行分开授权;模型故障时可以延迟处理,但不能悄悄换一种分析口径。

当前架构

Defensive AI Agent 从安全遥测接入到受治理响应的完整架构图
图 1:当前单机部署与处理链路。移动端使用纵向版本,避免将横向大图压缩到无法阅读。

线上环境目前是一套单机形态:Caddy 提供 HTTPS 边界,Gateway 与 Vector 运行在 Docker 中,Vector 接收安全产品的 Syslog,Gateway 负责 HTTP API、研判编排和工作台,SQLite 保存事实、状态和审计记录。模型通过企业 LLM Gateway 调用,不直接暴露在公网入口。

这套形态适合联调、演示和小规模 PoC。它完整展示了控制链路,但还不是高可用的生产集群,这个边界会在后文单独说明。

1. 接入先解决“能不能可靠留下来”

系统同时支持 HTTP JSON 和 Syslog。WAF、HIPS、NDR、RASP、SIEM 分别使用独立的产品路由;单机部署中,Vector 监听 1514015144,正式接入优先使用 TCP。对调用栈较长的 RASP 日志,帧上限被提高到 2 MiB,避免沿用 Collector 较小的默认缓冲造成静默截断。

厂商原始日志不会被要求提前改成系统内部格式。Mapping Profile 负责字段路径、类型转换和产品语义映射,也支持从脱敏样本推断候选映射并执行 dry-run。内置的内容指纹还能识别常见产品格式;无法确认来源、又不符合标准告警契约的数据会被拒绝,而不是含糊地送进模型。

映射完成后,告警先写入 durable_alert_inbox,提交成功才返回 202。远端模型暂时不可达时,记录进入 deferred,等待恢复后释放;鉴权失败、错误端点或响应契约错误属于需要人工修复的配置问题,会进入 DLQ。队列达到条数、字节或磁盘保留水位时,入口返回 429,把压力传回 Vector 的磁盘缓冲。

这里有一个看似细小、实际很重要的约束:alert_id 是不可变告警实例的幂等键。相同 ID、相同内容可以安全重投;相同 ID 携带不同时间、字段或证据时返回 409 alert_id_conflict。系统宁愿让上游显式处理身份冲突,也不覆盖已经进入审计链的事实。

2. 模型看到的是证据投影,不是原始数据仓库

每条告警在本地保存两种主要形态:RawAlert 保留原始事实,NormalizedEvent 保存供分析使用的实体、证据引用、敏感标签和规范化语义。RASP 场景还会记录原始日志字节数、Syslog 消息字节数、两层 SHA-256、items[] 数量、hook_datastacktrace 状态。

这套设计最有用的地方,不只是“做了脱敏”,而是把字段状态也保留下来:

如果只把值替换成星号,模型很容易把“已脱敏”误判成“没有证据”。显式状态让它能够区分 GET 请求本来没有 Body、上游采集缺失,以及网关为了数据最小化没有展示明文。

3. 五个产品 Agent 共用框架,但不共用判断模板

网关根据产品选择 WAF、HIPS、NDR、RASP 或 SIEM Agent。它们遵守同一份结构化输出契约,但关注点不同:

模型输出包括分类、置信度、证据、缺失证据、研判说明和分阶段响应建议。Case 层再按资产、规则和时间窗做聚合,避免同一活动的七条告警生成七套审批。跨产品关联目前使用受限时间窗与实体匹配,目的是提供调查线索,不会把“时间接近”自动升级成同一攻击链。

4. Validator 不相信模型,包括“自我检查后的模型”

Agent 返回结果后,会进入独立的确定性 Validator。它不调用 LLM,而是逐项检查:

最终状态只有 passedreviewblocked。其中 passed 的含义是“这次分析输出通过了证据与权限门禁”,不是“告警已被证明为攻击”,更不是“模型判断一定正确”。这一区分在工作台上必须清楚,否则绿色状态很容易被误读成安全结论。

对于提示注入,系统保留原始 Validator 结果。只有当唯一问题是外部日志中的注入文本、其他确定性检查全部通过时,分析师才能写明复核依据并把它继续送往审批;记忆自动写入仍被抑制。这样既不会因为日志里出现一句“忽略之前指令”就丢掉整条安全事件,也不会让它直接污染后续流程。

5. 记忆不是更长的 Prompt,而是一类治理对象

系统把记忆分为 Case 短期记忆、产品长期记忆、资产画像、组织知识和只读证据引用。新的误报经验不会因为模型说“以后忽略”就立即生效。它需要具备可追溯来源、明确范围、人工批准、过期时间和敏感信息检查,并把晋升、拒绝、隔离、恢复等动作写入独立事件流。

记忆匹配同时考虑结构化字段、语义相似度和检索键。更关键的是,它有否决条件:当前事件如果命中危险运行时调用链,历史误报记忆不能自动把恶意信号压低。线上配置目前仍关闭自动应用和自动注入模型,只保留候选评估与治理界面。这是一种有意的保守状态,因为在没有稳定 Golden Set 之前,“记得更多”不一定比“犯错更慢”更重要。

6. Response Agent 只负责调查,不拥有生产执行权

Response Agent 把一次性建议扩展为可暂停、恢复和审计的调查会话。模型可以在固定白名单中选择下一项只读工具,控制器负责锁定 Case 范围、规范化参数、限制轮次和工具预算,并持久化步骤、观察、结果哈希和证据引用。

它能读取 Case 快照、证据清单、原始告警分块、时间线、受治理记忆和响应状态,也会检查 Web 请求、运行时、端点进程、文件完整性、网络边界、身份认证、持久化、云与容器等取证覆盖。对于入选的原始证据,控制器要求从字节偏移 0 连续读取到末尾,并复算完整哈希;跳读、断档、来源变化或摘要不一致都不能通过报告门禁。

模型不能提交 SQL、表名、数据库路径、Shell、任意 URL 或设备凭据。它可以生成带成功条件和回滚条件的候选方案,但破坏性动作会统一升级为 approve_required。调查完成并不等于执行开始。

代码中已经实现了 Response Automation、Playbook、执行核验和回滚状态机,当前线上策略仍为关闭,且没有配置生产 Connector。也就是说,系统现在能展示一条完整的治理路径,但不会因为有人在页面上批准了建议就真的去封禁地址或隔离主机。这不是功能缺失的包装,而是当前试点阶段的安全边界。

一个 RASP Case 如何被处理

当前数据中有一条内存马相关的 RASP Case,很适合说明这套边界为什么必要。

请求是一次指向测试应用内存马接口的 GET。RASP 规则 cloudrasp_memShell_105 命中,调用栈经过 Spring MVC 的 MappingRegistry.registerregisterMapping,再进入测试代码中的 HandlerMethodShell.addShell。从运行时可达性看,这比 WAF 仅匹配 URL 强得多:它证明注册逻辑确实走到了受监控的调用链。

但证据同时存在几个限制:RASP 动作为 log,不是阻断;hook_data 为空;没有主机侧类加载、驻留或后续执行证据;路径与类名又明显带有靶场特征,而系统没有拿到本次测试的授权记录。

Agent 最终给出 suspicious、置信度 0.5,结论是“需人工复核”。建议先核对授权、Tomcat 与业务日志、JVM 中的动态映射,再决定是否临时白名单或隔离来源。观察和取证项保持只读;涉及白名单、封禁和清除内存马的建议被标记为 approve_required。Validator 的所有确定性检查通过。

这个结果并不戏剧化,却比“检测到内存马攻击成功”更有价值。系统确认了危险调用链已经触达,同时诚实保留了从“规则命中”到“主机失陷”之间缺少的证据。安全分析最怕的不是答案不够响亮,而是把不确定性藏起来。

2026 年 8 月 7 日运行快照

以下数字来自写作时的线上健康接口与 Case 数据库,只用于说明当前联调状态,不应当被解释为检出率或独立攻击次数。

指标 当前值 应如何理解
已处理告警 / Case 30 / 30 当前数据集每条告警形成一个 Case
产品分布 RASP 8、NDR 6、SIEM 6、WAF 5、HIPS 5 五条产品链路均有运行数据
严重级别 Critical 12、High 14、Medium 2、Low 2 26 个 Case 为高或严重级别
分类 Malicious 6、Suspicious 18、证据不足 4、Benign 2 分类仍需结合业务与授权复核
Validator 30 passed 输出与治理门禁通过,不代表 30 次攻击成立
持久队列 0 积压、0 deferred、0 DLQ 写作时处理链路无待恢复任务
记忆 20 条:11 active、5 待批准、4 expired 自动应用与模型注入仍关闭
响应自动化 disabled,0 Connector 当前不会执行生产处置

运行环境为 Ubuntu 24.04,Gateway 数据库 Schema 为 v22。Caddy、Gateway、Vector、持久队列和 Response Agent Worker 均通过健康检查,模型调用经配置的企业 Gateway 完成,当前熔断器处于关闭状态。这里的“健康”描述的是组件和队列状态,不代表未来容量与高可用要求已经完成。

我认为最值得保留的几个设计

回看整个研发过程,真正有复用价值的并不是某个 Prompt,而是以下几个工程选择。

第一,证据连续性优先于上下文长度。 完整原文、规范化证据、模型运行、验证、审批和审计分别保存并通过 ID 关联。模型上下文可以截断,事实身份不能含糊。

第二,让失败显式进入状态机。 模型不可达、永久配置错误、队列容量不足和人工待复核是不同问题,应该分别进入 deferred、DLQ、回压和 review,而不是统一显示“处理失败”。

第三,把概率能力包在确定性控制面里。 模型负责它擅长的语义归纳、关联假设与报告表达;证据一致性、敏感输出、权限、审批和执行边界由代码决定。

第四,记忆必须可撤销。 经验有来源、范围、信任级别、批准人和过期时间,高危证据还能否决错误记忆。这比简单向量检索慢一些,但更接近安全运营对白名单和例外规则的真实要求。

第五,调查 Agent 不等于自主处置 Agent。 只读工具同样可以完成很深的调查。先把 Case 范围、原始证据和报告质量做好,再讨论开放执行权限,比从一开始给模型接上 SOAR 更稳妥。

这些取舍也与 NIST AI RMF 的生成式 AI Profile强调的测量、治理和全生命周期风险管理相吻合;响应流程本身则参考了 NIST SP 800-61 Rev. 3将事件响应融入 CSF 2.0 风险管理活动的思路。标准没有替我们设计产品,但提供了一个很实用的校验问题:系统是否只展示了模型能力,还是也能说明它如何被管理。

还没有完成的生产化工作

当前系统适合受控试点,不应该因为功能链路完整就跳过基础设施建设。

数据面仍是单 Gateway、单 Vector 和 SQLite。生产化需要把 Case 与治理状态迁移到 PostgreSQL,把告警流交给 Kafka、Redpanda 或 RabbitMQ,把大体积原始证据放入对象存储,并将接入层和分析 Worker 拆开扩容。

Collector 还需要双实例、来源网络白名单、mTLS Relay、发送端确认与故障演练。RASP 已以 TCP 为正式链路,迁移兼容的 UDP 入口最终应当移除。身份侧则需要接入企业 SSO/IAM、Secret 管理、证书生命周期和职责分离审计,而不是长期依赖独立 Token。

模型质量也不能只用“真实 Case 跑通”来证明。下一阶段需要基于脱敏现场样本建立私有 Golden Set,覆盖真实攻击、误报、证据不足、提示注入和跨产品关联,再持续测量准确性、证据引用质量、LLM P95、最老等待时间、失败类型、模型与规则版本漂移。

最后才是执行闭环:把批准结果对接工单和 SOAR,保留双人审批、最小权限、TTL、成功条件、执行回写和回滚。只有当这些控制能被演练和审计时,自动响应才是能力;在那之前,它只是额外风险。

结语

做完这一阶段,我对 Defensive AI Agent 的定位反而更克制了。AI 的价值不是替分析师按下最终按钮,而是把分散证据整理成一个可复核的 Case,把隐含的不确定性写出来,把重复调查变成有状态、可恢复的工作流,并让每个建议都带着来源和边界到达审批人面前。

当系统能够回答“为什么这样判断、还缺什么、谁批准、失败后在哪里、能否回滚”时,模型才真正进入了安全运营。否则,无论回答多流畅,它仍然只是另一个需要被研判的信号源。

参考资料