VS Code Copilot 终端命令自动审批的安全配置

2 阅读2分钟

问题背景

AI 编程助手频繁请求终端命令审批是效率瓶颈。VS Code 的 chat.tools.terminal.autoApprove 提供白名单机制,允许自动批准预定义的安全命令。

安全模型

采用白名单策略(默认拒绝),而非黑名单(无法穷举所有危险命令如 curl | bash、fork bomb 等)。

分层配置策略

完整配置文件可直接下载: copilot_auto_approve_settings.jsonc

配置分为五层,从宽松到严格:

层级匹配方式覆盖范围
第一层Substring Match无副作用只读命令 (grep/awk/sed/make/git/cat 等)
第二层Regex (行首+管道链)文件管理/系统监控/编译器/脚本解释器
第三层Regex本地脚本执行 (./build.sh)
第四层Regex安全删除 (构建产物/缓存/临时文件)
第五层兜底拒绝所有未匹配的 rm 操作

关键正则说明

第二层通用操作白名单,匹配行首或管道/逻辑与/分号之后的命令:

"/^(\\s*|.*[\\|\\&\\;]\\s*)(cd|ls|pwd|cp|mv|mkdir|find|gcc|g\\+\\+|python3?|node|docker|kubectl)(\\s+.*)?$/": {
  "approve": true,
  "matchCommandLine": true
}
  • ^:行首匹配
  • .*[\\|\\&\\;]\\s*:管道链中的命令
  • \\b(\\s+.*)?$:防止误匹配(如 rm 不匹配 rmdir

第四层安全删除,仅允许构建产物和缓存:

"/^(\\s*|.*[\\|\\&\\;]\\s*)rm\\s+(-rf\\s+)?
  (build.*|out|dist|target|node_modules|\\.cache|__pycache__|
   .*\\.(o|a|so|tmp|log|bak)|CMakeCache\\.txt)(\\s.*)?$/": {
  "approve": true
}

第五层兜底拒绝所有其他 rm:

"rm": false

风险评估:看似安全实则危险

命令风险缓解
curl URL | bash下载并执行远程脚本先下载审查再执行
find -exec rm {}匹配规则有误时删除重要文件先预览匹配结果
xargs cat文件名含特殊字符导致注入使用 -print0 | xargs -0

自定义扩展

根据项目需要添加规则:

{
  // 项目构建脚本
  "^\\./scripts/(build|test|deploy)\\.sh$": {},
  // Docker (只读操作)
  "^docker\\s+(build|run|ps|logs|inspect)\\b": {},
  // Kubernetes (只读操作)
  "^kubectl\\s+(get|describe|logs)\\b": {},
  // 数据库 (只读查询)
  "^psql\\s+.*\\s+-c\\s+\"SELECT\\b": {}
}

禁止 docker rm -fkubectl deleteINSERT/UPDATE/DELETE/DROP 等写操作,需人工确认。

Claude Code 对比

Claude Code 使用 .claude/settings.jsonallowedTools 控制工具类型(如 Bash),而非具体命令。粒度更粗,Bash 工具允许执行任意 shell 命令。建议生产环境移除 Bash,只保留 ReadGrep 等只读工具。

安全建议

  • 沙箱隔离:在 devcontainer 中运行 AI Agent,限制网络出站
  • Prompt Injection 防御:AI 读取不受信任内容时可能被诱导执行危险操作,需静态分析 + 人工审核
  • 团队管理:将配置纳入 .vscode/settings.json 版本管理,定期审计规则