限制助手可用的工具

网络安全Beginner
立即练习

介绍

项目助手帮助同事阅读规划文档。助手会提出工具调用,即 documents.read 这样的结构化请求。Tool Server 执行操作。看似合理的提案并不等于执行权限。

你负责维护一个使用合成数据的教学服务。先观察正常读取,再通过两次小型策略编辑移除多余的写入、删除权限。提案是确定性回放,不是实时模型回答。认证、服务端决策和文档操作均真实执行。本实验不测试抵御提示注入的能力。

使用 Policy Editor 维护配置,使用 Test Client 发送认证请求,在 Assistant Tool Lab 查看回放页面。两个终端属于同一实例上的不同操作系统用户。Policy Editor 有意保留维护权限;Test Client 不能编辑策略或使用 sudo。只需具备基本终端操作能力。

保留读取并移除写入

本步骤先观察正常文档读取,再移除助手的写入权限。

在实验界面选择 Assistant Tool Lab 标签页,开始本步骤。

教学账号为 alice 和 bob。主体是通过认证确定的用户身份。每个账号都有 assistant 角色,用于归集工具权限。文档均为合成数据:alice-notes 属于 Alice,bob-notes 属于 Bob,Bob 将 team-plan 共享给 Alice。只有 demo-pad 可以用于可丢弃的演示。

切换到 Assistant Tool Lab 标签页。选择 alice,输入密码 training-alice,点击 Sign in。保留工具 documents.read 和文档 alice-notes,点击 Replay proposal。轨迹把不可信提案与服务端结果分开展示。预期为 HTTP 200、主体 alice、决策 allowed 和 Synthetic Alice planning notes。这是真实的文档读取。

Assistant Tool Lab 分开展示回放的提案与服务端允许结果

切换到 Test Client 标签页。预置的 assistant 命令使用认证账号发送 HTTP 请求。replay 通过回放路由提交提案;call 直接进入工具处理器。后面的两个词分别指定工具和文档。运行:

运行以下命令前,请切换到 Test Client 标签页。

assistant replay documents.read team-plan

预期为 HTTP 200 和 Synthetic shared project plan。接下来只在可丢弃的演示文档上观察过度授权:

assistant replay documents.write demo-pad

预期为 HTTP 200 和 "effect": "written"。服务端确实修改了该演示文档。只读业务角色不应能这样操作。

切换到 Policy Editor 标签页。cat 打印文件;以下绝对路径指向生效的工具允许列表:

运行以下命令前,请切换到 Policy Editor 标签页。

cat /home/labex/project/tools.json

JSON 的名称和值使用引号,名称和值之间用冒号,列表用方括号。assistant 列表目前包含读取、写入和删除。仅移除菜单选项仍会留下直接请求入口;服务端每次请求都会在处理器守卫内部加载这个列表。

用以下中间策略替换文件。cat > path 将文本写入文件,而不是打印。带引号的 EOF 开始一个保留字面内容的 here-document;结尾的 EOF 必须独占一行。这会替换整个小文件,输入有误时重新执行即可修复。

cat > /home/labex/project/tools.json <<'EOF'
{
  "assistant": ["documents.read", "documents.delete"]
}
EOF

切回 Test Client 标签页,重复写入提案:

运行以下命令前,请切换到 Test Client 标签页。

assistant replay documents.write demo-pad

预期为 HTTP 403 和 tool_denied。403 表示服务收到了请求并拒绝执行;连接错误表示根本没有到达决策环节。CLI 会打印预期的拒绝,但不会结束 shell。若看到 policy_error,切换到 Policy Editor 标签页,重新执行完整 JSON 编辑,再切回 Test Client 重试请求。无需重启。

assistant call documents.read alice-notes

读取仍应返回 HTTP 200。检查点使用两个认证用户测试写入拒绝和正常读取,不要求复制输出。

关闭直接删除入口

本步骤完成只读角色,并同时测试直接处理器和回放入口。

在实验界面选择 Policy Editor 标签页,开始本步骤。

删除是独立操作。阻止写入不会自动阻止删除。切换到 Policy Editor 标签页,将列表替换为该角色唯一需要的操作,继续使用相同的完整文件编辑方法:

运行以下命令前,请切换到 Policy Editor 标签页。

cat > /home/labex/project/tools.json <<'EOF'
{
  "assistant": ["documents.read"]
}
EOF

切换到 Test Client 标签页,向可丢弃的演示文档发送直接删除请求:

运行以下命令前,请切换到 Test Client 标签页。

assistant call documents.delete demo-pad

预期为 HTTP 403 和 tool_denied。call 绕过回放页面,因此这证明可见界面并非授权执行边界。也测试直接写入:

assistant call documents.write demo-pad

预期同样被拒绝。检查 Alice 是否仍可读取合法共享的文档:

assistant call documents.read team-plan

预期为 HTTP 200 和 Synthetic shared project plan。切换到 Assistant Tool Lab 标签页,保持 Alice 登录,选择 documents.delete,输入 demo-pad,点击 Replay proposal。服务端也必须返回 tool_denied。

Assistant Tool Lab 显示服务端拒绝不必要的删除工具

“请只读取”这样的提示词不能替代守卫。后端必须独立于提案作出决定。禁用全部工具也会破坏助手的正常工作。若读取被拒绝,检查 JSON 列表中 documents.read 的拼写。检查点使用可丢弃的内存文档调用完全相同的写入、删除处理器守卫,并检查真实的允许读取;它不会删除学员文档。

读取工具仍可请求他人的私有对象。下一个实验将加入独立的文档边界。

总结

你保留了正常读取,同时移除了写入和删除权限。回放提案与直接调用现在都经过相同的真实服务端守卫。工具权限只是一个边界:允许的读取仍需要逐文档授权。