Không bao giờ commit secret vào code, kể cả file .env. Chỗ để đúng là secret store của chính CI (GitHub Secrets, GitLab Variables) hoặc vault tập trung (HashiCorp Vault, AWS Secrets Manager).
Cách làm nên theo:
- Secret của CI: GitHub Settings → Secrets and variables → Actions, đọc bằng ${{ secrets.MY_KEY }} và được tự động che trong log.
- Environment secret: gắn secret vào environment (production, staging) để job phải qua bước duyệt của reviewer mới dùng được.
- OIDC — nên dùng nhất khi deploy cloud: GitHub Actions phát OIDC token, AWS/GCP/Azure tin issuer đó rồi cấp credential ngắn hạn (15 phút). Không còn access key tĩnh nằm trong repo nữa.
- Secret scanning: GitHub Secret Scanning kèm push protection chặn ngay commit chứa AWS key hay Stripe key trước khi lên remote; thêm gitleaks vào pre-commit hook để quét ngay ở máy.
- Vault: những secret nhạy cảm hơn (mật khẩu DB production) để trong HashiCorp Vault hoặc AWS Secrets Manager, CI fetch lúc chạy với TTL ngắn.
Rotation: API key quan trọng rotate mỗi 90 ngày. Nghi ngờ lộ thì revoke ngay, rotate, rồi soi audit log để biết thiệt hại tới đâu.
Lưu ý — ba lỗi kinh điển: log cả env ra CI (set -x là lộ sạch); commit .env rồi xoá đi (nó vẫn nằm trong Git history — phải BFG repo-cleaner hoặc git filter-repo, force push, và rotate lại toàn bộ); echo secret vào artifact rồi upload công khai.