[控场AI]
· 8 分钟阅读· 4,493 字

用FalkorDB构建安全智能体BlastShield:图证据与受限工具实践

用FalkorDB构建安全智能体BlastShield:图证据与受限工具实践

BlastShield用图数据库承载访问路径,让Gemini在受限工具下选择响应动作,每次操作后重新查询验证。

BlastShield 是 Graph Hacks 2026 的黑客松原型,旨在解决安全告警响应中 AI 智能体决策可追溯、可验证的问题。它用 FalkorDB 存储身份、会话、工作负载、角色和数据资产的访问关系,完整路径证据由 Cypher 查询返回而非模型生成。多跳推理演示表明遍历深度差一跳就可能让不可达变可达,深度被校验为 1 到 6 并映射到固定查询模板。Gemini 通过 MCP 接入,只能从服务端派生的响应候选中选择,拿不到变更工具也不写 Cypher。独立动作服务持有唯一写入能力,每次模拟响应动作后控制器必须重新查询 FalkorDB 验证剩余路径,达到动作上限但路径仍在是停止而非完成。简报检查器会标记模型文字中与图证据不符的实体 ID、分数和遏制声明。

构建一个能对安全告警做出响应的AI智能体,难点不在模型本身,而在于如何让它的决策可追溯、可验证、可信任。BlastShield是Graph Hacks 2026黑客松Track 01的参赛原型,它用图数据库FalkorDB承载访问关系,用受限工具约束Gemini的行为,并通过每次操作后的重新查询来验证效果。

问题:一条告警背后的多跳路径

一个针对developer_07的活动会话告警,风险评分35分(满分100),标记为中危。这个分数本身说明不了太多问题。真正危险的上下文隔了好几层关系:developer_07持有会话→会话可访问构建节点→构建节点以部署角色运行→部署角色可扮演生产角色→生产角色可读取客户数据库。

没有任何单一记录能讲清完整故事,只有把关系链一起遍历,攻击路径才浮现出来。BlastShield要回答的核心问题就是:从告警到关键资产,存在哪条建模路径?如果封掉一条,还剩什么?

需要明确边界:BlastShield的所有数据都是合成的,不连接真实云账户、身份提供商或生产遥测。路径代表模型中的可达性,不等于真实环境已被利用;反过来,图中没有合格路径也不能证明真实环境安全。

架构:图查询就是证据本身

技术栈包括React+Vite前端、FastAPI后端、FalkorDB图数据库,以及通过MCP工具接入的Gemini。项目内置四个典型场景:身份访问路径(BH-1042,中危35分)、过度IAM权限(BH-IAM-2001,高危65分)、暴露工作负载(BH-WORKLOAD-3001,高危75分)、遏制场景(BH-CONTAINMENT-4001,高危60分)。这些分数来自演示规则集demo-rules-v1,是透明的原型值,不是校准过的入侵概率。

图模型包含五类实体:Identity、Session、Workload、IAMRole、DataAsset。边的方向性很关键,HAS_SESSION、CAN_ACCESS、RUNS_AS、CAN_ASSUME、CAN_READ串起一条从身份到数据的链条。边上还携带路由标识、遏制与响应状态、权限评估、敏感度等属性,这些属性让查询能够区分“活跃路径”和“已被阻断的路径”。

BlastShield身份访问路径图,展示身份、会话、工作负载、角色与客户数据库的连接关系

Cypher查询返回的不只是true或false,而是完整的路径、节点、有向边和边属性。这才是仪表盘能绘制的证据,也是智能体能推理的素材。FalkorDB之所以是产品的核心而非装饰,正是因为:路径证据来自图查询,响应候选从返回的关系中派生,操作后的验证又依赖一次新的图查询。

FalkorDB 是一款基于 Redis 模块构建的图数据库,采用稀疏矩阵(GraphBLAS)作为底层存储引擎,支持属性图模型与 OpenCypher 查询语言。与传统图数据库相比,它在多跳遍历和路径查询上具有较低延迟,且能以单实例轻量部署,适合黑客松原型这类需要快速启动的场景。其边属性(如路由标识、遏制状态)可直接在 Cypher 的 WHERE 子句中过滤,这正是 BlastShield 区分活跃路径与已阻断路径的基础。

多跳推理:多一跳,答案就变了

浅层查询会漏掉角色扮演背后的暴露面。项目加了一个补充审计夹具来演示这一点:auditor_02到analytics-cache,深度限制为1时找不到合格路径,深度为4时路径出现;到staging-report,深度4无路径,深度5才有。那条五跳路径依赖链路中间的CAN_ASSUME关系——深度限制卡在四,报告看起来不可达;放宽到五,路径才被发现。

BlastShield采用有界有向遍历,并用允许列表限定可跟随的关系类型。被阻断的会话路由和关系会被排除。调用方传入的深度会被校验为1到6之间的整数,对应六套预建查询模板;调用方文本不会被拼接进Cypher。开发中使用的FalkorDB版本在变长路径边界内参数化上表现不一致,固定六套模板既规避了动态拼接查询文本的风险,又保留了受控的深度调节能力。

模型选工具,但不写查询

把schema交给模型让它生成Cypher很有诱惑力,但自由度过大,结果难以解释和审计。BlastShield的做法是暴露一组经过审查的固定工具:investigate_alert(alert_id)返回标准图调查结果,get_blast_radius(alert_id)返回从路径派生的工作负载、角色和资产实体,find_shortest_access_path(source_id, target_id, max_hops)执行有界遍历,get_containment_route_statuses(alert_id)返回遏制场景的路由状态。

查询模板由人编写,工具输入在执行前校验,工具轨迹记录工具名、输入、结果、耗时和结果数量。同样重要的是区分“未知实体”和“不连通实体”:不存在的实体应产生unknown-source或unknown-target结果,两个已知实体之间没有合格连接应产生no-path结果,无效输入和查询失败又是另外的状态。这些都不应悄悄变成“环境安全”的结论。

MCP(Model Context Protocol)是 Anthropic 提出的开放协议,用于在 LLM 与外部工具/数据源之间建立标准化的调用接口。在本项目中,Gemini 通过 MCP 客户端暴露的固定工具列表进行推理,每个工具都对应一个预置的 Cypher 模板和参数校验逻辑。MCP 的“工具声明”机制使得模型只能看到工具名称与参数 schema,而无法直接访问数据库或拼接查询文本,从而在架构层面实现了“模型选工具但不写查询”的约束。

让智能体行动,但不给它钥匙

调查是只读的,响应才可能制造风险。BlastShield把“提议动作”和“执行动作”拆开,设置了三层边界:决策服务只提供只读工具来获取响应候选和选择候选;FastAPI控制器要求显式确认并限制单次运行的动作数量;独立的动作服务持有唯一的变更能力,只对合成图执行一次允许列表内的写入。

候选列表从当前图证据派生,而非Gemini凭空生成。当Gemini提议某个动作时,服务端会重新派生当前候选,拒绝已不存在的选择;动作服务在执行写入前再校验一次。Gemini拿不到变更工具,也不写Cypher。合成遏制操作可以把一条建模中的活跃会话路由标记为阻断,但这只改变演示用的图状态,不会禁用真实会话,也不会修改云资源。

这种设计刻意给模型套上短绳:它可以在受支持的选项中选择,但由服务端代码决定选择是否有效、哪个写入可以执行。

“允许列表内写入”是指动作服务仅接受预先枚举的合成遏制操作(例如将某条会话路由标记为 blocked),并且只对演示用的图状态执行。任何不在列表中的写操作、对真实云 API 的调用,或超出单次运行动作上限的请求都会被拒绝。这种白名单机制把模型的选择空间限制在已知安全的操作集合内,是“不给钥匙”原则的具体落地。

每次动作之后,重新问图

发出命令和验证效果是两回事。智能体不应因为请求了变更就宣布成功。在BH-CONTAINMENT-4001中,种子模型有两条独立路径。只阻断主路径不该结束运行——备用路径仍然合格。因此控制器在每次动作后查询图,基于新结果决定是否继续:调查→找到合格路径→选择受支持动作→应用合成变更→再次查询FalkorDB→验证剩余路径→继续或停止。

预期的种子序列是:阻断主路径,重新查询发现备用路径,阻断备用路径,再查询确认没有合格路径残留。只有当控制器到达“无合格路径”结果且所有动作均已验证时,运行才算完成。达到动作上限但仍有路径存在,是“停止的运行”,不是“完成的运行”。未知、无效或失败的结果都不算成功遏制。

一个回归测试暴露了响应循环中的微妙故障:如果动作结果不包含动作后调查,控制器可能复用上一份快照,下一次决策就会基于过时证据。修复方式是:动作响应缺失after对象时,控制器必须从FalkorDB获取标准调查;测试夹具也做了修正,确保序列化路径列表与实际路径数据一致,回归测试加强为检查第二次决策收到的是备用路径而非再次收到主路径。教训很简单:响应型智能体必须基于最新证据推理,而不是它碰巧看到的上一份证据。

别相信模型的自述文字

Gemini能生成有用的简报,但流畅的文字不是证据。简报检查器会把提议摘要与标准调查对比,标记图中未返回的实体ID、与计算值不符的风险分数、证据中不存在的关系类型,以及在有合格路径残留时却声称已遏制的无依据说法。如果验证失败或Gemini不可用,界面使用从标准证据组装的决定性摘要,并明确标注为回退状态。

工具级单元测试覆盖了动作间重新查询、终态无路径处理、未知或无效结果、动作上限和验证失败等行为。最新后端测试运行报告32个通过、6个跳过。跳过的6个是需显式启用的真实FalkorDB测试——跳过的测试不等于验证通过。真实图行为、全场景下的Gemini/MCP接地以及最终浏览器流程仍需独立的端到端检查。

没有做的事,同样重要

项目对自身边界很坦诚:没有集成原生图算法,最短路径工具用的是有界Cypher遍历,而非algo.SPpaths;没有持久化图记忆,遏制审计历史存于进程内存,API重启即清空;仅使用合成数据,不连接任何云账户、身份提供商或生产遥测;风险分数是演示值,不是校准的入侵概率;Gemini是AI辅助响应决策的必要组件,未配置密钥时结构化图调查仍可使用,但自主响应运行必须安全停止,而不是编造动作。

五个可迁移的经验

先建模问题,再建模数据——问清“什么能到达关键数据,封掉一条路径后还剩什么”,决定了节点和关系的设计。让模型选择,不让它拼查询——固定、经过审查的参数化工具比生成式Cypher更容易验证和解释。决策与执行分离——模型从服务端派生的候选中选择,独立组件持有唯一的写入能力。用同一事实源验证——变更后重新查询FalkorDB,让新结果决定路径是否仍在。保持空状态诚实——未知实体、无路径、无效输入和查询错误是不同结果,就应保持不同。

BlastShield提供了一条让AI智能体安全决策更易审查的实用路径:把关系放进图里,只暴露经过审查的工具,从当前证据派生动作,每次模拟变更后重新查询图。衡量一个智能体的标准,不是它多会描述自己的工作,而是它使用了什么证据、执行了什么验证。项目代码已在GitHub开源,可按README在本地启动FalkorDB、安装依赖、播种场景并运行前后端。

分享:

相关推荐