الأمن السيبراني

حماية Vaultwarden و Forgejo و WordPress مع CrowdSec: درس 2026

3 min de lecture

Vaultwarden، Forgejo، WordPress — ثلاثة تطبيقات حسّاسة لأعمال أي فريق تقني. كلها تستهدفها هجمات brute force يومياً. CrowdSec يوفّر حماية موحّدة لكلها بـ collections مخصصة. هذا الدرس يوسّع تثبيت CrowdSec الأساسي ليحمي هذه التطبيقات الثلاثة بـ 8 خطوات.

المتطلبات

  • CrowdSec مثبّت (انظر درساً سابقاً)
  • Vaultwarden أو Forgejo أو WordPress منشور
  • Reverse proxy (Caddy، Nginx، Traefik)
  • الوقت المقدر: ساعة

الخطوة 1 — Collection Vaultwarden

sudo cscli collections install crowdsecurity/vaultwarden

# يتضمن:
# - parser لـ Vaultwarden logs
# - scenario: brute force على /api/accounts/login
# - scenario: scan على endpoints حساسة

# تأكد من أن CrowdSec يقرأ logs Vaultwarden
# في /etc/crowdsec/acquis.yaml:
filenames:
  - /var/log/vaultwarden/access.log
  - /opt/vaultwarden/data/logs/*.log
labels:
  type: vaultwarden

sudo systemctl restart crowdsec

Vaultwarden يخزّن كلمات مرور — هدف ذهبي للمهاجمين. brute force على master password الـ vault = خسارة كل كلمات الفريق. مع CrowdSec، 5 محاولات فاشلة من نفس IP = حظر 4 ساعات. مع شبكة CrowdSec العالمية، الـ IPs المعروفة بهجوم Vaultwarden في مكان آخر تُحجب وقائياً.

الخطوة 2 — Collection Forgejo/Gitea

sudo cscli collections install crowdsecurity/gitea
# Forgejo fork من Gitea، parsers يعملان للاثنين

# تكوين log path:
# في /etc/crowdsec/acquis.yaml:
filenames:
  - /var/log/gitea/gitea.log
  - /var/lib/forgejo/log/gitea.log
labels:
  type: gitea

sudo systemctl restart crowdsec

Forgejo (وGitea) يستهدفهما brute force على /user/login، scanning على ملفات .git المكشوفة، تجريد API. الـ collection يكشف هذه الأنماط. ميزة إضافية: حجب الـ scrapers التي تنسخ الـ repos العامة بحجم ضخم — توفر bandwidth.

الخطوة 3 — Collection WordPress

sudo cscli collections install crowdsecurity/wordpress

# يتضمن scenarios لـ:
# - brute force على /wp-login.php
# - XML-RPC abuse
# - REST API enumeration
# - plugin vulnerability scans
# - admin path scanning

# logs WordPress عبر Nginx access log
# يجب أن تكون مفعّلة في acquis.yaml بالفعل (من تثبيت Nginx)

WordPress يستهدف 60% من الاختراقات على الويب وفق Wordfence. بدون CrowdSec، خادم WordPress العادي يتلقى 100-1000 محاولة brute force يومياً. مع CrowdSec، تنخفض إلى 0-5 — كل الباقي محجوب قبل وصول الطلب لـ PHP.

الخطوة 4 — Bouncer مشترك على Reverse Proxy

الأبسط: bouncer واحد على الـ reverse proxy يحمي كل التطبيقات. لا حاجة لـ bouncer لكل تطبيق.

# مثال Caddyfile مع CrowdSec:
{
  order crowdsec first
  crowdsec {
    api_url http://localhost:8080
    api_key API_KEY_HERE
  }
}

vault.example.com {
  crowdsec
  reverse_proxy localhost:8081  # Vaultwarden
}
git.example.com {
  crowdsec
  reverse_proxy localhost:8082  # Forgejo
}
blog.example.com {
  crowdsec
  reverse_proxy localhost:8083  # WordPress
}

# بدون caddy reload (zero downtime):
caddy reload

الـ bouncer على الـ reverse proxy يفحص كل طلب قبل وصوله لأي تطبيق. هذا أكثر فعالية من bouncer لكل تطبيق — أسرع، أبسط إدارة. الـ logs تأتي من التطبيقات المختلفة، CrowdSec يفحصها كلها بنفس الـ engine.

الخطوة 5 — Custom Scenarios

Scenarios افتراضية تغطي 90% من الحالات. لكن أحياناً تحتاج قاعدة مخصصة لتطبيقك. مثلاً: حجب أي IP يحاول رفع ملف > 100 MB.

# /etc/crowdsec/scenarios/large-uploads.yaml:
type: leaky
name: my/large-uploads
description: "Block IPs trying large file uploads"
filter: "evt.Meta.http_verb == 'POST' && evt.Meta.http_status == '200'"
groupby: "evt.Meta.source_ip"
distinct: "evt.Meta.target_uri"
capacity: 5
leakspeed: "60s"
blackhole: 5m
labels:
  service: web
  type: web_attack
  remediation: true

sudo systemctl reload crowdsec
# الآن: 5 طلبات POST في < 5 دقائق = حجب 5 دقائق

Scenarios هي ملفات YAML بسيطة. capacity هو عدد الأحداث قبل التفعيل، leakspeed سرعة « تنفيس » العداد. مثل دلو فيه ثقب: تملأه أسرع مما يفرغ → ينفذ السيناريو. المنطق بسيط لكنه قوي. CrowdSec Hub يحتوي 1000+ scenario جاهز للاستلهام.

الخطوة 6 — Notifications مفصّلة

تنبيه الفريق على الهجمات الهامة، تجاهل الضوضاء.

# Profile مخصص في /etc/crowdsec/profiles.yaml:
name: high-priority
filters:
  - Alert.Remediation == true && 
    (Alert.Scenario =~ "wordpress|vaultwarden")
notifications:
  - slack_security    # webhook خاص للأمن
on_success: continue

---
name: default_ip_remediation
filters:
  - Alert.Remediation == true
notifications:
  - slack_general    # webhook العام
on_success: break

الـ profiles تتنفّذ بالترتيب. الأول الذي يطابق ينفّذ. on_success: continue = نفذ ثم استمر للتالي، break = توقف. هذا يتيح: تنبيه أمن خاص لـ WordPress + Vaultwarden، تنبيه عام لباقي الهجمات. لا تخلط القنوات.

الخطوة 7 — Geo-blocking

إن كان جمهورك أفريقياً، لا حاجة لقبول طلبات من روسيا أو الصين. Geo-blocking يقلّل المخاطر بـ 50-70%.

# تثبيت parser GeoIP:
sudo cscli parsers install crowdsecurity/geoip-enrich

# scenario للحجب:
# /etc/crowdsec/scenarios/geo-block.yaml:
type: trigger
name: my/block-from-country
description: "Block countries we don't serve"
filter: "evt.Enriched.IsoCode in ['CN', 'RU', 'KP']"
groupby: "evt.Meta.source_ip"
blackhole: 24h
labels:
  service: geo
  remediation: true

تذكّر: Geo-blocking ليس مضمون 100% (VPN يتحايل عليه)، لكنه يحجب 80% من الـ bots الـ « غير الحرفية ». قبل التطبيق، تحقق: هل لديك زبائن قانونيون من تلك البلدان؟ لا تحجب بلداناً تخدمها فعلاً. للمواقع المحلية الأفريقية، حجب البلدان البعيدة جغرافياً منطقي. للـ SaaS العالمي، تجنّب Geo-blocking.

الخطوة 8 — مراقبة الفعالية

بعد أسبوع من التشغيل، راجع الإحصائيات. ما الـ scenarios التي تعمل؟ ما false positives؟

sudo cscli metrics
# top scenarios المفعّلة
# parsers الأكثر استخداماً
# bouncer requests

sudo cscli alerts list --since 7d --output json | 
  jq 'group_by(.scenario) | 
      map({scenario: .[0].scenario, count: length}) |
      sort_by(-.count)'
# ترتيب الـ scenarios حسب التكرار

# IPs المحجوبة الأكثر:
sudo cscli decisions list --by ip | head -20

التحليل الأسبوعي يكشف اتجاهات: زيادة WordPress brute force = راجع الإضافات الضعيفة في موقعك. هجمات من بلد محدد = فكر في geo-blocking مؤقت. قاعدة: 5 دقائق أسبوعياً + 30 دقيقة شهرياً. CrowdSec Console (مجاني) يعطي dashboard بصري لمن لا يحب CLI.

أخطاء شائعة

المشكلة السبب الحل
logs لا تُحلّل filename خاطئ تحقق من /var/log/ الفعلي
كل عميل من Cloudflare محجوب real IP مفقود collection cloudflare-real-ips
scenarios لا تطلق filter غير صحيح cscli explain
Vaultwarden logs فارغ logging level low LOG_LEVEL=info
WordPress يفلت WAF غير مفعّل تحقق من Caddy/Nginx config
false positive لـ admin لم تُحوايتلست IP cscli decisions add –type whitelist

للمزيد

مقالات ذات صلة

Partager