أحمد حايس
الرئيسيةمن أناالدوراتالمدونةالعروض
أحمد حايس

دورات عربية متخصصة في التقنية والبرمجة والذكاء الاصطناعي.

المنصة مبنية على الوضوح، التطبيق، والنتيجة النافعة: شرح مرتب يساعدك تفهم الأدوات، تكتب كودًا أفضل، وتستخدم الذكاء الاصطناعي بوعي داخل العمل الحقيقي.

تعلم أسرعوصول مباشر للدورات والمسارات من الموبايل.
تنقل أوضحالروابط الأساسية والدعم في مكان واحد بدون تشتيت.

المنصة

  • الرئيسية
  • من أنا
  • الدورات
  • العروض
  • المدونة

الدعم

  • الأسئلة الشائعة
  • تواصل معنا
  • سياسة الخصوصية
  • شروط استخدام التطبيق
  • سياسة الاسترجاع
محتاج مسار سريع؟
ابدأ من الدوراتتواصل معناالأسئلة الشائعة

© 2026 أحمد حايس. جميع الحقوق محفوظة.

الرئيسيةالدوراتالعروضالمدونةالدخول

أتمتة منع تسريب الأسرار في Git بـ Gitleaks و pre-commit — امسك المفتاح قبل ما يعمل push

📅 ٢٠ أبريل ٢٠٢٦⏱ 4 دقائق قراءة
أتمتة منع تسريب الأسرار في Git بـ Gitleaks و pre-commit — امسك المفتاح قبل ما يعمل push

لو حطيت مفتاح AWS_SECRET_ACCESS_KEY في ملف .env وعملتله commit بالغلط، خلاص — حتى لو مسحته في commit تاني، هو موجود للأبد في الـ Git history. الـ bots اللي بتمشّط GitHub بتلاقيه في أقل من 30 ثانية حسب تقرير GitGuardian 2024. المقال ده بيوريك إزاي تمنع التسريب ده من الأساس، قبل ما يوصل حتى للمستودع المحلي.

أتمتة منع تسريب الأسرار: خط دفاع بيشتغل قبل ما تعمل push

قفل رقمي فوق لوحة مفاتيح يرمز لمنع تسريب مفاتيح الـ API في Git

المشكلة باختصار

الطريقة الشائعة اللي بتفشل: المطور بيحط 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) تثبيت المكتبات

Bash
# macOS / Linux
brew install gitleaks pre-commit

# أو عبر pip و go
pip install pre-commit
go install github.com/gitleaks/gitleaks/v8@latest

2) ملف الإعداد .pre-commit-config.yaml

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 على المستودع

Bash
pre-commit install
# كمان شغّل فحص على كل التاريخ مرة واحدة
pre-commit run --all-files
gitleaks detect --source . --verbose

4) استثناءات آمنة (مش شيل الحماية كلها)

لو عندك ملف فعلًا آمن فيه pattern شبيه بمفتاح (مثلاً، example في تست)، أنشئ .gitleaks.toml:

[allowlist]
description = "Test fixtures allowlist"
paths = [
  '''tests/fixtures/fake-keys\.json'''
]
regexes = [
  '''EXAMPLE_KEY_[A-Z0-9]{16}'''
]

نافذة Terminal تعرض خرج Gitleaks أثناء تشغيل pre-commit hook

الـ 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

YAML
# .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

هل استفدت من المقال؟

اطّلع على المزيد من المقالات والدروس المجانية من نفس المسار المعرفي.

تصفّح المدونة