การตั้งค่า .env เพื่อป้องกัน Claude Code ไม่ให้ทำข้อมูลลับรั่วไหล (พร้อมการตั้งค่าฉบับเต็ม)

การตั้งค่า .env เพื่อป้องกัน Claude Code ไม่ให้ทำข้อมูลลับรั่วไหล (พร้อมการตั้งค่าฉบับเต็ม)

@zodchiii
อังกฤษ2 สัปดาห์ที่ผ่านมา · 30 เม.ย. 2569

AI features

1.7M
1.3K
149
30
5.9K

TL;DR

เรียนรู้วิธีรักษาความปลอดภัยให้กับ Claude Code ด้วยการกำหนดค่ากฎ deny ใน settings.json การใช้สภาพแวดล้อมทดสอบจำลอง และการใช้ pre-commit hooks เพื่อป้องกันการรั่วไหลของข้อมูลรับรองที่สำคัญ

Claude Code จะอ่านไฟล์ .env ของคุณทันทีที่เปิดโปรเจกต์ของคุณ

คีย์ API, รหัสผ่านฐานข้อมูล, โทเค็น Stripe, ทุกอย่างในไฟล์ .env จะถูกโหลดเข้าสู่หน่วยความจำและอาจไปอยู่ในบันทึกการสนทนาที่ส่งไปยังเซิร์ฟเวอร์ของ Anthropic

สิ่งเดียวที่ป้องกันการเข้าถึงได้จริงคือบรรทัดเดียวใน settings.json ซึ่งคนส่วนใหญ่ไม่มีและไม่รู้เกี่ยวกับมัน

นี่คือการตั้งค่าความปลอดภัยแบบเต็ม 👇

ก่อนที่เราจะลงลึก ฉันแชร์โน้ตรายวันเกี่ยวกับ AI และการเขียนโค้ดแบบ Vibe Coding ในช่อง Telegram ของฉัน: **https://t.me/zodchixquant**🧠

darkzodchi on X — cover

ทำไมกฎใน CLAUDE.md ถึงไม่ปกป้องคุณ

คนส่วนใหญ่เพิ่มคำสั่ง "ห้ามอ่านไฟล์ .env" ลงใน CLAUDE.md และคิดว่าปลอดภัย (แต่ไม่ใช่)

CLAUDE.md เป็นเพียงคำแนะนำ โดยปกติ Claude จะทำตาม แต่ภายใต้ความกดดัน (งานที่ซับซ้อน, บริบทที่ยาว, คำแนะนำที่คลุมเครือ) มันสามารถและมักจะเพิกเฉยต่อกฎที่แนะนำ

Issue บน GitHub จากเดือนเมษายน 2026 ยืนยันว่า: Claude อ่านและสะท้อนเนื้อหา .env ลงในการสนทนาแม้ว่า CLAUDE.md จะห้ามไว้อย่างชัดเจน

การป้องกันที่เชื่อถือได้เพียงอย่างเดียวคือกฎ deny ใน settings.json กฎ deny จะถูกบังคับใช้ในระดับระบบก่อนที่ Claude จะเห็นไฟล์ด้วยซ้ำ

ความแตกต่างระหว่าง "กรุณาอย่าอ่านสิ่งนี้" กับ "คุณไม่สามารถอ่านสิ่งนี้ได้จริงๆ"

darkzodchi - inline image

3 วิธีที่ความลับของคุณรั่วไหล

ไม่ใช่แค่ Claude อ่าน .env โดยตรงเท่านั้น มีสามเส้นทาง:

1. การอ่านไฟล์โดยตรง Claude สแกนโปรเจกต์ของคุณ เปิด .env และเนื้อหาจะกลายเป็นส่วนหนึ่งของบริบทการสนทนา นี่เป็นวิธีที่ชัดเจนที่สุดและง่ายที่สุดในการบล็อกด้วยกฎ deny

2. การจับเอาต์พุตขณะรันไทม์ Claude รันการทดสอบหรือเริ่มแอปของคุณ คำขอ HTTP ที่ล้มเหลวจะบันทึกส่วนหัว Authorization: Bearer sk-live-abc123... ทั้งหมด การหมดเวลาของฐานข้อมูลจะถ่ายโอนสตริงการเชื่อมต่อพร้อมรหัสผ่าน Claude จับเอาต์พุตคำสั่งทั้งหมด ความลับของคุณอยู่ในบทสนทนาแล้ว แม้ว่า Claude จะไม่เคยเปิด .env

3. เครื่องมือ Grep และค้นหา Claude ใช้ grep เพื่อค้นหาโค้ดเบสของคุณเพื่อหาชื่อฟังก์ชัน การค้นหาไปถึงไฟล์คอนฟิกที่มีข้อมูลรับรอง เอาต์พุตของ grep รวมถึงบรรทัดที่ตรงกันพร้อมความลับของคุณที่มองเห็นได้

คนส่วนใหญ่ป้องกันเฉพาะเส้นทางที่ 1 เส้นทางที่ 2 และ 3 คือจุดที่ความเสียหายจริงเกิดขึ้น

กฎ deny ที่ใช้งานได้จริง

เพิ่มสิ่งเหล่านี้ลงใน ~/.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 ไวด์การ์ด \\ หมายถึงใช้กับทุกไดเรกทอรีย่อยในโปรเจกต์ของคุณ

การบล็อกรั่วไหลขณะรันไทม์

กฎ deny หยุดการอ่านไฟล์โดยตรงแต่ไม่หยุดเอาต์พุตขณะรันไทม์ สำหรับสิ่งนั้น ให้ใช้ไฟล์ .env เฉพาะการทดสอบที่มีค่าจำลอง:

text
1# .env.test — safe to read, safe to leak
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 ที่จับทุกอย่าง

แม้จะมีกฎ deny ความผิดพลาดก็เกิดขึ้นได้ เพิ่ม git pre-commit hook ที่สแกนหาความลับก่อนที่ commit ใดๆ จะถึง repo ของคุณ:

bash

bash
1#!/bin/bash
2# .git/hooks/pre-commit — บล็อก commit ที่มีความลับ
3
4PATTERNS=(
5 'sk-ant-' # คีย์ API ของ Anthropic
6 'sk-live-' # คีย์สดของ Stripe
7 'sk_live_' # คีย์สดของ Stripe (รูปแบบอื่น)
8 'ghp_' # โทเค็นส่วนตัวของ GitHub
9 'gho_' # โทเค็น OAuth ของ GitHub
10 'AKIA' # คีย์เข้าถึง AWS
11 'xox[bpors]-' # โทเค็น Slack
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 "BLOCKED: Found potential secret matching '$pattern'"
22 echo "Remove the secret and try again."
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 "BLOCKED: Attempted to commit sensitive file: $file"
30 exit 1
31 fi
32done
33
34echo "Pre-commit security check passed."
35exit 0

ทำให้สามารถเรียกใช้งานได้: chmod +x .git/hooks/pre-commit

วิธีนี้จะจับคีย์ API ของ Anthropic, คีย์ Stripe, โทเค็น GitHub, คีย์ AWS, โทเค็น Slack, คีย์ SendGrid, JWT และเนื้อหาคีย์ส่วนตัว หากสิ่งเหล่านี้ปรากฏในไฟล์ที่ถูก stage commit จะถูกบล็อก

การแยกคอนเทนเนอร์ (ทางเลือกสุดท้าย)

เพื่อความปลอดภัยสูงสุด ให้รัน Claude Code ภายในคอนเทนเนอร์ที่ไม่มีไฟล์ .env อยู่จริง:

bash

bash
1# Mount /dev/null over .env so Claude can't see it
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 จากบทความก่อนหน้าของฉันบวกกับกฎความปลอดภัยทุกข้อจากบทความนี้ กฎ allow สำหรับเวิร์กโฟลว์ประจำวัน กฎ deny สำหรับความลับและการดำเนินการที่อันตราย ไฟล์เดียว ป้องกันเต็มที่

รายการตรวจสอบ

ก่อนเซสชัน Claude Code ครั้งต่อไปของคุณ:

  1. คุณมีกฎ deny สำหรับไฟล์ .env ใน settings.json หรือไม่?
  1. การทดสอบของคุณใช้ .env.test ที่มีค่าจำลองหรือไม่?
  1. มี pre-commit hook ที่สแกนหารูปแบบความลับหรือไม่?
  1. ข้อมูลรับรองการผลิตถูกเก็บใน vault ไม่ใช่ไฟล์ plaintext หรือไม่?
  1. .env อยู่ใน .gitignore ของคุณหรือไม่?
  1. ไฟล์ .env อยู่นอกไดเรกทอรีโปรเจกต์ของคุณเพื่อความปลอดภัยเพิ่มเติมหรือไม่?

ถ้าคุณตรวจสอบครบทั้ง 6 ข้อ ความลับของคุณได้รับการปกป้องมากที่สุดเท่าที่จะทำได้ ถ้าคุณตรวจสอบ 0 ข้อ คุณอยู่ห่างจากคำสั่ง Claude ที่คลุมเครือเพียงหนึ่งครั้งก่อนที่คีย์ API ของคุณจะปรากฏในบันทึกการสนทนาบนเซิร์ฟเวอร์ของ Anthropic

ฉันแชร์โน้ตรายวันเกี่ยวกับ AI, การเงิน และการเขียนโค้ดแบบ Vibe Coding ในช่อง Telegram ของฉัน: **https://t.me/zodchixquant**

ขอบคุณที่อ่าน🙏🏼

darkzodchi - inline image

More patterns to decode

Recent viral articles

Explore more viral articles

สร้างมาเพื่อครีเอเตอร์

หาไอเดียจากบทความไวรัลบน 𝕏 ถอดรหัสว่าทำไมถึงปัง แล้วเปลี่ยนแพตเทิร์นเหล่านั้นเป็นหัวข้อคอนเทนต์ถัดไปของคุณ