الدليل المجاني لـ 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_URL | jdbc:postgresql://…:5432/secumon | عنوان قاعدة البيانات، ويُكتب باسم الحاوية. |
F2B_CANONICAL_HOST | يجب تعيين قيمتك | اسم نطاق وحدة التحكم الخاص بك. أي وصول عبر HTTP غير المشفّر أو بعنوان آخر يُحوَّل إلى HTTPS على هذا العنوان. |
F2B_PROTECTED_CIDRS | يجب تعيين قيمتك | نطاقات لا تُحجب أبدًا — VPN الخاص بك · شبكتك الداخلية · عناوين IP العامة لخوادمك. أما الشبكات الخاصة · loopback فمحمية دائمًا بغض النظر عن هذه القيمة. |
F2B_BLOCK_TTL_DAYS | 30 | المدة الافتراضية لحجب النطاق (بالأيام). القيمة 0 تعني دائمًا. |
F2B_AUTO_BLOCK_ENABLED | true | تفعيل الحجب التلقائي لعناوين IP المتكررة أو تعطيله. |
F2B_AUTO_BLOCK_THRESHOLD | 3 | عدد مرات الحظر التي يبدأ عندها الحجب التلقائي. |
F2B_AUTO_BLOCK_TTL_DAYS | 30 | مدة الحجب التلقائي (بالأيام). |
F2B_FEED_REFRESH_HOURS | 24 | الفاصل الزمني لإعادة جلب قوائم الحجب العامة · قوائم الدول (بالساعات). |
F2B_BAN_MULTIPLIERS | 1 2 4 8 16 32 64 168 | اجعلها مطابقة تمامًا لمضاعفات إعداد jail. |
F2B_ABUSE_DAILY_LIMIT | 1000 | الحد اليومي لاستخدام AbuseIPDB. |
بعد التشغيل تحقّق من الحالة. إذا ظهر "db":"ok" فكل شيء سليم.
curl -s https://<عنوان وحدة التحكم>/api/health
4. تسجيل الخوادم — الوكيل
- سجّل الدخول إلى وحدة التحكم بحساب
admin، وأدخل اسم الخادم في تبويب الأهداف، ثم اضغط تسجيل + إصدار رمز. - يظهر على الشاشة معرّف الهدف ورمز لمرة واحدة. لا يظهر الرمز إلا هذه المرة فقط، وتنتهي صلاحيته بعد 15 دقيقة.
- شغّل سكربت التثبيت بصلاحيات 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.
fail2ban · nftables · AbuseIPDB · Spamhaus · FireHOL · Telegram · Let's Encrypt ملك لأصحابها، و SSem SecuMon غير تابع لها ولا معتمد منها.