لو حطيت مفتاح AWS_SECRET_ACCESS_KEY في ملف .env وعملتله commit بالغلط، خلاص — حتى لو مسحته في commit تاني، هو موجود للأبد في الـ Git history. الـ bots اللي بتمشّط GitHub بتلاقيه في أقل من 30 ثانية حسب تقرير GitGuardian 2024. المقال ده بيوريك إزاي تمنع التسريب ده من الأساس، قبل ما يوصل حتى للمستودع المحلي.
أتمتة منع تسريب الأسرار: خط دفاع بيشتغل قبل ما تعمل push
المشكلة باختصار
الطريقة الشائعة اللي بتفشل: المطور بيحط API keys في ملف config، بيعمل git add . من غير ما يشوف إيه بالظبط بيتضاف، بيعمل push، وبعد أسبوعين بيوصله إيميل من AWS إن حد استخدم المفتاح بتاعه علشان يشغّل EC2 instances بـ 40 ألف دولار. التصحيح بعد كده معناه: إلغاء المفتاح، توليد واحد جديد، و git filter-repo على كل تاريخ الـ repo. مش لعبة.
مثال مبدئي بسيط: الحارس اللي بيفتّش قبل الدخول
تخيّل مدخل عمارة فيه حارس. كل حد داخل، الحارس بيفتّش شنطته بسرعة. لو لقي حاجة ممنوعة (سكينة، مثلاً)، بيرجّعه من غير ما يدخل أصلًا. الـ pre-commit hook هو نفس الحارس ده، بس بدل السكينة، بيدوّر على patterns زي مفاتيح AWS، tokens بتاعة GitHub، كلمات سر قواعد بيانات. ولو لقاها، بيرفض الـ commit قبل ما يخش المستودع.
التعريف العلمي الدقيق: pre-commit hook
الـ Git hooks هي سكربتات بتشتغل أوتوماتيكيًا عند أحداث معينة في Git. الـ pre-commit هو hook بيشتغل قبل تسجيل الـ commit محليًا، وبياخد صلاحية إنه يوقف العملية كلها لو رجّع exit code ≠ 0. مكتبة pre-commit (بـ Python) بتدير الـ hooks دي بصيغة .pre-commit-config.yaml قابلة للمشاركة بين الفريق.
Gitleaks أداة مفتوحة المصدر مكتوبة بـ Go، بتفحص الفرق (diff) أو كل الـ repo بالبحث عن أكثر من 150 pattern جاهز (AWS, GCP, Stripe, Slack tokens، إلخ). بترجع ناتج JSON أو stdout، وبتوقف الـ commit لو لقت match.
التركيب خطوة بخطوة
1) تثبيت المكتبات
# macOS / Linux
brew install gitleaks pre-commit
# أو عبر pip و go
pip install pre-commit
go install github.com/gitleaks/gitleaks/v8@latest2) ملف الإعداد .pre-commit-config.yaml
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.21.2
hooks:
- id: gitleaks
name: Detect hardcoded secrets
stages: [pre-commit]
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
hooks:
- id: detect-private-key
- id: check-added-large-files
args: ['--maxkb=500']3) تفعيل الـ hook على المستودع
pre-commit install
# كمان شغّل فحص على كل التاريخ مرة واحدة
pre-commit run --all-files
gitleaks detect --source . --verbose4) استثناءات آمنة (مش شيل الحماية كلها)
لو عندك ملف فعلًا آمن فيه pattern شبيه بمفتاح (مثلاً، example في تست)، أنشئ .gitleaks.toml:
[allowlist]
description = "Test fixtures allowlist"
paths = [
'''tests/fixtures/fake-keys\.json'''
]
regexes = [
'''EXAMPLE_KEY_[A-Z0-9]{16}'''
]الـ trade-offs الحقيقية
الفحص بياخد من 200 ملي ثانية لـ repo صغير (5 ملفات معدّلة) لحد 3 ثواني لـ repo فيه node_modules مرفوع بالغلط. على مشروع Next.js متوسط (حوالي 200 ملف تعديل متوسط كل سبرنت)، الإضافة في وقت الـ commit حوالي 400 ملي ثانية — مش هتحس بيها.
المكسب: بتمنع الحوادث في أكتر من 95% من الحالات الشائعة حسب benchmarks الأداة. التكلفة: دقيقة إعداد مرة واحدة + false positive كل أسبوعين تقريبًا (حل: ضيف السطر في الـ allowlist). الافتراض: الفريق عنده pre-commit install مفعّل محليًا — لو مفعّلوش، الحماية مش موجودة، ولذلك لازم تضيف فحص مكرر في CI.
الخطوة المكمّلة: فحص CI كـ Safety Net
# .github/workflows/gitleaks.yml
name: Gitleaks Scan
on: [pull_request, push]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}متى لا تستخدم هذه الطريقة
لو الأسرار أصلًا بتتدار بـ Vault أو AWS Secrets Manager، والـ repo مفيهوش ولا ملف .env، الـ pre-commit هنا مش حاجة أساسية (بس لسه مفيد كـ belt-and-suspenders). كمان لو بتشتغل في monorepo ضخم فيه أكتر من 50 ألف ملف ومحتاج فحص لحظي، فكّر في أداة مخصصة زي trufflehog مع indexing.
الخطوة التالية
افتح الـ repo بتاعك دلوقتي، شغّل gitleaks detect --source . --verbose. لو الناتج زيرو، ركّب الـ pre-commit وخلاص. لو لقالك match واحد، دوّر عليه، ألغي المفتاح من الـ provider فورًا، ولّد جديد، وبعدين نظّف التاريخ بـ git filter-repo. ترتيب الخطوات دي مهم — الإلغاء قبل التنظيف.
مصادر
- Gitleaks Documentation — github.com/gitleaks/gitleaks (إصدار v8.21.2، نوفمبر 2024)
- pre-commit Framework — pre-commit.com
- GitGuardian State of Secrets Sprawl Report 2024 — إحصائيات سرعة اكتشاف الـ bots للمفاتيح المسرّبة
- GitHub Docs — Removing sensitive data from a repository (
git filter-repo) - AWS — Incident response for compromised access keys