الدليل المجاني لـ SSem SecuMon

بدءًا من خادم شخصي واحد · محدَّث حتى أكتوبر 2026

قريبًاتوزيع ملفات التثبيت قيد التحضير.

ننشر في هذا الدليل أولًا المتطلبات وترتيب التثبيت وما ينبغي معرفته أثناء التشغيل. وعند بدء التوزيع سنضع رابط التنزيل هنا.

1. المتطلبات

العنصرالشرط
الخوادم المراد حمايتهالينكس (systemd) + fail2ban · nftables · sqlite3. amd64 أو arm64. تم التحقق على Ubuntu 22.04 · CentOS 8.
خادم وحدة التحكمخادم واحد. JDK 21 · Tomcat 11 · PostgreSQL 17. التشغيل عبر Docker هو الأسهل.
الشبكةيجب أن تتمكن الخوادم من الاتصال بعنوان وحدة التحكم عبر HTTPS. لا حاجة لأي منفذ وارد إلى الخوادم. ننصح بوضع وحدة التحكم خلف VPN أو شبكة داخلية.
الساعةزامِن ساعات جميع الخوادم ووحدة التحكم عبر NTP. إذا انحرف وقت التوقيع أكثر من 60 ثانية يُرفض الطلب.
الشهادةشهادة HTTPS لوحدة التحكم (مثل Let's Encrypt). لا يُرسَل ملف تعريف ارتباط تسجيل الدخول إلا عبر HTTPS، لذا لا يمكن تسجيل الدخول عبر HTTP غير المشفّر.

ثبّت الحزم أولًا على كل خادم تريد حمايته.

# Debian · Ubuntu
apt-get update && apt-get install -y fail2ban nftables sqlite3
# RHEL · Rocky · CentOS
dnf install -y epel-release && dnf install -y fail2ban nftables sqlite
systemctl enable --now fail2ban

2. تفعيل الحظر الأُسّي في fail2ban

اضبطه بحيث يطول الحظر كلما عاد عنوان IP نفسه. يحسب SecuMon بهذه المضاعفات «المستوى الحالي» و«مدة الحظر التالي».

# /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
bantime.increment   = true
bantime.multipliers = 1 2 4 8 16 32 64 168
bantime.maxtime     = 168h
ignoreip = 127.0.0.1/8 ::1 <نطاق VPN الخاص بك>

# /etc/fail2ban/fail2ban.local — الاحتفاظ بسجل التكرار 60 يومًا (مع القيمة الافتراضية يوم واحد يعود المخالف جديدًا بعد يوم)
[DEFINITION]
dbpurgeage = 60d

بهذا الإعداد تكون مدد الحظر كما يلي. يضيف fail2ban وقتًا عشوائيًا قليلًا، لذا تختلف القيم الفعلية قليلًا.

الحظر التراكميالمرة 1المرة 2المرة 3المرة 4المرة 5المرة 6المرة 7المرة 8 فأكثر
مدة الحظرساعة واحدةساعتان4 ساعات8 ساعات16 ساعة32 ساعة64 ساعة7 أيام

أضِف بالتأكيد طريق وصولك (نطاق VPN وغيره) إلى ignoreip، فهذا يمنع أن تُحظر من خادمك لمجرد أنك أخطأت في كلمة المرور بضع مرات.

3. تثبيت وحدة التحكم

3-1. ملفات الأسرار

لا تُكتب القيم السرية في الشيفرة ولا في متغيرات البيئة، بل تُحفظ كملفات في مجلد واحد. تُركّب حاوية وحدة التحكم هذا المجلد على /App/secrets للقراءة فقط.

mkdir -p /srv/secumon/secrets/tls && chmod 700 /srv/secumon
cd /srv/secumon/secrets
openssl rand -hex 24 > db_password
openssl rand -base64 18 > admin_password      # كلمة مرور أول تسجيل دخول (اسم الحساب admin)
openssl genpkey -algorithm ed25519 -out console_ed25519.key
openssl pkey -in console_ed25519.key -pubout -out console_ed25519.key.pub
# أذونات الملفات 644 كي يقرأها حساب الحاوية — والحماية يتولاها المجلد الأعلى بـ 700
chmod 644 db_password admin_password console_ed25519.key console_ed25519.key.pub
الملفالغرضعند غيابه
db_passwordالاتصال بقاعدة البياناتلا تبدأ وحدة التحكم
admin_passwordكلمة مرور أول حساب مسؤول adminلا يُنشأ الحساب فلا يمكن تسجيل الدخول
console_ed25519.key · .pubتوقيع الأوامرالعرض فقط، دون إمكانية التنفيذ
abuseipdb.keyمفتاح AbuseIPDB API (اختياري)لا يمكن استخدام الإبلاغ · الاستعلام عن السمعة
telegram.envإشعارات Telegram (اختياري)لا تُرسَل الإشعارات
tls/cert.pem · chain.pem · privkey.pemشهادة HTTPS لوحدة التحكملا تعمل عبر HTTPS

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

3-2. قاعدة البيانات

لا يُفتح منفذ قاعدة البيانات للخارج. تتصل وحدة التحكم بها باسم الحاوية داخل شبكة Docker نفسها.

docker network create secumon-net
docker run -d --name secumon-db --network secumon-net --restart unless-stopped \
  -e POSTGRES_DB=secumon -e POSTGRES_USER=secumon \
  -e POSTGRES_PASSWORD_FILE=/run/secrets/db_password \
  -v /srv/secumon/secrets/db_password:/run/secrets/db_password:ro \
  -v secumon_pgdata:/var/lib/postgresql/data \
  postgres:17

تُنشئ وحدة التحكم الجداول والبيانات الأساسية بنفسها عند أول تشغيل، فلا حاجة لإدخال المخطط يدويًا عبر psql.

3-3. إعدادات وحدة التحكم

وحدة التحكم تطبيق ويب يعمل على Tomcat 11. ستُنشر طريقة التشغيل مع حزمة التوزيع، ونلخّص هنا أولًا متغيرات البيئة التي يجب تحديدها.

متغير البيئةالقيمة الافتراضيةالمعنى
F2B_DB_URLjdbc:postgresql://…:5432/secumonعنوان قاعدة البيانات، ويُكتب باسم الحاوية.
F2B_CANONICAL_HOSTيجب تعيين قيمتكاسم نطاق وحدة التحكم الخاص بك. أي وصول عبر HTTP غير المشفّر أو بعنوان آخر يُحوَّل إلى HTTPS على هذا العنوان.
F2B_PROTECTED_CIDRSيجب تعيين قيمتكنطاقات لا تُحجب أبدًا — VPN الخاص بك · شبكتك الداخلية · عناوين IP العامة لخوادمك. أما الشبكات الخاصة · loopback فمحمية دائمًا بغض النظر عن هذه القيمة.
F2B_BLOCK_TTL_DAYS30المدة الافتراضية لحجب النطاق (بالأيام). القيمة 0 تعني دائمًا.
F2B_AUTO_BLOCK_ENABLEDtrueتفعيل الحجب التلقائي لعناوين IP المتكررة أو تعطيله.
F2B_AUTO_BLOCK_THRESHOLD3عدد مرات الحظر التي يبدأ عندها الحجب التلقائي.
F2B_AUTO_BLOCK_TTL_DAYS30مدة الحجب التلقائي (بالأيام).
F2B_FEED_REFRESH_HOURS24الفاصل الزمني لإعادة جلب قوائم الحجب العامة · قوائم الدول (بالساعات).
F2B_BAN_MULTIPLIERS1 2 4 8 16 32 64 168اجعلها مطابقة تمامًا لمضاعفات إعداد jail.
F2B_ABUSE_DAILY_LIMIT1000الحد اليومي لاستخدام AbuseIPDB.

بعد التشغيل تحقّق من الحالة. إذا ظهر "db":"ok" فكل شيء سليم.

curl -s https://<عنوان وحدة التحكم>/api/health

4. تسجيل الخوادم — الوكيل

  1. سجّل الدخول إلى وحدة التحكم بحساب admin، وأدخل اسم الخادم في تبويب الأهداف، ثم اضغط تسجيل + إصدار رمز.
  2. يظهر على الشاشة معرّف الهدف ورمز لمرة واحدة. لا يظهر الرمز إلا هذه المرة فقط، وتنتهي صلاحيته بعد 15 دقيقة.
  3. شغّل سكربت التثبيت بصلاحيات root على الخادم المراد حمايته.
# على الخادم المراد حمايته (root)
tar xzf agent-amd64.tgz && cd agent
./install-agent.sh --console https://<عنوان وحدة التحكم> \
    --target-id <معرّف الهدف> --token <الرمز لمرة واحدة>
journalctl -u secumon-agent -f      # إذا ظهر سطر مثل الذي أدناه خلال 30 ثانية فكل شيء سليم

عند نجاح العمل سيظهر سطر مثل هذا secumon-agent: 2026/10/06 16:40:12 전송 완료 — jail 2개, 밴 5건

هذا كل ما يفعله سكربت التثبيت، ولا يفتح أي منفذ في جدار الحماية.

  • ينشئ حسابًا مخصّصًا f2bagent لا يمكن تسجيل الدخول به — فالوكيل لا يعمل بصلاحيات root.
  • يسمح عبر sudo بمغلِّف واحد فقط بصلاحيات root هو /usr/local/sbin/f2b-agent-exec.
  • يُنشئ مفتاح توقيع الوكيل على ذلك الخادم نفسه، فلا يغادر المفتاح الخاص الخادم عبر الشبكة.
  • بعد التسجيل في وحدة التحكم يُشغَّل كخدمة دائمة باسم secumon-agent.

لا تستخدم في عنوان وحدة التحكم اسم مضيف يحتوي على شرطة سفلية (_). إذ يرفضه Tomcat 11 لمخالفته المواصفات. وتحقّق أولًا من أن الخادم يستطيع تحليل اسم نطاق وحدة التحكم باستخدام getent hosts <اسم نطاق وحدة التحكم>.

إذا اكتمل التسجيل لكن فشلت خطوة لاحقة، فأصلح السبب ثم أعد تشغيل الأمر نفسه كما هو. الوكيل المسجَّل مسبقًا لا يستخدم الرمز مرة أخرى.

لإزالة خادم، استخدم تعطيل في وحدة التحكم (تُرفض طلبات ذلك الوكيل فورًا)، ثم نفّذ على الخادم systemctl disable --now secumon-agent.

5. قراءة الشاشات

  • لوحة المعلومات — الحظر الحالي · الحظر التراكمي · عناوين IP المتكررة · الاتجاه لجميع الخوادم. إذا تجاوز «آخر استلام» في بطاقة الخادم 30 ثانية بكثير، فتحقّق من وكيل ذلك الخادم.
  • قائمة الحظر — عناوين IP المحظورة الآن، مع مستوى التكرار · الوقت المتبقي · الدولة. تُستخرج الدولة من جدول بحث مدمج في وحدة التحكم.
  • تفاصيل IP — الخوادم التي حظرت ذلك العنوان، وسجل الحظر، والمدة المتوقعة للحظر التالي، وسمعته في AbuseIPDB.

يُقرأ «الحظر الحالي» من القائمة التي يحظرها fail2ban فعليًا الآن، و«عدد مرات التكرار» من سجل الحظر في fail2ban، كلٌّ على حدة. لذلك لا يظهر حظرٌ انتهى بالفعل على أنه حظر حالي.

6. الحظر · رفع الحظر · حجب النطاقات

  • الحظر · رفع الحظر متاحان للمشغِّل فما فوق. يمكن حظر أي عنوان IP، وإن لم تختر jail فالافتراضي sshd.
  • حجب النطاقات للمسؤول فقط. لا يُنفَّذ إلا بعد إعادة كتابة النطاق المراد حجبه، ويُرفض إن كان أوسع من IPv4 /16 · IPv6 /48. ويُرفع تلقائيًا بعد 30 يومًا افتراضيًا.
  • يمكن تطبيق عدة نطاقات × عدة خوادم دفعة واحدة. ولا يصدر أي أمر ما لم تجتز جميعها الفحص — لأن الحالة التي يُطبَّق فيها نصفها فقط هي الأخطر.
  • لا يُنفَّذ الأمر إلا إذا جلبه وكيل الخادم خلال 60 ثانية. وتظهر النتيجة في سجل الأوامر بتبويب التنفيذ: مكتمل · فاشل · منتهي الصلاحية.

إذا حجبت شيئًا عن طريق الخطأ، فارفعه من التنفيذ ← إلغاء الحجب في وحدة التحكم. وإن كان الأمر عاجلًا إلى حدّ تعذّر الدخول إلى وحدة التحكم، فاحذفه مباشرة على ذلك الخادم.

# نطاق واحد فقط
nft delete element inet f2b_console blocklist4 '{ 203.0.113.0/24 }'
# كل الحجب الذي أضافه SecuMon (قواعد fail2ban في جدول آخر فتبقى كما هي)
nft delete table inet f2b_console

7. الحجب التلقائي

الحجب التلقائي لعناوين IP المتكررة

يختار كل 5 دقائق عناوين IP التي حُظرت 3 مرات فأكثر تراكميًا، ويطبّق عليها حجبًا لمدة 30 يومًا على جميع الخوادم. ولأنها الميزة الوحيدة التي تغيّر جدار الحماية دون موافقة بشرية، فقد قُيّدت بعدة طبقات.

  • لا يحجب نطاقات، بل عناوين IP مفردة فقط (/32 · /128).
  • يتخطى النطاقات المحمية، ولا يُصدر أكثر من 20 أمرًا في كل مرة.
  • لا يصعّد العنوان نفسه مرتين، ويسجّل كل شيء في سجل التدقيق ويرسله إلى Telegram.

لإيقافه، مرّر F2B_AUTO_BLOCK_ENABLED=false إلى وحدة التحكم وأعد تشغيلها. أما العنوان المحجوب خطأً، فارفع حجبه أولًا عبر إلغاء الحجب، ثم احذف سجل التصعيد حتى يُعاد تقييمه لاحقًا.

docker exec secumon-db psql -U secumon -d secumon -c "DELETE FROM auto_block WHERE ip = '<IP>'"

قوائم الحجب العامة

فعّلها من تبويب موجزات الحجب. كلتاهما معطّلة في البداية.

  • Spamhaus DROP — نطاقات مخطوفة أو مخصّصة للجريمة فقط. لا يمكن أن تصدر عنها حركة مرور مشروعة، فلا يكاد يوجد قلق من الإيجابيات الكاذبة.
  • FireHOL level1 — عناوين غير مستخدمة ونطاقات خبيثة مؤكدة. وتتضمن أيضًا شبكات خاصة، لذا تستبعد وحدة التحكم الإدخالات المتداخلة مع النطاقات المحمية قبل الإرسال.

يُعاد جلبها مرة يوميًا، وإن لم يتغير المحتوى فلا تُرسَل إلى الخوادم من جديد. والنطاقات التي تُحذف من القائمة يُرفع حجبها تلقائيًا عند التحديث التالي.

8. حجب الدول — قبل التفعيل

الخدمات التي يجب أن يصل إليها العالم كله لا يمكن حجبها حسب الدولة.

  • خادم DNS موثوق — لا يُحلّ اسم نطاقك إلا إذا وصلت إليه المحلِّلات من كل أنحاء العالم. ويسمح SecuMon دائمًا بالمنفذ 53.
  • استقبال البريد (25) · VPN — إن حجبتها انقطع البريد، ولن تستطيع الدخول إلى خادمك من خارج البلاد. لا تفعّل حجب الدول على مثل هذه الخوادم.
  • روبوتات محركات البحث — حجب دولة كبيرة يحجب معها روبوتات البحث، وقد يختفي موقعك من نتائج البحث.

عند اختيار دولة في تبويب حجب الدول يُعرض عدد نطاقاتها أولًا. وعند التطبيق تُجلب القائمة فورًا وتصل إلى جميع الخوادم خلال 30 ثانية، وعند الإيقاف تُحذف قائمة تلك الدولة. وقد تبلغ نطاقات الدول الكبيرة عشرات الآلاف.

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

يسمح SecuMon بـردود الاتصالات القائمة في مقدمة قواعد جدار الحماية. ومن دون هذه القاعدة، تُحجب حتى ردود الاتصالات التي يبدأها خادمك نحو خدمات تلك الدولة (مرايا الحزم · واجهات API للإشعارات · إصدار الشهادات).

9. AbuseIPDB · Telegram

AbuseIPDB

يُفعَّل بوضع abuseipdb.key في مجلد الأسرار. يبقى المفتاح على خادم وحدة التحكم فقط، ولا يخرج أبدًا إلى الواجهة · قاعدة البيانات · الخوادم.

  • لا يمكن الإبلاغ إلا عن عناوين IP المحظورة حاليًا أو التي حُظرت خلال آخر 30 يومًا — لا يمكن الإبلاغ عن عنوان IP عشوائي.
  • لا يُعاد الإبلاغ عن العنوان نفسه خلال 15 دقيقة، وتحسب وحدة التحكم الحد اليومي بنفسها.
  • تُحدَّد الفئة حسب اسم jail — ssh: 18 · 22، الويب (apache · nginx): 18 · 21، البريد: 18 · 11، غير ذلك: 18.

Telegram

# /srv/secumon/secrets/telegram.env
TELEGRAM_TOKEN=<رمز البوت>
TELEGRAM_CHAT_ID=<معرّف المحادثة>

يُرسل إشعارات عند الحجب التلقائي للمتكررين وتغيّر القوائم العامة، وتُرفق القائمة كاملة كملف. وإن لم يتغير شيء فلا يُرسل إشعارًا — فلو وصلتك يوميًا رسالة «لا تغيير» لفاتك الإشعار المهم حقًا.

10. الحسابات · المصادقة الثنائية

الدورما يمكنه فعله
VIEWER للعرض فقطعرض لوحة المعلومات · قائمة الحظر · تفاصيل IP · سجل الأوامر
OPERATOR مشغِّل+ الحظر · رفع الحظر · الإبلاغ إلى AbuseIPDB والاستعلام عن السمعة
ADMIN مسؤول+ حجب النطاقات · تسجيل الخوادم · موجزات الحجب · حجب الدول · المستخدمون · سجل التدقيق
  • أول تسجيل دخول يكون بـ admin وكلمة المرور الموجودة في ملف admin_password. بعد الدخول غيّر كلمة المرور من حسابي.
  • من حسابي ← المصادقة الثنائية امسح رمز QR بتطبيق المصادقة أو أدخل الرمز يدويًا. لا يمكن استخدام الرمز نفسه مرتين.
  • بعد 5 محاولات خاطئة لكلمة المرور يُقفل الحساب 15 دقيقة، ولا يُسمح من عنوان IP واحد إلا بـ 10 محاولات في الدقيقة. ويُسجَّل الخروج تلقائيًا بعد 30 دقيقة من عدم النشاط.

إذا فقدت تطبيق المصادقة فلا يمكن تعطيل المصادقة الثنائية من الواجهة، بل يعطّلها مباشرة في قاعدة البيانات شخصٌ لديه وصول إلى خادم وحدة التحكم.

docker exec secumon-db psql -U secumon -d secumon -c \
  "UPDATE app_user SET totp_enabled=false, totp_secret=NULL, totp_last_counter=0 WHERE username='admin';"

11. النسخ الاحتياطي · إدارة المفاتيح

# قاعدة البيانات — كلمات المرور مجزّأة، ورموز التسجيل أيضًا مخزّنة كتجزئة فقط
docker exec secumon-db pg_dump -U secumon secumon | gzip > secumon-$(date +%F).sql.gz
# مجلد الأسرار — هذا هو السر الحقيقي. احفظه في مكان غير مكان نسخة قاعدة البيانات
tar czf secumon-secrets-$(date +%F).tgz -C /srv/secumon secrets
  • إذا غيّرت مفتاح توقيع وحدة التحكم، فسيرفض جميع الوكلاء الأوامر. فإن غيّرته، فأعد تسجيل كل خادم بهذا الترتيب: تعطيل ← إعادة إصدار الرمز ← حذف /etc/secumon/agent.json · agent_ed25519.key من الخادم ← إعادة التثبيت.
  • ما يجب مراجعته دوريًا: يوميًا حالة الخوادم والأوامر الفاشلة، وأسبوعيًا سجلات الرفض في سجل التدقيق والحسابات التي لم تفعّل المصادقة الثنائية.

12. حل المشكلات

تُطبع رسائل الوكيل ووحدة التحكم باللغة الكورية. ابحث في السجل عن النص المطابق تمامًا لما يظهر بخط الشيفرة في الجدول أدناه.

ما تراهالسببما العمل
سجل الوكيل 등록되지 않았거나 비활성 상태인 타겟خادم معطّل في وحدة التحكماحصل على رمز جديد وأعد التسجيل
سجل الوكيل 요청 시각 편차가 허용치를 넘습니다ساعة الخادم منحرفة أكثر من 60 ثانيةزامِن الساعة عبر NTP
سجل الوكيل 이미 사용된 nonceوصل الطلب نفسه مرة أخرىدفاع طبيعي. إن استمر فاشتبه في إرسال مكرَّر عبر الشبكة
نتيجة الأمر 거부: 만료된 명령لم يتمكن الوكيل من جلبه خلال 60 ثانيةتحقّق من حالة secumon-agent على الخادم ثم أعد التنفيذ
نتيجة الأمر 거부: 서명이 유효하지 않음لم يُعَد التسجيل بعد تغيير مفتاح توقيع وحدة التحكمأعد التسجيل وفق خطوات القسم 11
توقّف «آخر استلام» في بطاقة الخادم · انقطاع السجلاتتوقّف الوكيلsystemctl restart secumon-agent
فُعِّل حجب الدول لكنه لم يظهر على الخادمهذا السطر غير موجود في سجل الوكيل: 국가 차단 적용تحقّق من أن الوكيل بأحدث إصدار، وراجع الأخطاء في السجل
يُسجَّل الخروج باستمرارالاتصال عبر عنوان غير HTTPSاتصل عبر عنوان HTTPS لوحدة التحكم

لمزيد من الاستفسارات، راسلنا على halo@levelupsoft.com.