Gitleaks في CI: امنع API Key قبل ما يدخل main
هتطلع من المقال بخط دفاع عملي يمنع تسريب مفاتيح API قبل ما تتحول لتذكرة Incident وتدوير مفاتيح في نص اليوم.
مستوى القارئ: متوسط
المشكلة باختصار
المشكلة مش إن المطورين مهملين. اللي بيحصل فعلاً إن secret صغير بيتحط في ملف .env أو test fixture، وبعدها يدخل commit عادي جدًا. لو اكتشفته بعد الدمج، أنت غالبًا هتعمل 3 حاجات: تلغي المفتاح، تدوّر secret جديد، وتفتش في اللوجات عن استخدام غريب.
الافتراض هنا إن عندك repo على GitHub، وفريق صغير إلى متوسط، وبتستخدم GitHub Actions. لو عندك 20 مطور و10 pull requests يوميًا، فحص مدته 20 إلى 40 ثانية على كل PR أرخص من ساعتين استجابة لتسريب مفتاح production.
مثال سريع قبل التعريف
ركز في السيناريو ده: مطور بيجرّب خدمة دفع، فيحط السطر ده في ملف اختبار مؤقت:
STRIPE_SECRET_KEY=sk_live_51Nxxxxxxxxxxxxxxxxxxxxxxxxلو الملف اتعمله commit، GitHub ممكن يلتقط السر حسب نوعه وإعدادات secret scanning. لكن أفضل طريقة مش إنك تستنى GitHub بعد push. الأفضل إن الفحص يحصل محليًا ثم في CI. كده السر بيتوقف قبل ما يدخل main.
علميًا، Gitleaks بيعمل pattern matching على محتوى Git history أو directory، ويطلع findings فيها rule id، الملف، والسطر. هو مش مدير أسرار، ومش بيعمل rotation. هو إنذار مبكر. GitHub push protection طبقة ثانية تمنع أنواع مدعومة من الأسرار أثناء push، لكن لها نطاق دعم وحدود معلنة في توثيق GitHub.
التركيب العملي: pre-commit ثم GitHub Actions
ابدأ محليًا. الهدف إن المطور يعرف الخطأ قبل ما يفتح PR.
# macOS/Linux عبر Homebrew
brew install gitleaks
# فحص مجلد المشروع الحالي
gitleaks dir . --redact --verbose
# فحص Git history لو عايز baseline أول مرة
gitleaks git . --redact --report-format json --report-path gitleaks-report.jsonبعدها ضيف GitHub Action بسيط. ده خط دفاع إلزامي لأن pre-commit اختياري ويمكن تخطيه.
name: secret-scan
on:
pull_request:
push:
branches: [main]
jobs:
gitleaks:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Run Gitleaks
uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}