装 MCP、配网关、把 Claude Code 挂在常开机器上之后,很多人会默认「能跑就行」。问题是:网关后面可能还挂着你以为关掉了的 MCP;本机若干凭证文件可能被 Claude Code 无额外提示直接读到;启动参数里若写过 API Key,进程列表一眼就能看见。mcp-audit 一类体检工具正是冲着这几层来的——不是吓人,而是把「看不见的暴露面」摊开,方便你按清单收。
本文在新加坡 Mac mini 上给出一份可重复的凭证卫生清单:定位 MCP 配置 → 核可无提示读取的凭证文件 → 扫启动参数里的密钥 → 了解组织下发的 MCP 策略会拦什么 → 再做加固。Claude 账号请使用你自己的;机器侧只提供稳定合规的使用环境。
为什么常开 Mac mini 要把这件事抬高
笔记本合盖就断,暴露窗口相对短。常开整机上的 Claude Code 会话、MCP 子进程、tmux 里挂着的脚本会连续跑几天甚至几周:
- MCP 一旦连上,工具描述与部分资源会进入代理上下文,多余的服务器等于多余的攻击面。
- 凭证文件若对当前用户可读,代理在「读文件」类能力打开时,不一定每次都弹确认——取决于你的权限模式与 deny 规则。
- 启动参数、环境变量、
.mcp.json里的明文 Token,会出现在进程列表、崩溃日志或备份里。
所以目标不是承诺「万无一失」,而是:定期用同一份清单确认「本机到底开了哪些 MCP、哪些文件默认可读、参数里有没有密钥」,并把结果落盘,方便对比。
第一步:列出本机 MCP 配置落点
用 UU 远程连接或 SSH 登入新加坡 Mac mini 后,先找配置,而不是先装新工具:
# 用户级与项目级常见落点(按你实际安装路径微调)
ls -la ~/.claude/ 2>/dev/null
ls -la .mcp.json ./mcp.json 2>/dev/null
find ~ -maxdepth 3 -name '.mcp.json' 2>/dev/null
claude mcp list 2>/dev/null || true
把输出记到 ~/security-audits/mcp-$(date +%F).txt。重点看:
- 启用了哪些 server:名字、命令、是否指向网关/代理进程。
- 网关后是否还有隐藏 MCP:有人只记「前端网关开着」,忘了网关后面还挂着数据库、浏览器、支付类 server。
- 项目级是否覆盖用户级:仓库里的
.mcp.json可能被同事或模板带进来,未必是你本意。
不需要的 server 先禁用或删除配置,再开 Claude Code;少一个 MCP,就少一段进上下文的工具说明。
第二步:核「无提示可读」的凭证文件
审计类工具常会报告:某些路径对当前用户可读,Claude Code 在对应权限模式下可以读到内容而不再次弹窗。你不必依赖某一款工具的品牌,本机也能先做只读盘点:
# 常见敏感落点(存在才检查权限)
for f in \
~/.claude/.credentials.json \
~/.claude.json \
~/.claude/settings.json \
~/.config/*/credentials* \
~/.ssh/id_* \
~/.npmrc \
~/.netrc \
~/.aws/credentials \
~/.config/gcloud/application_default_credentials.json
do
[ -e "$f" ] || continue
ls -la "$f"
done
解读原则:
- 权限过宽(例如对 group/other 可读)→ 先收紧到仅本人可读:
chmod 600(对私钥类文件尤其重要)。 - 工作目录里的明文 Key /
.env副本 → 移出仓库树,或确保已被 deny 规则挡住;不要指望「代理不会主动去翻」。 - 备份与同步目录(Time Machine 排除列表、云同步文件夹)→ 确认凭证文件没有被同步到你不打算给代理看的位置。
把「路径 + 权限位 + 是否仍需要」写进同一份审计日志。若某工具明确标出「Claude Code 可无提示读取」,优先用 hooks / deny 规则收紧读路径,而不是只口头提醒自己。
第三步:扫启动参数与进程环境里的密钥
MCP server 或辅助进程若这样启动:
# 反例:Key 写在 argv 里,ps 就能看见
some-mcp-server --api-key sk-example-do-not-use
则 ps aux、监控面板、甚至崩溃报告都可能带出密钥。改为:
# 正例:从环境或钥匙串注入,不进 argv
export MCP_API_KEY="$(security find-generic-password -s 'mcp-api' -w)"
some-mcp-server # 进程内读 MCP_API_KEY
自检:
# 粗扫:命令行里是否出现 key / token / secret 字样(按需收紧正则)
ps auxww | rg -i 'api[_-]?key|token|secret|password' || true
发现命中后:立刻轮换该密钥,改启动方式,并检查 shell 历史 / launchd plist / 定时脚本是否也写了明文。环境变量文件(如 ~/.claude-ops/secrets.env)权限同样应是 600,且不要 source 进会同步到公开仓库的脚本。
第四步:了解组织下发的 MCP 策略会拦什么
团队或集中管理的策略有时会限制:
- 允许加载的 MCP 白名单;
- 禁止的工具名或危险能力;
- 某些路径的自动批准 / 强制 deny。
在个人常开机器上,即便暂时没有组织策略,也应自建等价纪律:
- 在
settings/ hooks 里维护 MCP 与敏感路径的 deny 列表。 - 升级 Claude Code 后复查:允许列表、环境变量覆盖、新版本默认权限是否被改宽。
- 把「策略期望」写成
CLAUDE.md里的一两句硬规则,例如:禁止把生产密钥放进工作目录;禁止在 MCP 启动参数写 Key。
策略文档是「期望」;本机 claude mcp list + 权限位 + ps 才是「现状」。两边不一致时,以现状为准去改配置。
第五步:加固清单(做完再开长会话)
按顺序勾选:
- 删/停未用 MCP,网关后的隐藏 server 一并清掉。
- 凭证文件
chmod 600,私钥更严;工作区.env移出或进 deny。 - 密钥进钥匙串或权限收紧的 env 文件,永不进 argv、不进 git。
- 轮换已暴露过的 Key(只要出现在日志、截图、ps 输出里,就当已泄露)。
- 留下带日期的审计日志,系统更新或新装 MCP 后重跑。
可选:把上述命令收进 ~/claude-ops/mcp-audit/check.sh,每周或新装 server 后执行一次,输出 tee 到 ~/security-audits/。
为什么适合放在 Zumac.Ai 的新加坡 Mac mini
凭证卫生靠的是同一台机器、同一份清单、前后可对比的日志。笔记本换网络、换用户目录、随手装插件,MCP 与密钥落点很容易漂;把 Claude Code、MCP 配置和审计脚本固定在新加坡 Mac mini 上,用 UU 远程连接或 SSH 回去跑同一份 check.sh,对比成本最低。
Zumac.Ai 提供新加坡 Mac mini M6 整机独享,适合长期挂着编码代理与这类安全体检。实际延迟取决于你本地的网络线路。
新客户整机租用 ¥999/月(季付 ¥2,697.30,半年付 6 送 1 ¥5,994,年付 12 送 2 ¥11,988);已购买客户续费保持原价。新客户首单自审核开通当天起租,续费及老客户新订单自付款当天起租。
账号始终是你自己的 Claude 账号;机器侧只提供稳定合规的使用环境,不涉及账号共享或转售。需要咨询可联系 Telegram @singatao,或查看 方案与费用。
