Push credentials (API keys, passwords, private keys) ขึ้น GitHub โดยไม่ตั้งใจเป็นปัญหา security ที่เป็นเรื่องร้ายแรง บทความนี้อธิบายเมื่อเกิดเหตุการณ์เช่นนี้ วิธีลบข้อมูลลับออกจาก repository และการป้องกันในอนาคต
เกิดอะไรขึ้นเมื่อ Push Credentials ขึ้นไป
- Credentials อยู่ใน Git history ถ้าเผยแพร่แล้ว attacker อาจเห็นเมื่อดู commit history
- GitHub bot สแกนเพื่อหา leaked secrets อัตโนมัติ
- Private keys อาจถูก abuse เพื่อเข้าถึง servers
- API keys สามารถใช้เรียก API ของคุณ
- Database passwords เสี่ยงที่จะถูก brute-force
วิธีเสิร์จหา Leaked Credentials
# Search commit history for specific patterns
git log -p --all -S "password" | head -50
# Find secrets with TruffleHog
pip install trufflehog
trufflehog filesystem . --json
# Use GitHub's security features
# Settings > Security & analysis > Secret scanning
วิธีลบ Credentials ออก
วิธี 1: ใช้ BFG Repo-Cleaner (ง่ายที่สุด)
# Install BFG
brew install bfg
# Clone repository ลึก
git clone --mirror https://github.com/username/repo.git
# ลบ file หรือ pattern
bfg --delete-files id_{rsa,dsa} repo.git
# Push back
cd repo.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push --force
วิธี 2: ใช้ git filter-branch (manual way)
git filter-branch --tree-filter 'rm -f config/secrets.yml' HEAD
# Force push after cleanup
git push origin --force --all
ป้องกันหลังจาก Cleanup
- Rotate all exposed credentials ทันที
- เปลี่ยน API keys, passwords, SSH keys
- Monitor logs เพื่อหาการใช้งานที่น่าสงสัย
- Check commits ที่เพิ่มเข้ามาในช่วงที่ credentials ถูกเปิดเผย
Best Practices สำหรับการจัดการ Credentials
- ใช้ .gitignore – เพิ่ม sensitive files
*.key, *.pem, .env, config/secrets.yml, credentials.json - ใช้ Environment Variables – เก็บ secrets บน server, ไม่ใน code
- ใช้ Secret Management Tools – HashiCorp Vault, AWS Secrets Manager
- ใช้ .env files locally – เพิ่ม .env ในไฟล์ .gitignore
- Pre-commit hooks – ตรวจสอบก่อน commit
pip install pre-commit detect-secrets - GitHub secret scanning – เปิด in settings
- Code review – ตรวจสอบ Pull Requests ก่อน merge
ตั้งค่า .env สำหรับ Development
# .gitignore
.env
.env.local
*.key
*.pem
# .env (local, never commit)
DATABASE_PASSWORD=mysecretpassword
API_KEY=sk_test_123456789
PRIVATE_KEY=/path/to/private/key
# Load in app
require 'dotenv'
Dotenv.load
ตั้งค่า Pre-commit Hooks
pip install pre-commit detect-secrets
# Create .pre-commit-config.yaml
repos:
- repo: https://github.com/Yelp/detect-secrets
rev: v1.1.165
hooks:
- id: detect-secrets
args: ['--baseline', '.secrets.baseline']
# Install hooks
pre-commit install
# Generate baseline
detect-secrets scan > .secrets.baseline
สรุป
Push credentials ขึ้น GitHub โดยไม่ตั้งใจเป็นเหตุการณ์ที่อาจเกิดขึ้นได้ สำคัญคือต้องตรวจสอบและลบออกทันท่วงที และทำการป้องกันในอนาคตด้วยการใช้ .gitignore, environment variables, และ pre-commit hooks การปฏิบัติเหล่านี้จะช่วยให้คุณเก็บ secrets ไว้ที่ปลอดภัยและลดความเสี่ยง
