
การตั้งค่า .env เพื่อป้องกัน Claude Code ไม่ให้ทำข้อมูลลับรั่วไหล (พร้อมการตั้งค่าฉบับเต็ม)
AI features
- Views
- 1.7M
- Likes
- 1.3K
- Reposts
- 149
- Comments
- 30
- Bookmarks
- 5.9K
TL;DR
เรียนรู้วิธีรักษาความปลอดภัยให้กับ Claude Code ด้วยการกำหนดค่ากฎ deny ใน settings.json การใช้สภาพแวดล้อมทดสอบจำลอง และการใช้ pre-commit hooks เพื่อป้องกันการรั่วไหลของข้อมูลรับรองที่สำคัญ
Reading the ไทย translation
Claude Code จะอ่านไฟล์ .env ของคุณทันทีที่เปิดโปรเจกต์ของคุณ
คีย์ API, รหัสผ่านฐานข้อมูล, โทเค็น Stripe, ทุกอย่างในไฟล์ .env จะถูกโหลดเข้าสู่หน่วยความจำและอาจไปอยู่ในบันทึกการสนทนาที่ส่งไปยังเซิร์ฟเวอร์ของ Anthropic
สิ่งเดียวที่ป้องกันการเข้าถึงได้จริงคือบรรทัดเดียวใน settings.json ซึ่งคนส่วนใหญ่ไม่มีและไม่รู้เกี่ยวกับมัน
นี่คือการตั้งค่าความปลอดภัยแบบเต็ม 👇
ก่อนที่เราจะลงลึก ฉันแชร์โน้ตรายวันเกี่ยวกับ AI และการเขียนโค้ดแบบ Vibe Coding ในช่อง Telegram ของฉัน: **https://t.me/zodchixquant**🧠

ทำไมกฎใน CLAUDE.md ถึงไม่ปกป้องคุณ
คนส่วนใหญ่เพิ่มคำสั่ง "ห้ามอ่านไฟล์ .env" ลงใน CLAUDE.md และคิดว่าปลอดภัย (แต่ไม่ใช่)
CLAUDE.md เป็นเพียงคำแนะนำ โดยปกติ Claude จะทำตาม แต่ภายใต้ความกดดัน (งานที่ซับซ้อน, บริบทที่ยาว, คำแนะนำที่คลุมเครือ) มันสามารถและมักจะเพิกเฉยต่อกฎที่แนะนำ
Issue บน GitHub จากเดือนเมษายน 2026 ยืนยันว่า: Claude อ่านและสะท้อนเนื้อหา .env ลงในการสนทนาแม้ว่า CLAUDE.md จะห้ามไว้อย่างชัดเจน
การป้องกันที่เชื่อถือได้เพียงอย่างเดียวคือกฎ deny ใน settings.json กฎ deny จะถูกบังคับใช้ในระดับระบบก่อนที่ Claude จะเห็นไฟล์ด้วยซ้ำ
ความแตกต่างระหว่าง "กรุณาอย่าอ่านสิ่งนี้" กับ "คุณไม่สามารถอ่านสิ่งนี้ได้จริงๆ"

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
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 เฉพาะการทดสอบที่มีค่าจำลอง:
1# .env.test — safe to read, safe to leak2STRIPE_SECRET_KEY=sk_test_not_a_real_key3DATABASE_URL=postgres://test:test@localhost:5432/testdb4OPENAI_API_KEY=sk-test-dummy-key-for-mocking5AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE6AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
ชี้เฟรมเวิร์กการทดสอบของคุณไปที่ .env.test แทน .env ตอนนี้เมื่อ Claude รันการทดสอบและจับเอาต์พุต คีย์ที่มองเห็นได้จะเป็นเพียงคีย์จำลองเท่านั้น
Pre-commit hook ที่จับทุกอย่าง
แม้จะมีกฎ deny ความผิดพลาดก็เกิดขึ้นได้ เพิ่ม git pre-commit hook ที่สแกนหาความลับก่อนที่ commit ใดๆ จะถึง repo ของคุณ:
bash
1#!/bin/bash2# .git/hooks/pre-commit — บล็อก commit ที่มีความลับ34PATTERNS=(5 'sk-ant-' # คีย์ API ของ Anthropic6 'sk-live-' # คีย์สดของ Stripe7 'sk_live_' # คีย์สดของ Stripe (รูปแบบอื่น)8 'ghp_' # โทเค็นส่วนตัวของ GitHub9 'gho_' # โทเค็น OAuth ของ GitHub10 'AKIA' # คีย์เข้าถึง AWS11 'xox[bpors]-' # โทเค็น Slack12 'SG\.' # คีย์ SendGrid13 'eyJ' # JWT14 'BEGIN.*PRIVATE KEY' # เนื้อหาคีย์ส่วนตัว15)1617BLOCKED_FILES=('.env' 'credentials.json' 'id_rsa' '*.pem' '*.key')1819for pattern in "${PATTERNS[@]}"; do20 if git diff --cached --diff-filter=ACM | grep -qE "$pattern"; then21 echo "BLOCKED: Found potential secret matching '$pattern'"22 echo "Remove the secret and try again."23 exit 124 fi25done2627for file in "${BLOCKED_FILES[@]}"; do28 if git diff --cached --name-only | grep -q "$file"; then29 echo "BLOCKED: Attempted to commit sensitive file: $file"30 exit 131 fi32done3334echo "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
1# Mount /dev/null over .env so Claude can't see it2docker run -v /dev/null:/app/.env:ro your-dev-container
จากมุมมองของ Claude .env เป็นไฟล์ว่างเปล่า ความลับของคุณไม่เคยเข้าสู่ระบบไฟล์ของคอนเทนเนอร์ วิธีนี้มากเกินไปสำหรับโปรเจกต์ส่วนใหญ่ แต่จำเป็นสำหรับงานของลูกค้าที่มีข้อมูลรับรองการผลิต
การตั้งค่าความปลอดภัยแบบเต็ม (พร้อมคัดลอกและวาง)
~/.claude/settings.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 ครั้งต่อไปของคุณ:
- คุณมีกฎ deny สำหรับไฟล์ .env ใน settings.json หรือไม่?
- การทดสอบของคุณใช้ .env.test ที่มีค่าจำลองหรือไม่?
- มี pre-commit hook ที่สแกนหารูปแบบความลับหรือไม่?
- ข้อมูลรับรองการผลิตถูกเก็บใน vault ไม่ใช่ไฟล์ plaintext หรือไม่?
- .env อยู่ใน .gitignore ของคุณหรือไม่?
- ไฟล์ .env อยู่นอกไดเรกทอรีโปรเจกต์ของคุณเพื่อความปลอดภัยเพิ่มเติมหรือไม่?
ถ้าคุณตรวจสอบครบทั้ง 6 ข้อ ความลับของคุณได้รับการปกป้องมากที่สุดเท่าที่จะทำได้ ถ้าคุณตรวจสอบ 0 ข้อ คุณอยู่ห่างจากคำสั่ง Claude ที่คลุมเครือเพียงหนึ่งครั้งก่อนที่คีย์ API ของคุณจะปรากฏในบันทึกการสนทนาบนเซิร์ฟเวอร์ของ Anthropic
ฉันแชร์โน้ตรายวันเกี่ยวกับ AI, การเงิน และการเขียนโค้ดแบบ Vibe Coding ในช่อง Telegram ของฉัน: **https://t.me/zodchixquant**
ขอบคุณที่อ่าน🙏🏼



