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

تكوين bouncers CrowdSec Caddy و Nginx: درس 2026

5 دقائق للقراءة

CrowdSec هو خليفة Fail2ban الحديث: يحجب الـ IPs الخبيثة بناءً على شبكة استخبارات تشاركية عالمية. مع bouncer لـ Caddy أو Nginx، تحجب الـ bots والـ brute force قبل أن تصل لتطبيقك. هذا الدرس يثبّت ويكوّن CrowdSec مع bouncers لكلا الـ web servers في 8 خطوات.

المتطلبات

  • VPS Linux (Ubuntu 24.04 LTS أو Debian 12 موصى)
  • Caddy أو Nginx مثبّت
  • صلاحية root
  • الوقت المقدر: ساعة

الخطوة 1 — تثبيت CrowdSec

# تثبيت من المستودع الرسمي
curl -s https://install.crowdsec.net | sudo sh
sudo apt install crowdsec

# التحقق:
sudo systemctl status crowdsec
sudo cscli metrics

# CrowdSec يبدأ بسيناريوهات SSH/HTTP الافتراضية
sudo cscli scenarios list

التثبيت ينشئ خدمة crowdsec مع log parsers و scenarios جاهزة. أهم الـ scenarios للـ web: http-crawl-non_statics (يحجب bots عشوائية)، http-bf-wordpress_bf (brute force WordPress)، ssh-bf (SSH brute force).

الخطوة 2 — Bouncer لـ Nginx

# تثبيت bouncer
sudo apt install crowdsec-nginx-bouncer

# توليد API key
sudo cscli bouncers add nginx-bouncer
# يطبع: API_KEY=xxxxxxxxxxxxxxxxxxxx

# إضافة في nginx.conf على مستوى http {}:
load_module modules/ngx_http_lua_module.so;

http {
  lua_package_path "/etc/crowdsec/bouncers/?.lua;;";
  init_by_lua_block { require("crowdsec") }
  access_by_lua_block { require("crowdsec").Allow() }
}

sudo nginx -t && sudo systemctl reload nginx

اختبر الـ bouncer: sudo cscli decisions add --ip 1.2.3.4 --duration 5m، ثم حاول الوصول من ذلك الـ IP. يجب أن يحصل على 403. الـ bouncer يستعلم من CrowdSec عن كل طلب، يستجيب في < 1 ms بفضل cache محلي.

الخطوة 3 — Bouncer لـ Caddy

# Caddy bouncer كـ plugin يُبنى مع xcaddy
xcaddy build \
  --with github.com/hslatman/caddy-crowdsec-bouncer

# في Caddyfile:
{
  order crowdsec first
  crowdsec {
    api_url http://localhost:8080
    api_key API_KEY_HERE
  }
}

example.com {
  crowdsec
  reverse_proxy localhost:3000
}

Caddy المبني مع plugin يحلّ محل الـ Caddy العادي. order crowdsec first يضمن أن الـ middleware يفحص قبل أي شيء آخر. caddy reload يطبّق الإعدادات بدون downtime.

الخطوة 4 — Collections للتطبيقات الشائعة

Collections هي مجموعات من scenarios + parsers جاهزة لتطبيقات محددة. تثبيتها بسطر واحد، تحمي تطبيقك من الهجمات المعروفة.

# Collections الأكثر فائدة:
sudo cscli collections install crowdsecurity/wordpress
sudo cscli collections install crowdsecurity/nginx
sudo cscli collections install crowdsecurity/sshd
sudo cscli collections install crowdsecurity/postfix
sudo cscli collections install crowdsecurity/base-http-scenarios

# للقائمة الكاملة:
sudo cscli collections list -a

# تحديث:
sudo cscli hub update
sudo cscli hub upgrade
sudo systemctl reload crowdsec

كل collection تشمل: parsers لقراءة الـ logs، scenarios للكشف عن الهجمات، blocklist URLs. مثال WordPress collection يكشف: brute force على wp-login.php، XML-RPC abuse، scan على ملفات حساسة، plugin enumeration. كلها يحجبها بشكل آلي.

الخطوة 5 — Console Cloud (مجاني)

CrowdSec Console يوفّر لوحة تحكم سحابية مجانية: تشاهد الهجمات في الوقت الفعلي، تدير عدة servers، تستفيد من شبكة الذكاء العالمي.

# إنشاء حساب على app.crowdsec.net
# في الـ VPS:
sudo cscli console enroll TON_ENROLL_KEY

# يربط server بحسابك
# الآن في الـ dashboard:
#   - الهجمات في الوقت الفعلي
#   - أعلى الـ IPs المهاجمة
#   - Blocklists المشتركة من شبكة CrowdSec
#   - دمج Slack/Discord للتنبيهات

الميزة الكبرى: blocklist من شبكة CrowdSec العالمية. عندما يهاجم bot 1000 موقع آخر يستخدم CrowdSec، الـ IP يُحجب على موقعك تلقائياً قبل أن يصلك. هذا « herd immunity » للويب — قوة تشاركية لا توفّرها أي حل فردي.

الخطوة 6 — Whitelist و القرارات اليدوية

أحياناً، CrowdSec يحجب IP شرعي بالخطأ (مثلاً، خادم monitoring تابع لك). الـ whitelist يحلّ المشكلة.

# إضافة IP إلى whitelist (لن يُحجب أبداً):
sudo cscli decisions add --ip 1.2.3.4 --type whitelist --duration 720h

# حذف decision (إن حُجب IP بالخطأ):
sudo cscli decisions delete --ip 1.2.3.4

# عرض كل decisions الحالية:
sudo cscli decisions list

# إضافة قاعدة yaml لـ whitelist دائم:
# في /etc/crowdsec/parsers/s02-enrich/mywhitelists.yaml:
name: my-whitelist
description: "Whitelist trusted IPs"
whitelist:
  reason: "trusted infrastructure"
  ip:
    - 192.168.1.0/24
    - 10.0.0.0/8

كن حذراً مع whitelists واسعة (CIDR /16 مثلاً). كل IP في الـ whitelist لا يُفحص — قد يخترقك من هناك. القاعدة: whitelist محدودة لأقل عدد ممكن من الـ IPs، مع مراجعة ربعية. للـ Cloudflare CDN، CrowdSec يدعمه بـ collection خاصة (cloudflare-real-ips).

الخطوة 7 — Notifications

عند حدوث هجوم مهم، تريد التنبيه فوراً. CrowdSec يدعم Slack، Discord، Email، webhook عام.

# في /etc/crowdsec/notifications/slack.yaml:
type: slack
name: slack_default
log_level: info
format: |
  {{range . -}}
  🚨 *{{.Source.Cn}}* — {{.Scenario}}
  IP: `{{.Source.IP}}` — {{.Source.AsName}}
  المدة: {{.Duration}}
  {{end}}
webhook: https://hooks.slack.com/services/XXX/YYY/ZZZ

# تفعيل في الـ profiles:
# /etc/crowdsec/profiles.yaml:
name: default_ip_remediation
filters:
  - Alert.Remediation == true && Alert.GetScope() == "Ip"
notifications:
  - slack_default

التنبيه على كل blockage يصبح ضوضاء سريعاً. أفضل: تنبيه على الهجمات المتكررة (بضع scenarios متتالية على نفس الـ IP) أو الـ scenarios الحرجة (sql injection، authentication bypass). الباقي يُحجب صامتاً، تراجعه أسبوعياً في الـ dashboard.

الخطوة 8 — Tuning والتطوير

بعد أسبوعين من التشغيل، راجع المعطيات: ما الـ scenarios الأكثر تفعيلاً؟ ما الـ false positives؟ ما الـ collections الناقصة؟

# مراجعة الإحصائيات:
sudo cscli metrics

# أعلى الـ scenarios المفعّلة:
sudo cscli alerts list --since 7d

# top sources:
sudo cscli decisions list --by ip

# False positive؟ احذف الـ decision وأضف whitelist:
sudo cscli decisions delete --ip 1.2.3.4
# ثم أضفه في whitelist parser

المراجعة الأسبوعية تستغرق 15 دقيقة، تكشف اتجاهات: زيادة في WordPress brute force = ربما تطبيق جديد ضعيف الحماية، زيادة في SSH = راجع كلمات المرور والـ keys. CrowdSec يصبح أداة intelligence أمنية، ليس فقط حاجزاً غبياً.

أخطاء شائعة

المشكلة السبب الحل
كل الزيارات محجوبة أنت IP محجوب cscli decisions delete –ip TON_IP
Bouncer لا يعمل API key غلط عدّل في /etc/crowdsec/bouncers/
Nginx لا يفهم Lua module غير محمّل load_module ngx_http_lua_module
Caddy خدمة قديمة لم يُبنى مع plugin xcaddy build مع plugin
Decisions لا تنطبق cache bouncer قديم أعد تحميل bouncer
الكثير من false positives scenarios ضيقة جداً tune scenarios أو whitelist

للمزيد

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

مشاركة