MCP 的安全与权限边界

MCP 把本地文件、内网数据库、浏览器会话交给了模型驱动的程序。出问题通常不是被攻破,而是一次看似正常的调用改错了东西:覆盖配置、删掉目录、把生产数据写进聊天记录。本章给一套可落地的边界:最小权限、只读优先、敏感目录排除、密钥进环境变量、审计留痕、环境隔离、工具白名单。

先定权限模型:四要素

每个 MCP 服务端上线前都要答全这四个问题,答不全就先别开。

要素要回答的问题具体做法
身份以谁的权限运行专用低权限账号与专用目录,不用管理员账号
范围能碰到哪些资源根目录白名单、库表白名单、域名白名单
动作允许做哪些操作读优先;写、删、执行命令单独授权
时限什么时候有效任务级开关,用完即关,能设超时就别常驻

只读优先:从最小能力开始

默认全关,按任务逐个打开,是唯一可维护的做法。

阶段文件数据库浏览器用途
第一周只读指定目录只读账号 + LIMIT只抓取不点击观察它到底会做什么
稳定后允许新建文件仍只读测试站点可点击日常草稿与调研
必要才开允许改名移动走单独工单写库生产站点只读截图高风险动作,人工在场
{
  "mcpServers": {
    "files": {
      "command": "<你的文件 MCP 服务端启动命令>",
      "args": ["--root", "D:/ai-workspace", "--read-only"],
      "env": {
        "ALLOW_DELETE": "false",
        "FOLLOW_SYMLINKS": "false",
        "MAX_FILE_MB": "5"
      }
    }
  }
}

三个开关最值得关注:--read-only 决定能不能写,FOLLOW_SYMLINKS=false 防止从软链接跳出白名单,MAX_FILE_MB 防止一次读进超大文件把上下文塞满。

敏感目录与文件排除

「绝对不许碰」的清单要写死在服务端配置里,而不是靠提示词提醒。

类别例子处理方式
密钥与凭据.env、私钥文件、云凭据目录不挂载,或列入拒绝清单
版本库内部.git 目录拒绝读取,避免泄露历史与远端地址
系统目录系统盘、程序安装目录、用户配置目录不加入白名单根目录
生产数据导出文件、备份文件、客户资料只在隔离目录放脱敏样本
浏览器数据浏览器用户数据目录不挂载,用独立配置隔离会话
deny_paths:
  - "**/.env"
  - "**/*.pem"
  - "**/*.key"
  - "**/.git/**"
  - "**/secrets/**"
  - "**/backup/**"

密钥只放环境变量

配置文件会被复制、被提交、被转发到群里;环境变量至少不会跟着文件走。

做法反例正例
存放位置配置里写明文口令系统环境变量或本地密钥管理工具
引用方式把口令粘进提示词配置里只引用环境变量名
轮换人人共用的长期口令每环境独立口令,定期轮换
注入范围让模型进程读到全部环境变量只注入它需要的那几个变量
export AI_DB_PASSWORD='<你自己的口令>'   # 只在当前会话生效,不写进配置文件
git check-ignore -v .env || echo '警告:.env 没有被忽略'

工具白名单:只暴露需要的那几个

一个服务端往往暴露十几个工具,全开等于把「删除」和「执行任意命令」也交了出去。

工具类型是否默认开说明
读取与查询只读、可回滚、影响面小
新建文件视情况限制在隔离工作目录内
改名与移动先干跑出清单,人工确认
删除基本不需要给模型
执行任意命令改用固定脚本,把命令写死在脚本里
提交与推送提交信息由你确认后再执行
{
  "tools": {
    "allow": ["read_file", "list_dir", "write_file", "search_content"],
    "deny": ["delete_path", "move_path", "run_shell"]
  }
}

审计与日志

没有日志,出事只能靠猜。至少要能回答:哪个会话、什么时候、调了哪个工具、参数是什么、结果如何。

记录项为什么需要
时间与调用方定位是哪次任务触发的
工具名与参数摘要参数里的路径尤其要留
目标资源文件路径、库表名、URL 域名
结果状态成功、失败、被拒绝
审批痕迹哪一步是人工确认后放行的
grep -Ei 'write_file|move_path|delete_path' mcp-audit.log      # 所有写操作
grep -E '"(status|result)":\s*"(error|denied)"' mcp-audit.log  # 失败与被拒绝

日志本身也是敏感数据:参数里可能带路径、表名甚至数据片段,别把它同步到公开位置。

生产与个人环境隔离

维度个人/试验环境生产环境
数据脱敏样本、假数据真实数据,默认不接入
账号个人账号专用只读账号,最小权限
网络可直连互联网走审计网关,域名白名单
写入允许写工作目录禁止模型直接写入
审批事后看日志关键动作事前确认
回滚删掉工作目录即可必须有经过验证的回滚方案
常见坑后果规避
用管理员账号跑 MCP 服务端一次误调用伤到系统专用低权限账号
把「请注意安全」写进提示词当防线约束不可靠权限写在服务端配置里
白名单设成整个用户目录等于全盘开放只挂一个隔离工作目录
软链接指向白名单外绕过目录限制关闭跟随软链接
日志只记「调用成功」出事无法复盘记录参数摘要与目标资源

小结:MCP 的安全不靠提示词而靠配置——权限模型定身份与范围,只读优先定能力上限,敏感目录与密钥管理挡住最贵的损失,白名单与日志让每次调用可追溯,生产与个人环境彻底隔离;上线前逐条打钩,再谈自动化。

笔记加载中…