跳转到内容

安全模型

bssh AI 的出发点是一个假设:智能体可能被它读到的任何内容操纵。 一行日志、一个文件、一段登录横幅或一个网页都可能夹带指令,而没有哪个模型能可靠地无视它们。bssh 不试图让模型变得听话,而是限制任何智能体(无论是否被操纵)在你的服务器上能做的事,并记录一切。

  • 智能体不持有任何凭据。 密钥、密码和证书都留在 bssh 中。智能体只发送工具调用并接收结果。
  • 判定是确定性的。 由 shell 解析器和你的策略决定允许、询问或拒绝,不咨询任何模型:措辞再有说服力的请求,得到的答案也和普通请求一样。
  • 范围外的主机不存在。 智能体无法列出它们,指名调用会像拼写错误一样失败。
  • 变更需要等人确认, 审批人看到的是确切的命令或 diff。智能体给出的说明会标明出自智能体。
  • 一切都有记录。 每次调用、判定、审批和输出摘要都写入签名的哈希链日志,可以离线验证。
限制 由谁执行 即使你电脑上的 bssh 被绕过也成立
范围、策略、审批、预算 bssh,在承载智能体连接的机器上 否
读取既不能写入也不能联网 内核,在主机上(Landlock 或 bubblewrap) 是,在配有沙箱的主机上
已批准的命令只能执行它自己 sshd,在主机上,通过证书的强制命令 是,在信任你证书颁发机构的主机上(文件修改使用你的连接凭据)
智能体的写入没有 root 权限 bssh-agent 用户和你的 sudo 规则 是,在有智能体用户的主机上

bssh ai doctor 会显示每台主机适用哪些行。一行都不适用的主机仅受 bssh 保护,但这也远胜于让智能体直接持有你的密钥。

对于试图操纵智能体的文本,bssh 的做法是:

  • 服务器的输出放在标记为不可信数据的字段中返回,绝不与 bssh 给智能体的指令混在一起。
  • 读取操作在沙箱中运行,因此被注入的“读取”命令既无法改变任何东西,也无法把数据发送出去。
  • 下载并执行代码的命令(例如 curl … | sh)会被标记为未知,并且总是需要询问。
  • 连续多次被拒绝,或反复尝试范围外的主机,会结束本次运行。

在输出到达智能体之前,bssh 会移除看起来像机密的内容:私钥块、云服务和各类服务的令牌、JWT、bearer 请求头、key=value 行和 URL 中的密码。每一项都会被替换为类似 «redacted:aws-key» 的标记,并计入日志。deny_paths 中的路径(私钥、.env 文件、/etc/shadow 等)完全不能读取。

这样,机密不会进入智能体的上下文,也不会进入模型提供商的日志。检测基于模式:它能覆盖常见格式,但不是你的系统可能打印出的每一种机密。

同步服务器负责转发审批请求并保存 AI 审计事件,二者都经过端到端加密。它能看到哪个智能体在何时行动、由谁批准,但永远看不到命令、主机、输出或策略。策略由管理员签名,网关会拒绝未签名的策略,或比已见版本更旧的策略。

  • 在客户端中确认依赖于智能体的客户端。 被设置为自动批准一切的客户端也会批准这类请求。因此该级别是可选的,只用于你所选主机上的低风险变更,并会如实记录。
  • 客户端名称由客户端自报。 日志显示的是 MCP 客户端声称自己是哪个智能体,并标注为自报。
  • 没有沙箱时,“只读”取决于解析器的判断。 它很保守,但也只能做到其规则所及的程度。安装 bubblewrap 或较新的 util-linux,可以让读取在机制上就是安全的。
  • bssh 无法阻止智能体另辟蹊径。 拥有自己的 shell 和你的 SSH 密钥的智能体仍然可以直接运行 ssh。不要把密钥交给智能体,并在适用时安装 Claude Code 防护钩子。
  • 仍然需要有人认真阅读请求。 计划、diff 和临时授权能让请求少而清晰,但不看就批准的审批起不到任何保护作用。