阅读需 8 分钟

自主智能体的入门流程,应从锁定的保险库开始

自主智能体的入门流程应从锁定的保险库开始,逐步过渡到安全 HTTP、隔离 SSH、逐次审批和经过验证的审计记录。

自主智能体的入门流程,应从锁定的保险库开始

自主智能体应该分阶段获得访问权限。如果一开始就把生产令牌交给智能体,然后告诉它“要小心”,你就跳过了设置过程中最重要的一步。只有通过这一步,你才能了解控制措施在压力下会如何运行。

第一天的流程应该从一个拒绝一切操作的保险库开始,先执行一次低风险 HTTP 操作,再加入 SSH,最后为需要严格控制的凭据启用每次使用审批。在你还清楚记得这次运行时,验证审计记录。这个顺序很重要,因为每个阶段都能隔离一种不同的故障。

目标不是尽快让智能体发挥作用,而是准确了解它能做什么、哪些操作必须由你批准、它会记录什么,以及在把它连接到有实际后果的工作之前,如何让它停下来。

从拒绝一切操作的保险库开始

第一次成功测试应该是一次拒绝。即使智能体提出的请求完全合理,即使凭据已经配置好,一个锁定的保险库也必须拒绝智能体的操作。

只有当你看到智能体重试失败的操作时,这听起来才不再反常。智能体不会犹豫。工具报告访问不可用时,它可能改用另一个端点、修改参数、调用相关工具,或请求批准。你希望安全边界在任何凭据离开受保护存储之前就给出回应。

在 Mac 上,确保应用正在运行,但让保险库保持锁定。通过正常的开发流程启动智能体,并给它一个有意设置得无害的请求,例如从一个你尚未授权的 API 获取测试资源。

预期结果很简单:请求不会执行。不要通过把令牌粘贴到环境变量、 shell 配置文件、提示词、项目文件或智能体配置文件中来绕过拒绝。这样做会传达错误的经验,因为它把第一次测试变成了普通的密钥处理问题。

记下智能体报告的内容。你要检查以下三点:

  • 智能体能通过 MCP 连接到操作网关。
  • 保险库锁定时,保险库闸门会阻止操作。
  • 智能体对话记录、终端输出或工具参数中都没有出现密钥。

区分“凭据不可用”和“保险库已锁定”很重要。凭据不可用通常说明设置出了问题。保险库锁定则表示设置正常,只是访问被有意关闭。如果你把这两种失败都理解成“令牌不能用”,最终可能会关闭原本保护你的控制措施。

Sallyport 把这作为决策阶梯中的第一道控制:保险库锁定时,所有操作都会被拒绝。在支持的 Mac 硬件上,保险库闸门使用 Secure Enclave 和 Touch ID,而不是要求智能体证明自己的身份。

连接智能体,但不要把密钥交给它

智能体需要的是一条操作路径,而不是一份凭据副本。这条原则能避免一次有用的自动化运行演变成失控的密钥分发事件。

配置支持 MCP 的智能体,使用内置的 stdio shim:

sp mcp

这个 shim 是一个普通的 MCP 服务器。智能体与它通信,请求执行 HTTP 或 SSH 操作,然后接收结果。凭据会留在应用内的加密保险库中。智能体不会收到明文令牌、替代令牌,也不会收到之后可能被滥用的类似密钥的占位符。

这比许多团队划出的边界更清晰。他们常说“智能体的访问权限有限”,实际意思却是智能体的环境中有一个权限有限的令牌。这是两种不同的系统。

使用环境变量时,任何能读取环境的进程都可能复制密钥。shell 历史记录、调试日志、崩溃报告、子进程、导出的提示词或粘贴过的终端记录,都可能延长密钥的存活时间。使用操作网关时,智能体可以请求特定操作,却无法查看用于授权该操作的凭据内容。

在解锁任何内容前,检查智能体配置中常见的泄露点:

  • .env 文件、 shell 启动文件、智能体指令和项目文档中删除令牌。
  • 即使工具支持 token 字段,也不要仅仅因为这个原因把凭据加入工具参数。
  • 不要允许智能体读取你试图保护的同一个密码管理器、密钥文件或云凭据目录。
  • 第一次运行智能体时,不要让它与已加载高权限环境变量的终端会话共用环境。

开发者还经常给出一个流行却糟糕的建议:“先用临时令牌,之后再加固。”临时令牌一旦进入智能体上下文,仍然是密钥。可以使用影响范围有限的临时凭据,但不要把它当成放弃智能体与密钥之间边界的理由。

先完成一次普通的 HTTP 请求

第一次获准的操作应该是一次 HTTP 请求,并使用用途范围狭窄的凭据。最好是只读凭据,更好的是测试账户,最理想的是返回已知且不敏感对象的端点。

选择一个可以独立验证的请求。好的例子包括读取测试仓库的元数据、获取你创建的沙盒配置,或调用与非生产账户关联的状态端点。不要使用会列出真实客户、源代码、账单数据或大范围账户设置的端点。一次成功的读取仍可能泄露超出预期的信息。

按照服务要求的身份验证形式,在保险库中设置 HTTP 凭据:bearer 身份验证、basic 身份验证或自定义请求头。凭据标签要足够清晰,方便你稍后在审批卡中识别。“测试 API 读取”比“令牌 2”更好。未来的你不应该还要打开密码管理器,才能判断一次点击是否安全。

现在解锁保险库,并启动一个全新的智能体进程。默认情况下会启用按会话授权,因此新进程发出的第一次操作应该会显示审批卡。在批准前,阅读其中显示的代码签名机构。

不要把这项检查简化为“我认识这个智能体名称”。熟悉的命令名称可能由意外的包装器、复制的二进制文件或其他开发工具启动。审批卡首先显示进程的代码签名机构,因为请求访问的进程,比它声称正在执行的自然语言任务更重要。

只有在以下条件全部满足时,才批准运行:

  1. 这是你亲自启动的智能体进程。
  2. 签名身份与该进程的预期身份一致。
  3. 请求使用的凭据范围正是你设定的范围。
  4. 请求内容就是你要求智能体执行的操作。

然后让智能体恰好发起一次调用。将返回结果与你在智能体流程之外手动发出的请求进行比较。你不是在证明 HTTP 可以工作,而是在证明智能体可以请求操作、网关可以注入存储的凭据,并且结果可以返回,同时不会暴露凭据本身。

第一天的记录可以很简短:

Credential: Test API read
Agent task: Retrieve one known test object
Expected result: Object identifier and status only
Manual comparison: Same identifier and status
Unexpected data returned: None

如果响应中的字段比预期更多,就停在这里。不要让智能体总结多出来的数据后继续。缩小 API 范围,使用更小的测试对象,或选择范围更窄的端点。第一次 HTTP 调用应该通过控制范围建立信心,而不是靠结果看起来多么 impressive。

会话审批针对一次运行,不是空白支票

按会话授权回答的是一个具体问题:你是否批准这个智能体进程在本次运行期间执行操作?它并不意味着每个凭据或每个请求的操作都值得同样对待。

批准运行后,智能体可以在退出前发起多次调用。当你监督的是一个连贯的任务时,这很有用,例如读取测试元数据并生成本地报告。但如果运行包含开放式提示词、可以派生相关工作,或能访问后果不同的凭据,这就会带来风险。

把一次会话当成有边界的工作单元。为一个任务启动它,观察最初几次操作,任务完成后结束它。下一个不同的任务启动新的进程,这样你就能再次做出授权决定。

Sessions 日志应该支持这种习惯。它会记录智能体运行,你也可以立即撤销某次运行。当智能体开始偏离目标、你发现批准了错误的进程,或任务进行到一半改变了性质时,都可以使用撤销。

有一种失败模式值得注意。你要求智能体“检查测试 API,并修复任何明显的问题”。它先发出一次无害的 GET 请求。你批准了会话。它发现配置不匹配,看到可用操作中有一个写入端点,于是认为明显的修复方式是更新设置。凭据可能确实允许这样做,而最初的批准可能仍然覆盖整个运行。

这个故事不需要恶意智能体或损坏的工具。问题出在任务边界。你把发现阶段和修复阶段放进同一个会话,却期待最初的批准在两个阶段中都具有相同含义。

应该拆开处理。先批准一个只读的发现会话,查看它的发现结果。然后为建议的变更启动单独的运行,最好使用另一个写入权限更窄的凭据。当一次审批对应一个你能用一句话描述的工作单元时,审批才真正有意义。

等 HTTP 边界变得习以为常后,再加入 SSH

为每次高风险凭据使用设置审批
你可以为每个密钥设置逐次批准,让每次使用凭据都需要一次点击或 Touch ID。

SSH 不是“用于服务器的 HTTP”。它带来的后果范围更大,因为一次成功的连接可以运行任意命令、检查文件、修改权限,并通过窄范围 API 不会暴露的通道传输数据。

从一次性主机或隔离的开发机器开始。创建一个没有生产访问权限、没有共享凭据,也没有理由接触主目录或云配置的远程账户。在该主机上放置一个包含已知文本行的无害文件。智能体的第一次 SSH 任务应该只获取这一行内容,不做其他事情。

Sallyport 通过内置的无状态 Go helper sp-ssh 路由 SSH 操作。智能体通过同一个网关模型请求操作,而存储的 SSH 凭据会留在保险库中,不会变成智能体可以读取的私钥文件。

第一次 SSH 练习应该有意设置得很窄:

Host: isolated development host
Remote account: restricted test account
Allowed task: Read one known text file
Expected response: The exact line placed in that file
Stop condition: Any attempt to inspect other paths or run a second command

不要从“运行诊断”开始。这个说法太宽泛。诊断通常意味着进程列表、网络配置、软件包清单、日志文件、主目录和应用配置。一个能力较强的智能体会广泛理解这个请求,因为广泛解释往往是它完成任务的方式。

注意一个常见的操作错误:开发者使用方便而不是安全的账户测试 SSH。这个账户可以访问熟悉的主机,也许还能通过现有的个人密钥访问,所以测试很快就能完成。随后,智能体的第一次 SSH 体验就包含了仓库、部署凭据、shell 历史记录、配置文件,以及该账户能够读取的其他内容。你只学到了隧道可以工作,却没有获得任何关于隔离效果的有用信息。

受限测试账户能让失败清晰可见。如果智能体请求访问意外路径,你可以在日志中看到尝试的操作,并拒绝或撤销,而不必担心它已经找到更敏感的文件。

对有实际后果的凭据启用逐次审批

逐次审批要求你确认某个凭据的每一次使用。在尝试那些能够改变系统、访问敏感资料,或连接到一次 shell 命令就可能造成广泛影响的主机之前,先启用这一设置。

开发者经常对此感到抗拒,因为反复出现的提示让人觉得低效。这个成本确实存在。低风险读取也每次弹出提示,会让你养成不阅读就点击的习惯。这就是审批疲劳,它会让控制措施变得比没有控制还糟,因为它制造了虚假的安全感。

在每次操作都需要人重新做决定的地方,使用逐次设置。适合的凭据包括能够:

  • 创建、修改或删除远程资源;
  • 读取个人、客户、财务或安全敏感记录;
  • 调用管理 API 方法;
  • 打开通往共享开发、预发布或接近生产环境机器的 SSH 访问;
  • 触发部署、任务、工作流或外部通知。

在熟悉流程时,让低风险测试读取使用会话审批。下一次添加具有实际后果的凭据时,为它设置逐次闸门。然后给智能体一个需要两次独立调用的任务,例如读取测试设置并提出变更建议,但不要应用变更。确认凭据启用逐次设置后,你确实需要为每次使用单独审批。

这里的区别很重要。按会话审批询问的是某个进程是否可以在本次运行期间执行操作。逐次审批询问的是这个特定凭据现在是否可以使用。前者关注进程身份和运行时长,后者关注某个存储密钥所关联的后果。把它们混为一谈,会导致团队要么批准范围过大,要么频繁弹出提示,最后没有人真正阅读审批卡。

提示出现时,不要只检查凭据标签。检查操作、目标,以及智能体当前的任务是否仍然需要这次调用。如果不需要,拒绝使用,并要求智能体先用简单语言解释计划,再考虑批准其他操作。

活动日志会把意外变成证据

让控制点留在本地
一个经过签名的 Mac 菜单栏应用在进程内运行保险库核心,无需单独的守护进程。

会话记录告诉你哪个智能体运行获得了批准。活动记录告诉你该运行内部发生了什么。两者都需要,因为一个看起来正常的进程仍可能做出错误决定,而一次可疑调用如果无法和触发它的运行关联起来,也很难判断意义。

完成 HTTP 测试后,打开 Activity 日志,逐条阅读每次调用。SSH 测试后也做同样的事。将记录和你写下的练习内容进行比较:预期的端点或主机、预期的操作以及预期的结果。你是在训练自己趁着不匹配还容易解释时发现它。

特别注意那些单独看起来无害、却不符合任务的调用。元数据端点可能暴露账户结构。主机探测可能引向更广泛的命令。一次重试可能无害,也可能说明智能体在第一次响应失败后修改了参数。上下文来自会话和调用顺序,而不是来自孤立查看的一行记录。

不要把智能体的叙述当作记录。智能体可能准确总结,也可能遗漏细节、误解工具响应,或为一个你不会批准的操作写出流畅的解释。日志是用来核对发生了什么,不是用来评估周围文字写得好不好。

这也是立即撤销发挥作用的地方。如果你看到智能体从约定任务转向探索,先撤销会话。停止后续操作,再判断这次调用是否无害。在会议中等待完整解释是合理的,但面对一个正在使用凭据的活跃进程,这不是好的应对方式。

在需要用它争论之前,先验证审计链

批准你亲自启动的进程
新的智能体进程会在首次获准调用前展示其代码签名机构。

只有能够发现记录本身是否被篡改,审计记录才有用。阅读事件列表只能告诉你界面当前显示了什么。验证则能告诉你加密审计日志的哈希链是否仍然通过检查。

在前两次练习后执行:

sp audit verify

Sallyport 可以在密文上离线验证哈希链,因此这项检查不需要访问保险库密钥。调查期间,这个特性很实用。你可以检查记录完整性,而不必先解锁同一个控制智能体操作的存储空间。

在一切平静时先运行一次命令。记下变更、测试或事故中保存结果的位置。然后在一次有意拒绝的操作、一次获准的 HTTP 调用和一次获准的 SSH 调用后再次运行。你检查的是一组事件已知的序列,这会让之后更容易识别意外的验证结果。

不要等到出现严重的生产问题时,才发现谁能运行这个命令、日志存放在哪里,或团队是否了解会话记录与单次调用之间的区别。这是常见的失败方式。团队安装日志系统,相信它确实存在,直到有人问“是谁批准了这个?”才打开日志。那时他们不得不同时学习工具和还原事件。

审计日志来自一条不可读取的加密哈希链记录,并被投影到 Sessions 和 Activity 日志中。这样你可以获得两个用于操作的视图,同时又不会让这些视图成为唯一能够检查的证据。

让第一周比第一次演示更严格

一次漂亮的演示在 HTTP 请求成功时就结束了。一个可用的入门流程应该持续到你拒绝过一次操作、有边界地批准过一次运行、主动撤销过一次运行、检查过逐条调用、在隔离主机上测试过 SSH、使用过逐次审批,并验证过审计链。

第一周的范围要小到你能解释每一次操作。每次只添加一个新凭据或新能力。如果新的设置需要多个例外、宽泛的权限范围,以及一个你无法快速理解的提示,那它还没有准备好交给自主智能体。

实际测试很直接:智能体请求操作时,你能否说清楚是谁在请求、会使用哪个存储凭据、操作会发送给哪个外部系统,以及之后应该去哪里查看?如果任何一个答案含糊不清,就回到前一个阶段,缩小测试范围。

这比把令牌复制到配置文件中更慢。但只有这样,你才能避免在凌晨两点发现,第一次真正的智能体运行,正是凭据控制彻底失去控制作用的时刻。

常见问题

第一次测试自主智能体时,应该使用什么凭据?

从不会造成损害的凭据开始:沙盒 API 令牌、只读端点,或一个不含生产数据的账户。第一次练习应该证明,智能体可以请求执行操作,你可以批准该操作,而且返回的结果确实有用。不要一开始就导入能够部署、删除数据或访问客户数据的凭据。

保险库锁定时,智能体还能发出请求吗?

保险库锁定时应该拒绝所有操作,包括无害的读取请求。这个行为本身就是目的:它能证明智能体无法把一个处于休眠状态的后台进程变成主动持有凭据的进程。只有在准备好监督一次运行时,才解锁保险库。

为什么要先用 HTTP,再让 AI 智能体使用 SSH?

HTTP 能提供一个更小、更容易检查的第一道边界。你可以使用一次性或只读凭据,请求一个明确的端点,再把结果和手动请求进行比较。SSH 还涉及主机身份、命令范围、文件访问和 shell 行为,因此应该放在入门流程的后面。

什么时候可以安全地批准智能体会话?

只有在你确认审批卡中显示的进程,并且确定是自己有意启动这次运行后,才批准会话。会话审批应该覆盖一次边界明确的运行,而不是出现在电脑上的所有智能体进程。如果进程身份让你感到意外,请拒绝审批,并检查智能体是如何启动的。

哪些凭据需要每次使用都审批?

对于能够改变外部状态或暴露敏感结果的凭据,应该启用逐次批准。部署凭据、具有写入权限的 API、管理端点,以及通往一次性主机之外设备的 SSH 访问,都适合使用这一设置。逐次审批会增加操作成本,但当一次调用的后果难以撤销时,这种成本是有价值的。

智能体操作的审计轨迹应该包含什么?

有用的审计记录应该回答四个问题:哪个智能体运行执行了操作、它尝试做了什么、操作发生在什么时候,以及记录是否仍然通过验证。你还需要足够的上下文,把意外调用和触发它的会话联系起来。只有一堆应用日志,却没有清晰的运行边界,通常无法满足这些要求。

应该多久验证一次智能体审计日志?

在第一次 HTTP 练习后、第一次 SSH 练习后,以及调查有争议的运行时,执行 sp audit verify。在发生事故前把验证变成日常流程,效果最好。将结果和变更记录或事故笔记放在一起,不要把日志当成一个以后再记得查看的地方。

如果智能体发出了意外调用,我该怎么办?

立即撤销活动会话。如果不再需要任何操作,再锁定保险库。重新启动智能体前,先阅读逐条活动记录,因为一次重试可能会让第一次意外请求隐藏在更新、更干净的运行记录后面。在再次批准会话前,修正提示词、工具配置或凭据范围。

把只读 API 令牌交给自主智能体安全吗?

只读 API 令牌更安全,但它仍可能暴露你不愿放进聊天记录或终端滚动输出中的数据。将范围限制在测试账户或窄范围端点,并检查智能体在结果中实际收到的内容。只读权限可以缩小影响范围,但并不能免除审批和复核。

自主智能体是否应该接收我的 API 或 SSH 密钥?

不应该。智能体需要获得的是操作接口,而不是密钥本身。Sallyport 会把 API 和 SSH 凭据保存在加密保险库中,由自己执行请求或 SSH 操作,再把结果返回给智能体。这种分离很重要,因为任何放入智能体工作上下文的密钥,都可能被记录、回显、复制,或意外包含在输出中。

Sallyport

Sallyport 替你的 AI 智能体执行 API 调用和 SSH 命令。密钥留在你 Mac 上的本地密钥库里;每次运行由你批准,每个操作都落入一份密封的审计日志。

© 2026 Sallyport · 依据 Apache-2.0 开源 · Oleg Sotnikov