Secret phải nằm ở secret store của CI (encrypted secrets, GitLab masked variables, Vault), tiêm vào runtime dưới dạng biến môi trường — không bao giờ nằm trong repo, kể cả repo private.
CI tự động che secret trong log, nhưng cơ chế này chỉ so khớp chuỗi nên vẫn rò trong nhiều tình huống thực tế:
- Secret bị biến đổi trước khi in: base64, JSON-encode, cắt chuỗi → không khớp mẫu, in ra nguyên văn.
set -x/ debug mode của script in ra toàn bộ dòng lệnh kèm tham số.- Công cụ tự dump env khi lỗi (một số CLI in
process.envtrong stack trace). - Truyền secret qua tham số dòng lệnh — hiện trong danh sách process, không chỉ trong log.
yaml
- run: ./deploy.sh
env:
API_KEY: ${{ secrets.API_KEY }} # qua env, không qua đối số CLIBiện pháp bổ sung: cấp secret ở phạm vi hẹp nhất (theo environment, chỉ job cần mới thấy), đặt permissions tối thiểu cho token mặc định, xoay vòng định kỳ, và bật secret scanning để bắt trường hợp lỡ commit.
Khi đã lộ, rotate là bắt buộc — xóa log không cứu được vì log có thể đã bị đọc.