默认能读,不等于应该读
把 Claude Code 放进真实项目后,很多人会先写一份 .claudeignore,以为密钥文件就安全了。实际常见情况是:
- Read 工具默认能打开
.env:模型要「看一眼配置」时,敏感行可能直接进上下文。 .claudeignore主要管索引/忽略范围:它并不等价于「禁止 Read」;忽略了,仍可能被显式读取。- 口头叮嘱不可靠:聊天里说「别读密钥」,上下文一压缩,约定就可能不在眼前。
- 笔记本合盖就断:规则写到一半、验证做到一半,机器睡了或断线,配置没落稳。
要把「不能读」写成硬规则,并放在一台常开的新加坡 Mac mini 上长期生效。
准备清单
- 一台常开的 Mac mini(整机独享),已装好 Claude Code 并用你自己的账号登录
- 一个真实项目目录,内含
.env、.env.local或secrets/等敏感路径(先备份,再做实验) - 远程方式:SSH 用来改配置、看日志;UU 远程连接用来处理需要图形界面的操作
- 建议先在有人看着时验证 deny 生效,再放过夜任务
步骤一:先确认「默认能读」这件事
在项目根目录故意放一个不含真实密钥的练习文件,例如 .env.example 或 secrets/demo.txt,内容写假值。打开 Claude Code,让它「读取项目环境相关文件并摘要」。若它能读到假值,就说明:默认读取路径比你以为的宽。
再试一次:把同一路径写进 .claudeignore,重启会话后再让它显式 Read。很多环境下你会发现——忽略文件挡不住这次读取。结论先记下来:要挡 Read,靠的是权限 deny,不是 ignore 列表。
步骤二:用 .claude/settings.json 写 deny
Claude Code 的权限规则常见放在三处:用户级 ~/.claude/settings.json、项目级 .claude/settings.json(可随仓库共享)、本机专用 .claude/settings.local.json(不提交)。密钥相关建议写在本机专用或用户级,避免把本机路径策略误提交到公开仓库。
一个偏保守的起点(路径按你的仓库结构改):
``json { "permissions": { "deny": [ "Read(./.env)", "Read(./.env.*)", "Read(./secrets/)", "Read(~/.ssh/)", "Read(~/.aws/**)", "Bash(cat .env*)", "Bash(printenv*)" ] } } ``
要点:
Read(...)挡文件工具;同时挡常见「用 Bash 绕过」的读法(cat、printenv等),按你团队习惯补充。- 通配要够宽:
.env.*、secrets/**比只拦一个文件名稳。 - 在 Claude Code 里输入
/permissions,确认 deny 已生效。 - 故意让它再读练习文件:应被拒绝或无法带出内容。若仍能读到,检查规则写在哪一层、是否被更宽的 allow 盖住,以及版本差异。
步骤三(可选):用 hook 在进模型前再挡一层
deny 负责「别读」。若你仍担心某次工具输出里夹带了假密钥形态的字符串,可以加 PreToolUse / 相关 hook:在工具结果进模型前跑一小段脚本,匹配到 API_KEY=、SECRET= 一类模式就改写或直接以退出码拦截。hook 的输入字段与登记方式以官方文档为准;脚本放在本机(例如 ~/.claude/hooks/redact-secrets.sh),chmod +x 后在 settings 里登记。
hook 是补充,不是替代:
- 第一道:deny 禁止读敏感路径
- 第二道:hook 拦截可疑命令或遮盖输出
- 第三道:项目约定——真实密钥不进仓库、不进聊天粘贴板
改完后先手动触发一次读敏感路径、一次无害读源码,确认拦截与放行都符合预期,再交给长任务。
步骤四:把规则留在常开的新加坡 Mac mini 上
deny 与 hook 写在笔记本上,合盖或换机就容易丢、难复现。更稳的做法是:
- 整机独享的新加坡 Mac mini 常开,Claude Code、settings、hook 脚本都装在这台机器上。
- 长会话放
tmux:SSH 断线后tmux attach回到现场;规则已在机器上,不必每次重配。 - 用 UU 远程连接处理图形界面(系统设置、钥匙串提示等);日常改配置、看日志用 SSH 即可。
- 每台机器有自己的固定专属地址,浏览器即可 SSH / VNC;不要把密钥写进可公开传播的示例地址里。
这样你在外面重连时,看到的是同一套已经验证过的 deny 规则,而不是「这台电脑忘了写、那台电脑写了一半」。
建议验收清单
/permissions能看到针对.env、secrets/**等的 deny。- 练习文件(假值)被显式
Read时失败或无内容;无害源码仍可读。 - 用 Bash 绕读(如
cat .env)也被拦下(若你写了对应 deny)。 - 仅靠
.claudeignore不能替代上述结果——你已用实验验证过。 - 合上远程连接再连回来,规则仍在;
tmux里的 Claude Code 会话可接回。 - 仓库里没有真实密钥;settings.local 与 hook 未误提交到公开远程。
和 SgRent 怎么配合
若你需要一台一直开着、整机独享的新加坡 Mac mini,把 Claude Code 的 deny 规则与 hook 长期留在机器上,出门用 UU 远程连接或 SSH 接回:SgRent(Zumac.Ai)提供整机租用 ¥799/月起、自有设备托管 ¥299/月起;季付、半年付、年付有折扣。订购与开通走 panel.zumac.ai;方案说明见 首页费用区;使用问题见 帮助中心。需要人工协助可联系 Telegram @singatao。
先把「不能读密钥」写成 deny,再放到常开机器上跑稳——比每次靠聊天叮嘱可靠得多。
前往 panel.zumac.ai 订购 → · 查看方案与费用 · 帮助中心
