安全文件读写策略与路径权限设计
文件系统是最强大的 MCP 工具,也是最需要谨慎设计的。一个配置不当的文件系统 MCP,可能让 AI 意外覆盖重要文件甚至读取敏感配置。本节建立系统性的安全策略。
威胁模型:文件操作的四类风险
graph TD
A[文件操作风险] --> B[路径穿越
访问授权目录外的文件] A --> C[意外覆写
AI 误解指令,覆盖关键文件] A --> D[敏感信息泄露
读取密钥/凭证文件] A --> E[数据外泄
AI 在回复中包含敏感文件内容] B --> B1["防御:严格的根目录配置"] C --> C1["防御:写操作需要明确确认"] D --> D1["防御:排除敏感目录和文件类型"] E --> E1["防御:系统提示中加入数据处理规则"] style B fill:#E74C3C,color:#fff style C fill:#E74C3C,color:#fff style D fill:#E74C3C,color:#fff style E fill:#F39C12,color:#fff
访问授权目录外的文件] A --> C[意外覆写
AI 误解指令,覆盖关键文件] A --> D[敏感信息泄露
读取密钥/凭证文件] A --> E[数据外泄
AI 在回复中包含敏感文件内容] B --> B1["防御:严格的根目录配置"] C --> C1["防御:写操作需要明确确认"] D --> D1["防御:排除敏感目录和文件类型"] E --> E1["防御:系统提示中加入数据处理规则"] style B fill:#E74C3C,color:#fff style C fill:#E74C3C,color:#fff style D fill:#E74C3C,color:#fff style E fill:#F39C12,color:#fff
目录权限分层设计
三层权限模型
将工作目录按风险级别分层,不同层配置不同的 MCP Server 实例:
~/ai-workspace/
├── read-only/ ← 只读层:参考资料、模板
│ ├── templates/
│ └── references/
├── workspace/ ← 读写层:AI 的主要工作区
│ ├── drafts/
│ ├── output/
│ └── temp/
└── archive/ ← 归档层:完成的工作,建议只读
└── 2026/
对应的 MCP 配置(Claude Desktop):
{
"mcpServers": {
"fs-readonly": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"--readonly",
"/Users/yourname/ai-workspace/read-only",
"/Users/yourname/ai-workspace/archive"
]
},
"fs-workspace": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/yourname/ai-workspace/workspace"
]
}
}
}
注意:
--readonly标志让 Server 只暴露read_file、list_directory等只读工具,write_file、create_directory不会被注册。
操作系统层面的权限加固
除了 MCP 配置,还可以用操作系统权限作为额外防线:
# macOS:设置只读目录(即使 MCP 配置允许写,OS 也会拒绝)
chmod -R 555 ~/ai-workspace/read-only
# Linux:设置不可变属性(防止任何进程修改)
chattr +i ~/important-config.json
# 验证权限
ls -la ~/ai-workspace/
高风险文件和目录的排除策略
以下位置绝对不应该出现在 MCP 根目录范围内:
| 目录/文件 | 包含什么 | 风险 |
|---|---|---|
~/.ssh/ | SSH 私钥 | 服务器访问权限泄露 |
~/.aws/ | AWS 访问密钥 | 云账号访问权限 |
~/.config/ | 应用配置,可能含 token | 各类服务访问权限 |
~/.gnupg/ | GPG 密钥 | 加密/签名身份 |
~/Library/Keychains/ | macOS 钥匙串 | 所有已保存密码 |
*.env 文件 | 环境变量和密钥 | API 密钥、DB 密码 |
*.pem、*.key | 证书和私钥 | TLS/SSL 身份 |
系统性做法:将 AI 工作区与个人文件完全分离,不要把 ~/Documents 直接授权给 MCP:
# ❌ 危险:Documents 下可能有各种敏感文件
"args": ["...", "~/Documents"]
# ✅ 安全:专用工作区
"args": ["...", "~/ai-workspace"]
写操作的确认机制
对于有副作用的写操作,建议在 Cline 中保留确认步骤(不设置 alwaysAllow):
Cline 想要执行:write_file
路径:/Users/yourname/ai-workspace/workspace/report.md
内容预览:
# 月度销售报告
...(显示完整内容)
[批准] [拒绝]
在 Claude Desktop 中,无法逐工具设置确认,但可以通过系统提示加限制:
系统提示(在 Claude Desktop 自定义提示中添加):
在写入任何文件之前,先告诉我你打算写入哪个路径和内容,
等待我确认后再执行。
临时文件和工作区清理
AI 工作时会产生临时文件,建议建立定期清理机制:
#!/bin/bash
# cleanup-ai-workspace.sh
WORKSPACE=~/ai-workspace/workspace/temp
# 删除 7 天前的临时文件
find "$WORKSPACE" -mtime +7 -type f -delete
find "$WORKSPACE" -empty -type d -delete
echo "清理完成:$(date)"
设置为定时任务(每天运行):
# crontab -e
0 2 * * * /Users/yourname/scripts/cleanup-ai-workspace.sh
文件操作的操作日志
在生产或团队场景,记录 AI 的文件操作日志:
# custom_audit_wrapper.py
# 包装 MCP 工具调用,记录到日志文件
import json
import datetime
def log_operation(tool_name: str, args: dict, result: str):
entry = {
"timestamp": datetime.datetime.now().isoformat(),
"tool": tool_name,
"args": args,
"result_summary": result[:200] # 只记录前200字符
}
with open("~/ai-workspace/audit.log", "a") as f:
f.write(json.dumps(entry, ensure_ascii=False) + "\n")
本节执行清单
- [ ] 创建
~/ai-workspace/{read-only,workspace,archive}三层目录结构 - [ ] 配置两个 MCP Server 实例(只读层 + 读写层)
- [ ] 检查 MCP 根目录配置,确认没有包含
~/.ssh、~/.aws等敏感路径 - [ ] 设置只读目录的 OS 权限(
chmod 555) - [ ] 建立临时文件的定期清理机制
下一节:脚本执行与沙箱设计