يُهيَّأ الخادم مرة واحدة ثم يعيش بعدها وحده. وبعد شهر تكون بعض الحزم في انتظار الترقية، وتكون الشهادة قد اقتربت إلى ثلاثة أسابيع من انتهائها، ويكون سطر زائد قد ظهر في إعدادات SSH بعد تثبيت شيء لا علاقة له بالأمر، ويكون السجن الذي يفترض أن يراقب عمليات الدخول قد توقف دون أن ينتبه أحد. لا شيء من هذا يصرخ. كل ما في الأمر أن الأشياء تكفّ بهدوء عن أن تكون صحيحة.
فيما يلي اثنا عشر أمرًا يستحق فحصها بانتظام، مع الأوامر. تستغرق الجولة نحو خمس عشرة دقيقة. والترتيب يسير مما يُدخَل منه إلى ما يتعطل من تلقاء نفسه.
SSH: خمسة أسطر
ما يجب النظر إليه ليس الملف بل الإعداد الفعلي: فهو يتركب من /etc/ssh/sshd_config ومن كامل الدليل sshd_config.d ومن القيم الافتراضية للبناء.
sudo sshd -T | grep -iE 'permitrootlogin|passwordauthentication|permitemptypasswords|maxauthtries|x11forwarding'
ما نريد رؤيته: permitrootlogin no وpasswordauthentication no وpermitemptypasswords no وmaxauthtries في حدود 3–4 وx11forwarding no. الثلاثة الأولى هي الباب، والأخيران مفصلاه: حدّ للمحاولات في الاتصال الواحد، وتمرير رسومي لا حاجة للخادم به.
تحفظان، وكلاهما طريق سهل إلى حبس النفس في الخارج. الأول: لا تعطّل الدخول بكلمة المرور ولا دخول الجذر قبل أن تتأكد من أن مفتاحك يعمل — في جلسة منفصلة، دون إغلاق الجلسة الحالية. فإن كنت تقرأ هذا وأنت داخل بصفة الجذر بكلمة مرور، فهذان السطران يحبسانك أنت بالذات في الخارج.
والثاني: ترتيب الملفات. يأخذ OpenSSH قيمة المعامل التي يصادفها أولًا، وتُقرأ ملفات sshd_config.d بالترتيب الأبجدي. وصور السحابة تترك هناك عادةً ملف 50-cloud-init.conf، وهو يتغلب على ملفك إن سمّيته شيئًا مثل 90-hardening.conf. إعداداتك الخاصة توضع تحت رقم أصغر — 00- أو 10-. والنتيجة تُفحص بالأمر sshd -T، لا بقراءة الملف.
الجدار الناري: فحص واحد
sudo ufw status verbose
ويجدر تذكّر أن هذا المخرج يعرض النوايا لا النتائج. فقد تقف قاعدة في القائمة ولا تغلق شيئًا: إما أن UFW نفسه معطّل، أو أن المنفذ يخدمه شيء نشره Docker (فهو يكتب قواعده في iptables تحت UFW)، أو أن حركة المرور تصل إلى الخادم من طريق آخر. لذا يفيد مقابلة قائمة القواعد بما يستمع فعلًا إلى الخارج:
sudo ss -tulpn | grep -v '127.0.0.1\|::1'
fail2ban: فحصان
لا يكفي أن تكون الخدمة تعمل — لا بد أيضًا من سجن عامل لأجل SSH.
sudo fail2ban-client status
sudo fail2ban-client status sshd
وأكثر المتاعب شيوعًا هنا هو سجن صامت. فعلى Debian 12 وإصدارات Ubuntu الحديثة قد لا يوجد /var/log/auth.log أصلًا: rsyslog غير مثبّت، والسجلات تعيش في journald وحده. عندها يبدأ السجن المضبوط على logpath المصنعي، ويعلن نفسه نشطًا، ولا يحظر أحدًا أبدًا. والعلاج توجيهه إلى سجل systemd:
printf '[sshd]\nenabled = true\nbackend = systemd\n' | sudo tee /etc/fail2ban/jail.d/sshd-systemd.local
sudo systemctl restart fail2ban
والعلامة التي تكشف ذلك دون نبش في الإعدادات: في fail2ban-client status sshd يبقى سطرا «Currently failed» و«Total failed» عند الصفر، بينما السجل يحوي محاولات دخول فاشلة بوضوح.
التحديثات: ثلاثة فحوص
كلٌّ على حدة: كم حزمة تنتظر إجمالًا، وكم منها أمنية، وهل يطلب النظام إعادة تشغيل بعد تحديث النواة.
sudo apt update
apt list --upgradable 2>/dev/null | grep -c -- '-security'
ls /var/run/reboot-required 2>/dev/null && echo 'إعادة التشغيل مطلوبة'
والفحص الثالث هو ما إذا كانت تحديثات الأمان التلقائية مفعّلة، كي لا يتحول الأولان إلى طقس شهري:
systemctl status unattended-upgrades --no-pager
cat /etc/apt/apt.conf.d/20auto-upgrades
ينبغي أن يحمل هذا الملف الرقم 1 في السطرين. وإن كانت الحزمة ناقصة: sudo apt install unattended-upgrades && sudo dpkg-reconfigure -plow unattended-upgrades.
الشهادات: فحص واحد
تعيش شهادة Let's Encrypt تسعين يومًا، والتجديد يعمل وحده تمامًا حتى اليوم الذي يتوقف فيه. وما يجب النظر إليه ليس لوحة المُسجِّل بل ما يقدّمه الخادم فعلًا:
echo | openssl s_client -connect localhost:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate
sudo certbot renew --dry-run
الأمر الأول يعطي تاريخ انتهاء الشهادة المقدَّمة لذلك الاسم، والثاني يتحقق من أن التجديد سيمرّ دون انتظار الموعد الحقيقي. ويفيد المرور على كل الأسماء التي يخدمها الخادم لا على النطاق الرئيسي وحده: فالمنسيّ عادةً هو النطاق الفرعي الذي أُضيف لاحقًا.
القرص: فحص واحد
df -h
df -i
أمران اثنان، لأن المساحة وسجلات الملفات تنفدان كل على حدة. وعلى معظم الخوادم يصطدم الثاني بالسقف أولًا: ملايين الملفات الصغيرة في جلسات PHP أو في ذاكرة التطبيق المؤقتة ترفع IUse% إلى 100 بينما تبقى غيغابايتات حرة. ولدينا مقال مستقل يفصّل الحالتين.
ما الخطأ في هذه القائمة
القائمة صحيحة، لكن فيها خاصية واحدة: تتطلب أن يتذكرها أحد. خمس عشرة دقيقة في الأسبوع ليست كثيرة، ما دام الخادم واحدًا وما دام هناك سبب. وبعد شهرين هادئين تُهمَل الجولة، ويصل خبر توقف السجن من سجلات غيرك.
لذلك جمعنا هذه الفحوص الاثني عشر بعينها في لوحة مجانية مستقلة — Arcivéo FREE. تُثبَّت بأمر واحد، وتعمل على خادمك أنت، ولا ترسل إلينا شيئًا، ولا تحتاج تسجيلًا. يعمل جامع البيانات من cron كل خمس دقائق ويكتب الأشياء نفسها في قاعدة محلية: عمليات دخول SSH والاتصالات المرفوضة، وحالة UFW وfail2ban، وتحديثات الأمان المعلّقة، ومواعيد الشهادات، ومساحة القرص. السجل التاريخي سبعة أيام، والواجهة بأربع وثلاثين لغة. والسعر صفر، حتى على خادم عمل: الرخصة تسمح بتثبيت اللوحة على أجهزتك، بما فيها أجهزة الشركة، ولا تسمح بإعادة بيعها ولا بتشغيلها خدمةً لخوادم الآخرين.
حزمة النسخة المجانية متواضعة: تثبّت UFW وfail2ban وتفعّلهما، ثم تعرض الحالة بعد ذلك. أما ModSecurity وSuricata وAIDE وبقية الوحدات فليست فيها، تلك تخص النسخة المدفوعة. لكنها تكفي لكي تتوقف عن حمل الجولة الأسبوعية في رأسك. وكيف تبدو البيانات نفسها على اللوحة الكاملة تعرضه صفحات العرض التوضيحي أدناه.