Trong quá trình phát triển phần mềm, việc vô tình commit các thông tin nhạy cảm như API Key, Access Token, mật khẩu database hoặc Private Key là một lỗi khá phổ biến.
Ví dụ:
AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=xxxxx
DATABASE_PASSWORD=123456
STRIPE_SECRET_KEY=sk_live_xxxxxNếu những giá trị này bị push lên GitHub, GitLab hoặc xuất hiện trong file build frontend, chúng có thể bị người khác lấy được và sử dụng trái phép.
Một công cụ rất hữu ích để phát hiện vấn đề này là TruffleHog.
TruffleHog là gì?
TruffleHog là công cụ chuyên dùng để tìm kiếm các secret bị lộ trong:
Git repository
Git history
File và thư mục local
Docker image
GitHub hoặc GitLab repository
Cloud storage
Build output như
dist/,.next/Log hoặc dữ liệu truyền qua stdin
TruffleHog có thể phát hiện nhiều loại secret phổ biến như:
AWS Access Key
GitHub Token
Stripe Secret Key
OpenAI API Key
Database credentials
Private Key
JWT Secret
PostgreSQL connection stringĐiểm đặc biệt của TruffleHog là nó không chỉ tìm các chuỗi trông giống secret mà còn có khả năng xác minh xem secret đó còn hoạt động hay không.
TruffleHog hoạt động như thế nào?
Quá trình đơn giản có thể hiểu như sau:
Source Code / Git History
↓
TruffleHog Scanner
↓
Tìm chuỗi giống Secret
↓
Nhận diện loại Secret
↓
Xác minh Secret
↓
Hiển thị kết quảVí dụ TruffleHog phát hiện một GitHub Token:
Detector Type: Github
File: src/config.ts
Line: 15
Commit: a82fc93Tùy từng trường hợp, kết quả thường được phân thành ba trạng thái.
Verified
Secret đã được xác minh và vẫn có khả năng sử dụng được.
Đây là trường hợp nguy hiểm nhất.
verified 🔴Nếu gặp trường hợp này, cần revoke hoặc rotate secret ngay lập tức.
Unknown
TruffleHog nhận diện được secret nhưng không thể xác minh.
Nguyên nhân có thể là:
Network error
API provider không phản hồi
Rate limit
FirewallNên coi secret này là nguy hiểm cho tới khi kiểm tra xong.
Unverified
Chuỗi dữ liệu trông giống secret nhưng TruffleHog không xác nhận được nó còn hợp lệ.
Ví dụ có thể là:
Key test
Key đã hết hạn
Key đã bị revoke
False positiveCài đặt TruffleHog
Trên macOS có thể cài nhanh bằng Homebrew:
brew install trufflehogSau đó kiểm tra:
trufflehog --versionNếu command hiển thị version thì TruffleHog đã được cài thành công.
Quét toàn bộ Git History
Đây là một trong những chức năng hữu ích nhất của TruffleHog.
Trong thư mục repository:
trufflehog git file://. --results=verified,unknownLệnh này sẽ kiểm tra lịch sử Git để tìm các secret từng được commit.
Điều này rất quan trọng vì đôi khi developer đã xóa secret khỏi code hiện tại nhưng secret vẫn còn trong Git history.
Ví dụ:
Commit A
.env chứa AWS key
Commit B
xóa AWS keyCode hiện tại không còn AWS key nhưng commit A vẫn lưu nó.
TruffleHog có thể phát hiện trường hợp này.
Quét các file hiện tại
Nếu muốn kiểm tra các file trong project, kể cả file chưa được commit:
trufflehog filesystem .Tuy nhiên project Node.js thường có thư mục rất lớn như:
node_modules
dist
.gitVì vậy nên tạo file exclude:
node_modules/
\.git/Ví dụ lưu thành:
.trufflehog-excludeSau đó chạy:
trufflehog filesystem . \
-x .trufflehog-exclude \
--results=verified,unknownViệc này giúp giảm đáng kể số lượng file không cần thiết phải quét.
Kiểm tra Angular hoặc React build
Đây là một trường hợp rất quan trọng đối với frontend developer.
Ví dụ trong Angular:
export const environment = {
apiSecret: 'sk_live_xxxxx',
};Khi chạy:
npm run buildgiá trị này có thể bị đưa trực tiếp vào:
dist/main.xxxxx.jsFile JavaScript này được tải xuống trình duyệt của người dùng.
Điều đó có nghĩa là secret không còn là secret nữa.
Có thể dùng TruffleHog kiểm tra build output:
npm run build
trufflehog filesystem dist \
--results=verified,unknown \
--failNếu tìm thấy secret, command sẽ trả về lỗi và có thể ngăn quá trình deploy.
Đối với Next.js có thể kiểm tra:
trufflehog filesystem .next \
--results=verified,unknown \
--failKiểm tra Docker Image
Secret đôi khi không nằm trong source code nhưng lại bị copy vào Docker image.
Ví dụ:
COPY .env /app/.envĐây là một lỗi khá nguy hiểm.
Có thể kiểm tra Docker image bằng:
trufflehog docker \
--image docker://myapp:latest \
--results=verified,unknownTrước khi push image lên registry, việc scan image là một bước khá hữu ích.
Dùng TruffleHog trong CI/CD
Thay vì chờ đến lúc secret bị lộ mới kiểm tra, tốt hơn nên chạy TruffleHog tự động mỗi khi có Pull Request.
Quy trình có thể như sau:
Developer Push Code
↓
GitHub Actions
↓
TruffleHog Scan
↓
Không có Secret
↓
Cho phép MergeNếu phát hiện secret:
Developer Push Code
↓
GitHub Actions
↓
TruffleHog phát hiện Secret
↓
CI Failed
↓
Không cho MergeMột command thường dùng trong CI:
trufflehog git file://. \
--results=verified,unknown \
--failTrong đó:
--results=verified,unknownchỉ tập trung vào những kết quả đáng quan tâm hơn.
Còn:
--failsẽ làm pipeline thất bại khi phát hiện secret.
Nếu đã commit nhầm Secret thì phải làm gì?
Một sai lầm phổ biến là nghĩ rằng chỉ cần xóa secret rồi commit lại là đủ.
Ví dụ:
git commit -m "remove api key"Điều này không giải quyết hoàn toàn vấn đề.
Secret vẫn có thể tồn tại trong:
Git history
Fork
Clone của developer khác
CI logs
Docker image
CacheQuy trình đúng nên là:
1. Revoke hoặc Rotate Secret
2. Tạo Secret mới
3. Đưa Secret mới vào Environment Variable hoặc Secret Manager
4. Xóa Secret khỏi Source Code
5. Nếu cần, dọn Git History
6. Scan lại bằng TruffleHogĐiểm quan trọng nhất là:
Rotate secret trước, dọn Git history sau.
Ví dụ nếu AWS Access Key bị lộ, hãy vô hiệu hóa key đó từ AWS trước.
Việc git reset, git revert hoặc force push không làm cho key cũ mất hiệu lực.
Không nên đưa Secret vào Frontend
Một nguyên tắc quan trọng khác:
Frontend không nên chứa secret.
Ví dụ các biến:
NEXT_PUBLIC_
VITE_
REACT_APP_thường được đưa vào JavaScript chạy trên trình duyệt.
Nếu bạn đặt:
VITE_STRIPE_SECRET_KEY=sk_live_xxxxxthì key đó có khả năng bị bundle vào frontend.
Người dùng có thể mở DevTools hoặc tải JavaScript về và xem được.
Frontend chỉ nên sử dụng các giá trị được thiết kế để public.
Secret thật phải nằm ở backend.
Workflow TruffleHog đơn giản cho Developer
Một workflow khá thực tế có thể là:
# Kiểm tra Git history
trufflehog git file://. \
--results=verified,unknownSau đó kiểm tra project local:
trufflehog filesystem . \
-x .trufflehog-exclude \
--results=verified,unknownNếu là frontend:
npm run build
trufflehog filesystem dist \
--results=verified,unknown \
--failCuối cùng, thêm bước scan vào CI/CD để tự động kiểm tra mỗi lần push code hoặc tạo Pull Request.
Kết luận
TruffleHog là một công cụ rất hữu ích để giảm nguy cơ lộ secret trong quá trình phát triển phần mềm.
Nó giúp developer phát hiện các thông tin nhạy cảm như:
API Key
Access Token
Database Password
Private Key
Cloud Credentialskhông chỉ trong code hiện tại mà còn trong Git history, Docker image và build output.
Đối với các project web hiện đại sử dụng Angular, React, NestJS, Node.js hoặc Docker, việc thêm secret scanning vào quy trình phát triển là một bước tương đối đơn giản nhưng có thể ngăn chặn những sự cố bảo mật nghiêm trọng.
Một quy tắc đáng nhớ là:
Secret đã bị commit thì hãy coi như đã bị lộ. Rotate trước, xóa sau.

