防止 Claude Code 外洩機密的 .env 設定指南(含完整配置)

@zodchiii
英語2 個月前 · 2026年4月30日
1.7M
1.3K
149
30
5.9K

TL;DR

學習如何透過設定 settings.json 拒絕規則、使用虛擬測試環境以及實作 pre-commit hooks,來保護 Claude Code 並防止敏感憑證外洩。

Claude Code 一打開你的專案,就會讀取你的 .env 檔案。

你的 API 金鑰、資料庫密碼、Stripe Token,所有在 .env 檔案裡的內容都會被載入記憶體,並可能出現在傳送到 Anthropic 伺服器的對話記錄中。

唯一能真正阻擋存取的,是 settings.json 裡的一行設定,而大多數人沒有設定它,甚至不知道它的存在。

以下是完整的安全設定 👇

在深入之前,我每天在 Telegram 頻道分享 AI 與 Vibe Coding 的筆記:**https://t.me/zodchixquant**🧠

darkzodchi on X — cover

為什麼 CLAUDE.md 規則無法保護你

大多數人在 CLAUDE.md 中加入「永遠不要讀取 .env 檔案」,就以為安全了(其實並沒有)

CLAUDE.md 只是建議。Claude 大部分時間會遵循,但在壓力下(複雜任務、長上下文、模糊指令),它可能會忽略建議性規則。

2026 年 4 月的一個 GitHub Issue 證實:即使 CLAUDE.md 明確禁止,Claude 仍然會讀取 .env 內容並將其帶入對話中。

唯一可靠的保護是在 settings.json 中設定拒絕規則。拒絕規則在系統層級強制執行,Claude 根本看不到檔案。

差別在於「請不要讀取這個」與「你根本無法讀取這個」。

darkzodchi - inline image

你的秘密洩漏的 3 種方式

問題不僅在於 Claude 直接讀取 .env。有三條路徑:

1. 直接檔案讀取。 Claude 掃描你的專案,打開 .env,內容就變成對話上下文的一部分。這是最明顯的,也是最容易用拒絕規則阻擋的。

2. 執行輸出擷取。 Claude 執行你的測試或啟動你的應用程式。一次失敗的 HTTP 請求會記錄完整的 Authorization: Bearer sk-live-abc123... 標頭。一次資料庫超時會傾印包含密碼的連線字串。Claude 會擷取所有指令輸出。你的秘密現在就在對話中,即使 Claude 從未打開 .env。

3. Grep 與搜尋工具。 Claude 使用 grep 搜尋你的程式碼庫以尋找函式名稱。搜尋結果命中了一個包含憑證的設定檔。grep 輸出會顯示包含你的秘密的匹配行。

大多數人只防範路徑 1。路徑 2 和 3 才是真正造成損害的地方。

真正有效的拒絕規則

將以下內容加入 ~/.claude/settings.json,以獲得跨所有專案的全局保護:

json

json
1{
2 "permissions": {
3 "deny": [
4 "Read(**/.env*)",
5 "Read(**/.dev.vars*)",
6 "Read(**/*.pem)",
7 "Read(**/*.key)",
8 "Read(**/secrets/**)",
9 "Read(**/credentials/**)",
10 "Read(**/.aws/**)",
11 "Read(**/.ssh/**)",
12 "Read(**/config/database.yml)",
13 "Read(**/config/credentials.json)",
14 "Read(**/.npmrc)",
15 "Read(**/.pypirc)",
16 "Write(**/.env*)",
17 "Write(**/secrets/**)",
18 "Write(**/.ssh/**)"
19 ]
20 }
21}

這會阻止 Claude 讀取或寫入任何 .env 檔案、PEM 金鑰、SSH 金鑰、AWS 設定、憑證檔案以及 npm/PyPI Token。** 萬用字元表示它適用於你專案中的每個子目錄。

阻擋執行時洩漏

拒絕規則能阻止直接檔案讀取,但無法阻止執行輸出。為此,請使用包含虛擬值的測試專用 .env 檔案:

text
1# .env.test — 安全可讀,洩漏也無妨
2STRIPE_SECRET_KEY=sk_test_not_a_real_key
3DATABASE_URL=postgres://test:test@localhost:5432/testdb
4OPENAI_API_KEY=sk-test-dummy-key-for-mocking
5AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
6AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

將你的測試框架指向 .env.test 而非 .env。這樣當 Claude 執行你的測試並擷取輸出時,唯一可見的金鑰都是虛擬的。

能捕捉一切的 Pre-commit Hook

即使有拒絕規則,錯誤仍可能發生。加入一個 git pre-commit hook,在每次提交到達你的儲存庫之前掃描秘密:

bash

bash
1#!/bin/bash
2# .git/hooks/pre-commit — 阻止包含秘密的提交
3
4PATTERNS=(
5 'sk-ant-' # Anthropic API 金鑰
6 'sk-live-' # Stripe 正式金鑰
7 'sk_live_' # Stripe 正式金鑰(另一格式)
8 'ghp_' # GitHub 個人 Token
9 'gho_' # GitHub OAuth Token
10 'AKIA' # AWS 存取金鑰
11 'xox[bpors]-' # Slack Token
12 'SG\.' # SendGrid 金鑰
13 'eyJ' # JWT
14 'BEGIN.*PRIVATE KEY' # 私鑰內容
15)
16
17BLOCKED_FILES=('.env' 'credentials.json' 'id_rsa' '*.pem' '*.key')
18
19for pattern in "${PATTERNS[@]}"; do
20 if git diff --cached --diff-filter=ACM | grep -qE "$pattern"; then
21 echo "已阻擋:發現可能符合 '$pattern' 的秘密"
22 echo "請移除秘密後再試。"
23 exit 1
24 fi
25done
26
27for file in "${BLOCKED_FILES[@]}"; do
28 if git diff --cached --name-only | grep -q "$file"; then
29 echo "已阻擋:嘗試提交敏感檔案:$file"
30 exit 1
31 fi
32done
33
34echo "Pre-commit 安全檢查通過。"
35exit 0

讓它可執行:chmod +x .git/hooks/pre-commit

這會捕捉 Anthropic API 金鑰、Stripe 金鑰、GitHub Token、AWS 金鑰、Slack Token、SendGrid 金鑰、JWT 以及私鑰內容。如果這些內容出現在暫存檔案中,提交就會被阻止。

容器隔離(終極方案)

為了最高安全性,在容器內執行 Claude Code,讓 .env 檔案根本不存在:

bash

bash
1# 將 /dev/null 掛載到 .env 上,讓 Claude 看不到它
2docker run -v /dev/null:/app/.env:ro your-dev-container

從 Claude 的角度來看,.env 是一個空檔案。你的秘密永遠不會進入容器檔案系統。這對大多數專案來說有點過頭,但對於處理正式環境憑證的客戶專案來說是必要的。

完整安全設定(可直接複製貼上)

完整的 ~/.claude/settings.json,包含所有安全保護:

json

json
1{
2 "permissions": {
3 "allow": [
4 "Read",
5 "Glob",
6 "Grep",
7 "LS",
8 "Edit",
9 "MultiEdit",
10 "Write(src/**)",
11 "Write(tests/**)",
12 "Bash(npm run *)",
13 "Bash(npm test *)",
14 "Bash(npx tsc *)",
15 "Bash(git status)",
16 "Bash(git diff *)",
17 "Bash(git log *)",
18 "Bash(git add *)",
19 "Bash(git commit *)"
20 ],
21 "deny": [
22 "Read(**/.env*)",
23 "Read(**/.dev.vars*)",
24 "Read(**/*.pem)",
25 "Read(**/*.key)",
26 "Read(**/secrets/**)",
27 "Read(**/credentials/**)",
28 "Read(**/.aws/**)",
29 "Read(**/.ssh/**)",
30 "Read(**/config/database.yml)",
31 "Read(**/config/credentials.json)",
32 "Read(**/.npmrc)",
33 "Read(**/.pypirc)",
34 "Write(**/.env*)",
35 "Write(**/secrets/**)",
36 "Write(**/.ssh/**)",
37 "Write(.github/workflows/*)",
38 "Bash(rm -rf *)",
39 "Bash(sudo *)",
40 "Bash(git push *)",
41 "Bash(npm publish *)",
42 "Bash(curl * | sh)",
43 "Bash(wget *)",
44 "Bash(chmod *)"
45 ],
46 "defaultMode": "acceptEdits"
47 }
48}

這是我上一篇文章中的 settings.json,再加上本文的所有安全規則。允許規則用於日常工作流程,拒絕規則用於保護秘密和危險操作。一個檔案,完整保護。

檢查清單

在你下一次使用 Claude Code 之前:

  1. 你的 settings.json 中是否有針對 .env 檔案的拒絕規則?
  1. 你的測試是否使用包含虛擬值的 .env.test?
  1. 是否有 pre-commit hook 掃描秘密模式?
  1. 正式環境憑證是否存放在保險庫中,而非純文字檔案?
  1. .env 是否在你的 .gitignore 中?
  1. 為了額外安全,.env 檔案是否放在你的專案目錄之外?

如果你勾選了全部 6 項,你的秘密就得到了最大程度的保護。如果你勾選了 0 項,那麼你離你的 API 金鑰出現在 Anthropic 伺服器上的對話記錄中,只差一個模糊的 Claude 提示。

我每天在 Telegram 頻道分享 AI、金融與 Vibe Coding 的筆記:**https://t.me/zodchixquant**

感謝閱讀🙏🏼

darkzodchi - inline image
存到 YouMind

使用 YouMind 深度閱讀爆款文章

保存原文、追問細節、總結觀點,並在一個 AI 工作空間裡把爆款文章沉澱成可複用筆記。

了解 YouMind

更多可拆解樣本

近期爆款文章

探索更多爆款文章