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 |
للمزيد
- CrowdSec Hub hub.crowdsec.net
- Vaultwarden github.com/dani-garcia/vaultwarden
- Forgejo forgejo.org
- OWASP Top 10 owasp.org