权限与访问控制
CrabCode 的工具权限模型:5 种模式 + 工作目录白名单 + allow/deny/ask 规则。
是什么
每次 CrabCode 想读文件、写文件、跑命令、访问网络时,都要过一次工具权限检查。决定结果的两件事:
- 当前权限模式(5 种之一)
settings.json的permissions字段里的 allow / deny / ask 规则
这里说的"权限"是单机本地工具粒度的拦截器,不是企业 SSO/RBAC 那种身份认证体系。账户登录与计费由 Acosmi 网关负责,详见 getting-started。
何时会看到这个文档
settings.json里permissions.defaultMode值非法时additionalDirectories路径配错时- 终端里
/permissions命令的"了解更多" - 模型尝试调用工具被拒,提示链接到这里
五种权限模式
| 模式 | 行为 |
|---|---|
default | 危险操作弹确认(推荐) |
acceptEdits | 文件编辑自动通过,shell 命令仍弹确认 |
plan | 仅规划、不执行任何写操作(适合方案讨论) |
bypassPermissions | 完全跳过权限检查(高风险) |
dontAsk | 静默拒绝所有需要确认的操作(CI 友好) |
切换方式:
crabcode --permission-mode plan # 启动时指定crabcode --permission-mode plan # 启动时指定或写进 settings.json:
{ "permissions": { "defaultMode": "acceptEdits" } }{ "permissions": { "defaultMode": "acceptEdits" } }或在 TUI 里按 Shift+Tab 循环切换(default → acceptEdits → plan → bypassPermissions → 回到 default)。
工具 × 模式行为矩阵
下表展示常用工具在 5 种模式下的默认行为(仍可被 allow / deny / ask 规则改写)。
| 工具 / 类别 | default | acceptEdits | plan | bypassPermissions | dontAsk |
|---|---|---|---|---|---|
Read (读文件) | 自动 | 自动 | 自动 | 自动 | 自动 |
Glob / Grep (搜索) | 自动 | 自动 | 自动 | 自动 | 自动 |
LS (列目录) | 自动 | 自动 | 自动 | 自动 | 自动 |
Edit / Write (写文件) | 询问 | 自动 | 拒绝 | 自动 | 拒绝 |
NotebookEdit (改 ipynb) | 询问 | 自动 | 拒绝 | 自动 | 拒绝 |
Bash (执行命令) | 询问 | 询问 | 拒绝 | 自动 | 拒绝 |
WebFetch (抓 URL) | 询问 | 询问 | 拒绝 | 自动 | 拒绝 |
WebSearch (联网搜) | 询问 | 询问 | 拒绝 | 自动 | 拒绝 |
Task / AgentTool (子代理) | 视子任务工具集 | 视子任务工具集 | 拒绝 | 自动 | 拒绝 |
| 工作目录外的路径 | 拒绝 | 拒绝 | 拒绝 | 自动 | 拒绝 |
说明:
- "自动"代表无提示直接通过;"询问"代表弹确认对话框;"拒绝"代表静默拦截
- 子代理 (
Task) 的工具集是父调用方工具集的子集,模式继承 plan模式只允许调用只读工具(Read / Glob / Grep / LS / WebSearch 视配置),任何写或副作用工具一律拒绝
工作目录白名单
CrabCode 默认只能读写启动时 cwd 及其子目录。要扩大:
crabcode --add-dir ~/code/sibling-repocrabcode --add-dir ~/code/sibling-repo或 settings.json:
{ "permissions": { "additionalDirectories": ["~/code/sibling-repo"] } }{ "permissions": { "additionalDirectories": ["~/code/sibling-repo"] } }启动时会请求你确认信任新加入的目录。
规则:allow / deny / ask
{
"permissions": {
"allow": [
"Bash(npm test:*)", // 任何 npm test 子命令直接通过
"Read(/etc/hosts)" // 允许读这个特定文件
],
"deny": [
"Bash(rm -rf:*)", // 永远禁掉
"WebFetch" // 整个工具禁掉
],
"ask": [
"Bash(git push:*)" // 即使 acceptEdits 也要弹框
]
}
}{
"permissions": {
"allow": [
"Bash(npm test:*)", // 任何 npm test 子命令直接通过
"Read(/etc/hosts)" // 允许读这个特定文件
],
"deny": [
"Bash(rm -rf:*)", // 永远禁掉
"WebFetch" // 整个工具禁掉
],
"ask": [
"Bash(git push:*)" // 即使 acceptEdits 也要弹框
]
}
}规则语法
- 形如
<ToolName>或<ToolName>(<匹配模式>) :*匹配子命令前缀(如Bash(git push:*)涵盖git push origin main、git push --force等)- 多段命令通过管道、
&&、分号串联时,CrabCode 会按子命令逐段检查;任一段触发deny即整条拒绝 - 路径类工具(
Read/Edit/Write/NotebookEdit)的括号内填绝对路径或 glob(如Read(~/secrets/**)) WebFetch(domain:*)可按域名做白/黑名单
冲突优先级
deny > ask > allow。即:
- 若同一调用同时命中
deny与allow→ 拒绝 - 若同时命中
ask与allow→ 弹询问 - 多层 settings 合并后规则按并集去重;任一层
deny即生效
TUI 命令
| 命令 | 作用 |
|---|---|
/permissions | 查看当前生效的完整权限矩阵;可交互式添加 / 移除规则 |
/privacy-settings | 隐私选项面板(遥测、错误上报、ZDR 等) |
/permission-mode <mode> | 临时切换权限模式(等价 Shift+Tab 循环) |
企业 / 团队加固
托管/策略 settings.json 可以下发以下字段(高于个人 settings.json,组员无法覆盖):
| 字段 | 作用 |
|---|---|
permissions.disableBypassPermissionsMode: "disable" | 强制禁用 bypassPermissions 模式 |
allowManagedPermissionRulesOnly: true | 仅采用托管下发的 allow/deny/ask;忽略用户/项目/本地/CLI 规则 |
allowManagedHooksOnly: true | 仅运行托管下发的 hooks |
allowManagedMcpServersOnly: true | allowedMcpServers 仅从托管读取 |
allowedMcpServers / deniedMcpServers | MCP server 白/黑名单 |
availableModels | 限制成员可选的模型范围 |
strictPluginOnlyCustomization | 锁定 skills / agents / hooks / mcp 自定义入口,只走 plugin |
strictKnownMarketplaces / blockedMarketplaces | marketplace 源白/黑名单 |
allowedHttpHookUrls | 限定 HTTP hooks 可访问的 URL 模式 |
httpHookAllowedEnvVars | 限定 HTTP hooks 可注入到 header 的环境变量 |
限制与注意
- bypassPermissions 模式风险高:CrabCode 启动时会要求显式确认;切换到此模式后,仍可通过 Shift+Tab 或
--permission-mode切回default,但已经执行的操作不可撤销 --dangerously-skip-permissionsCLI 标志等价于bypassPermissions,建议只用在沙箱或无网环境- 托管设置覆盖最高:组员无法绕过企业策略
- 规则按工具识别,不是按命令文本:
Bash(rm -rf:*)拒的是rm -rf这类调用本身;改名走别名(如unalias rm; alias rm="rm -rf")依然会被识别为rm调用并触发规则 plan模式不仅拒写:还拒绝任何会产生副作用的工具(Bash / WebFetch / NotebookEdit 等),是讨论方案的安全档