Push Credentials ขึ้น GitHub โดยไม่ตั้งใจ: วิธีลบและป้องกันในอนาคต

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 ไว้ที่ปลอดภัยและลดความเสี่ยง