
Thiết lập .env giúp ngăn chặn Claude Code làm lộ thông tin bảo mật của bạn (Bao gồm cấu hình đầy đủ)
AI features
- Views
- 1.7M
- Likes
- 1.3K
- Reposts
- 149
- Comments
- 30
- Bookmarks
- 5.9K
TL;DR
Tìm hiểu cách bảo mật Claude Code bằng cách định cấu hình các quy tắc từ chối trong settings.json, sử dụng môi trường thử nghiệm giả lập và triển khai các pre-commit hook để ngăn chặn việc rò rỉ thông tin xác thực nhạy cảm.
Reading the TIẾNG VIỆT translation
Claude Code đọc file .env của bạn ngay khi mở dự án.
Các API key, mật khẩu cơ sở dữ liệu, token Stripe, mọi thứ trong file .env đều được nạp vào bộ nhớ và có thể xuất hiện trong nhật ký hội thoại gửi đến máy chủ của Anthropic.
Thứ duy nhất thực sự chặn quyền truy cập là một dòng trong settings.json, mà hầu hết mọi người không có và cũng không biết đến.
Đây là cấu hình bảo mật đầy đủ 👇
Trước khi đi sâu, tôi chia sẻ ghi chú hàng ngày về AI & vibe coding trong kênh Telegram của mình: **https://t.me/zodchixquant**🧠

Tại sao quy tắc CLAUDE.md không bảo vệ bạn
Hầu hết mọi người thêm "không bao giờ đọc file .env" vào CLAUDE.md và cho rằng mình an toàn (thực tế không phải vậy)
CLAUDE.md chỉ là một gợi ý. Claude thường tuân theo nó, nhưng khi chịu áp lực (tác vụ phức tạp, ngữ cảnh dài, hướng dẫn mơ hồ), nó có thể và thực sự bỏ qua các quy tắc khuyến nghị.
Một issue trên GitHub từ tháng 4 năm 2026 đã xác nhận: Claude đọc và đưa nội dung .env vào cuộc hội thoại ngay cả khi CLAUDE.md cấm rõ ràng.
Biện pháp bảo vệ đáng tin cậy duy nhất là một quy tắc từ chối (deny rule) trong settings.json. Quy tắc từ chối được thực thi ở cấp hệ thống trước khi Claude nhìn thấy file.
Sự khác biệt giữa "làm ơn đừng đọc cái này" và "bạn không thể đọc cái này".

3 cách bí mật của bạn bị rò rỉ
Không chỉ đơn giản là Claude đọc trực tiếp file .env. Có ba con đường:
1. Đọc file trực tiếp. Claude quét dự án của bạn, mở .env và nội dung trở thành một phần của ngữ cảnh hội thoại. Đây là con đường rõ ràng nhất và dễ chặn nhất bằng quy tắc từ chối.
2. Thu thập đầu ra runtime. Claude chạy test hoặc khởi động ứng dụng của bạn. Một yêu cầu HTTP thất bại ghi lại toàn bộ header Authorization: Bearer sk-live-abc123.... Một timeout cơ sở dữ liệu dump chuỗi kết nối kèm mật khẩu. Claude thu thập tất cả đầu ra lệnh. Bí mật của bạn giờ đây nằm trong cuộc hội thoại, dù Claude chưa bao giờ mở .env.
3. Công cụ grep và tìm kiếm. Claude dùng grep để tìm kiếm tên hàm trong codebase. Kết quả tìm kiếm chạm vào file cấu hình chứa thông tin đăng nhập. Đầu ra grep bao gồm các dòng khớp với bí mật của bạn hiển thị rõ ràng.
Hầu hết mọi người chỉ bảo vệ con đường 1. Con đường 2 và 3 mới là nơi thiệt hại thực sự xảy ra.
Các quy tắc từ chối thực sự hiệu quả
Thêm những dòng này vào ~/.claude/settings.json để bảo vệ toàn cục cho mọi dự án:
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}
Điều này chặn Claude đọc hoặc ghi bất kỳ file .env nào, khóa PEM, khóa SSH, cấu hình AWS, file thông tin đăng nhập và token npm/PyPI. Wildcard \\ có nghĩa là nó áp dụng cho mọi thư mục con trong dự án của bạn.
Chặn rò rỉ runtime
Quy tắc từ chối ngăn đọc file trực tiếp nhưng không ngăn đầu ra runtime. Để giải quyết, hãy dùng file .env riêng cho test với giá trị giả:
1# .env.test — an toàn để đọc, an toàn để rò rỉ2STRIPE_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
Trỏ test framework của bạn vào .env.test thay vì .env. Giờ khi Claude chạy test và thu thập đầu ra, các key hiển thị chỉ là giả.
Pre-commit hook bắt tất cả
Ngay cả với quy tắc từ chối, sai lầm vẫn có thể xảy ra. Thêm một git pre-commit hook quét tìm bí mật trước khi bất kỳ commit nào đến repo của bạn:
bash
1#!/bin/bash2# .git/hooks/pre-commit — chặn commit chứa bí mật34PATTERNS=(5 'sk-ant-' # Anthropic API keys6 'sk-live-' # Stripe live keys7 'sk_live_' # Stripe live keys (alt format)8 'ghp_' # GitHub personal tokens9 'gho_' # GitHub OAuth tokens10 'AKIA' # AWS access keys11 'xox[bpors]-' # Slack tokens12 'SG\.' # SendGrid keys13 'eyJ' # JWTs14 'BEGIN.*PRIVATE KEY' # Private key material15)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
Làm cho nó có thể thực thi: chmod +x .git/hooks/pre-commit
Điều này bắt các API key Anthropic, key Stripe, token GitHub, key AWS, token Slack, key SendGrid, JWT và khóa riêng tư. Nếu bất kỳ thứ nào trong số này xuất hiện trong file đã staged, commit sẽ bị chặn.
Cô lập container (phương án triệt để)
Để bảo mật tối đa, hãy chạy Claude Code bên trong container nơi file .env thực sự không tồn tại:
bash
1# Mount /dev/null lên .env để Claude không thể thấy nó2docker run -v /dev/null:/app/.env:ro your-dev-container
Từ góc nhìn của Claude, .env là một file rỗng. Bí mật của bạn không bao giờ vào hệ thống file container. Đây là hơi quá mức cho hầu hết dự án, nhưng rất cần thiết cho công việc với khách hàng có thông tin đăng nhập production.
Cấu hình bảo mật đầy đủ (sẵn sàng copy-paste)
Hoàn chỉnh ~/.claude/settings.json với tất cả biện pháp bảo vệ bảo mật:
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}
Đây là settings.json từ bài viết trước của tôi cộng với tất cả quy tắc bảo mật từ bài này. Quy tắc cho phép cho quy trình làm việc hàng ngày, quy tắc từ chối cho bí mật và các thao tác nguy hiểm. Một file, bảo vệ toàn diện.
Danh sách kiểm tra
Trước phiên Claude Code tiếp theo của bạn:
- Bạn đã có quy tắc từ chối cho file .env trong settings.json chưa?
- Test của bạn có dùng .env.test với giá trị giả không?
- Đã có pre-commit hook quét các mẫu bí mật chưa?
- Thông tin đăng nhập production có được lưu trong vault, không phải file văn bản thuần không?
- .env có trong .gitignore của bạn chưa?
- File .env có nằm ngoài thư mục dự án để tăng thêm an toàn không?
Nếu bạn đã kiểm tra cả 6, bí mật của bạn được bảo vệ tối đa. Nếu bạn kiểm tra 0, bạn chỉ còn cách một prompt Claude mơ hồ để API key của bạn xuất hiện trong nhật ký hội thoại trên máy chủ của Anthropic.
Tôi chia sẻ ghi chú hàng ngày về AI, tài chính và vibe coding trong kênh Telegram của mình: **https://t.me/zodchixquant**
Cảm ơn bạn đã đọc🙏🏼



