0%
أمن لينكس: تحصين خادم في بيئة الإنتاج

أمن لينكس: تحصين خادم في بيئة الإنتاج

دليل لتحصين خادم لينكس: SSH بالمفاتيح، جدران الحماية ufw وfirewalld، وfail2ban، والتحديثات التلقائية، وauditd، ومبدأ أقل قدر من الصلاحيات.

I

InSkillCoach

· دقيقة

أمن لينكس: تحصين خادم في بيئة الإنتاج

يتلقى خادم لينكس المكشوف على الإنترنت أولى محاولات الاختراق خلال دقائق من تشغيله: فحص للمنافذ، وتجريب لكلمات مرور SSH، واستغلال لخدمات سيئة الإعداد. والخبر الجيد أن حفنة من الإجراءات البسيطة تقضي على الغالبية العظمى من هذه الهجمات الانتهازية. في هذا الدليل نحصّن خادمًا خطوة بخطوة: SSH، وجدار الحماية، وfail2ban، والتحديثات التلقائية، والصلاحيات، والتدقيق، ومراقبة المنافذ. يتضمن كل قسم الأوامر الدقيقة التي جرى اختبارها على Debian/Ubuntu وRocky Linux/Fedora. وتختتم المقال قائمة مراجعة ختامية.

1. تحصين SSH

يُعدّ SSH البوابة الرئيسية لخادمك، ولذلك فهو الهدف الأول للمهاجمين. وثمة ثلاثة إجراءات لا غنى عنها: المصادقة بالمفاتيح، وتعطيل الدخول بحساب root، وتعطيل كلمات المرور.

المصادقة بالمفاتيح

# Sur votre machine locale : générer une paire de clés ed25519
ssh-keygen -t ed25519 -C "admin@poste-travail"

# Copier la clé publique sur le serveur
ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@serveur.exemple.com

# Vérifier la connexion par clé AVANT de désactiver les mots de passe
ssh -i ~/.ssh/id_ed25519 admin@serveur.exemple.com

إعداد خدمة SSH

حرّر الملف /etc/ssh/sshd_config (أو الأفضل أن تنشئ ملفًا داخل /etc/ssh/sshd_config.d/):

# /etc/ssh/sshd_config.d/10-durcissement.conf

# Interdire la connexion directe en root
PermitRootLogin no

# Désactiver l'authentification par mot de passe : clés uniquement
PasswordAuthentication no
KbdInteractiveAuthentication no

# Limiter les utilisateurs autorisés à se connecter
AllowUsers admin deploy

# Réduire la fenêtre d'authentification et les tentatives
LoginGraceTime 30
MaxAuthTries 3

# Déconnecter les sessions inactives après 15 minutes
ClientAliveInterval 300
ClientAliveCountMax 3
# Valider la syntaxe avant de recharger : une erreur peut vous enfermer dehors
sudo sshd -t

# Recharger la configuration
sudo systemctl reload ssh     # Debian/Ubuntu
sudo systemctl reload sshd    # Rocky/Fedora

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

تغيير المنفذ: مفيد لكنه غير كافٍ

إن نقل SSH من المنفذ 22 إلى منفذ غير قياسي لا يحمي من مهاجم يستهدفك بعينك، لكنه يقلّل بشكل كبير من ضجيج الفحص الآلي في سجلاتك.

# Dans /etc/ssh/sshd_config.d/10-durcissement.conf
Port 2222

لا تنسَ فتح هذا المنفذ في جدار الحماية قبل إعادة تحميل SSH، ثم تحديده عند الاتصال: ssh -p 2222 admin@serveur.

2. جدار الحماية: ufw وfirewalld

المبدأ: حظر كل ما يرد افتراضيًا، ثم فتح المنافذ الضرورية فقط.

ufw (Debian/Ubuntu)

# Installer et définir les politiques par défaut
sudo apt install ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing

# IMPÉRATIF : autoriser SSH avant d'activer le pare-feu
sudo ufw allow 2222/tcp comment 'SSH'

# Ouvrir les ports web
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'

# Restreindre un port à une adresse IP source (ex. base de données)
sudo ufw allow from 10.0.0.5 to any port 5432 proto tcp

# Activer le pare-feu
sudo ufw enable

# Vérifier les règles avec leurs numéros
sudo ufw status numbered

# Supprimer une règle par son numéro
sudo ufw delete 3

firewalld (Rocky Linux/Fedora)

# Vérifier que firewalld est actif
sudo systemctl enable --now firewalld

# Lister la configuration de la zone active
sudo firewall-cmd --list-all

# Ouvrir des services de façon permanente
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https

# Ouvrir un port personnalisé
sudo firewall-cmd --permanent --add-port=2222/tcp

# Retirer un service ouvert par défaut si inutile
sudo firewall-cmd --permanent --remove-service=cockpit

# Appliquer les changements permanents
sudo firewall-cmd --reload

3. fail2ban: حظر المهاجمين

يقرأ fail2ban السجلات، ويكتشف محاولات المصادقة المتكررة، ويحظر عنوان IP المخالف عبر جدار الحماية.

# Installation
sudo apt install fail2ban          # Debian/Ubuntu
sudo dnf install fail2ban          # Rocky/Fedora

لا تعدّل الملف jail.conf أبدًا: أنشئ ملف jail.local الذي يتجاوز إعداداته.

# /etc/fail2ban/jail.local
[DEFAULT]
# Bannir 1 heure après 5 échecs en 10 minutes
bantime  = 1h
findtime = 10m
maxretry = 5
# Ne jamais bannir vos propres adresses
ignoreip = 127.0.0.1/8 ::1 203.0.113.10

[sshd]
enabled = true
port    = 2222
# Activer et vérifier
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd

# Débannir une adresse par erreur
sudo fail2ban-client set sshd unbanip 198.51.100.7

# Durcissement progressif : doubler la durée à chaque récidive
# (à ajouter dans [DEFAULT] de jail.local)
# bantime.increment = true
# bantime.maxtime   = 1w

4. التحديثات التلقائية

تستغل معظم عمليات الاختراق ثغرات سبق إصلاحها. لذا أتمتِ على الأقل التحديثات الأمنية.

Debian/Ubuntu: unattended-upgrades

# Installation et activation
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

# Vérifier la configuration
cat /etc/apt/apt.conf.d/20auto-upgrades
# APT::Periodic::Update-Package-Lists "1";
# APT::Periodic::Unattended-Upgrade "1";

# Tester en simulation
sudo unattended-upgrade --dry-run --debug

في الملف /etc/apt/apt.conf.d/50unattended-upgrades يمكنك تفعيل إعادة التشغيل التلقائية في ساعات الهدوء:

Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";

Rocky/Fedora: dnf-automatic

sudo dnf install dnf-automatic

# Dans /etc/dnf/automatic.conf : appliquer uniquement la sécurité
# upgrade_type = security
# apply_updates = yes

sudo systemctl enable --now dnf-automatic.timer

5. الصلاحيات وumask

التحقق من الملفات الحساسة

# Les fichiers de mots de passe doivent être strictement protégés
ls -l /etc/shadow
# Attendu : -rw-r----- root shadow (640) ou plus restrictif

# Trouver les fichiers world-writable (dangereux)
sudo find / -xdev -type f -perm -0002 -not -path "/proc/*" 2>/dev/null

# Trouver les binaires setuid (à auditer régulièrement)
sudo find / -xdev -type f -perm -4000 2>/dev/null

# Les clés SSH privées doivent être en 600
chmod 600 ~/.ssh/id_ed25519
chmod 700 ~/.ssh

umask: الصلاحيات الافتراضية

يحدد umask الصلاحيات التي تُسحب من الملفات الجديدة. فمع umask بقيمة 022 يُنشأ الملف بصلاحيات 644، ومع 027 بصلاحيات 640 (دون أي وصول لـ«الآخرين»).

# Vérifier le umask courant
umask

# Durcir pour les nouveaux fichiers : ajouter dans /etc/profile.d/umask.sh
echo "umask 027" | sudo tee /etc/profile.d/umask.sh
umaskالملف المُنشأالمجلد المُنشأالاستخدام
022644 (rw-r—r—)755 (rwxr-xr-x)القيمة الافتراضية المعتادة
027640 (rw-r-----)750 (rwxr-x---)موصى بها للخادم المحصَّن
077600 (rw-------)700 (rwx------)بيانات خاصة تمامًا

6. auditd: تتبع الإجراءات الحساسة

يسجّل auditd أحداث النظام على مستوى النواة: الوصول إلى الملفات الحرجة، واستدعاءات النظام، وتنفيذ الأوامر.

# Installation
sudo apt install auditd audispd-plugins   # Debian/Ubuntu
sudo dnf install audit                     # Rocky/Fedora
sudo systemctl enable --now auditd

قواعد مفيدة في الملف /etc/audit/rules.d/durcissement.rules:

# Surveiller toute modification des comptes et de sudo
-w /etc/passwd -p wa -k comptes
-w /etc/shadow -p wa -k comptes
-w /etc/sudoers -p wa -k sudoers
-w /etc/sudoers.d/ -p wa -k sudoers

# Surveiller la configuration SSH
-w /etc/ssh/sshd_config -p wa -k sshd

# Tracer les commandes exécutées en root (architecture 64 bits)
-a always,exit -F arch=b64 -F euid=0 -S execve -k commandes_root
# Charger les règles et vérifier
sudo augenrules --load
sudo auditctl -l

# Rechercher les événements par clé
sudo ausearch -k sudoers --start today

# Rapport résumé des authentifications
sudo aureport -au --summary

7. مراقبة المنافذ: ss وnmap

المنظور الداخلي مع ss

# Tous les ports TCP et UDP en écoute, avec le processus associé
sudo ss -tulpn

# Uniquement les ports TCP en écoute
sudo ss -tlnp

# Connexions établies vers l'extérieur
ss -tn state established

يجب أن يقابل كل سطر في ناتج ss -tulpn خدمة تعرفها وقد ثبّتّها عن قصد. أما أي منفذ مجهول في وضع الاستماع فيستحق تحقيقًا فوريًا.

المنظور الخارجي مع nmap

افحص خادمك من جهاز آخر لترى ما يراه المهاجم فعلًا:

# Scan des 1000 ports TCP les plus courants
nmap serveur.exemple.com

# Scan complet de tous les ports TCP avec détection de version
nmap -p- -sV serveur.exemple.com

# Scan UDP des ports courants (lent, nécessite root)
sudo nmap -sU --top-ports 50 serveur.exemple.com

لا تفحص إلا الأجهزة التي تملكها أو التي لديك إذن كتابي بفحصها.

تعطيل الخدمات غير الضرورية

# Lister les services actifs
systemctl list-units --type=service --state=running

# Désactiver et arrêter un service superflu
sudo systemctl disable --now cups

8. مبدأ أقل قدر من الصلاحيات

يجب ألا يملك أي عملية أو مستخدم أو خدمة سوى الصلاحيات الضرورية تمامًا لأداء وظيفته.

# Créer un utilisateur système sans shell pour un service applicatif
sudo useradd --system --no-create-home --shell /usr/sbin/nologin monapp

# Limiter sudo à une commande précise plutôt que ALL
# Dans /etc/sudoers.d/deploy (via visudo -f) :
# deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart monapp

على مستوى systemd، اعزل خدماتك داخل بيئة معزولة (sandbox) عبر ملف الوحدة الخاص بها:

# Extrait de /etc/systemd/system/monapp.service
[Service]
User=monapp
# Interdire l'acquisition de nouveaux privilèges
NoNewPrivileges=true
# Système de fichiers en lecture seule sauf exceptions
ProtectSystem=strict
ReadWritePaths=/var/lib/monapp
# /home inaccessible
ProtectHome=true
# /tmp privé
PrivateTmp=true
# Mesurer l'exposition d'un service (score de 0 à 10, plus bas = mieux)
systemd-analyze security monapp.service

وأخيرًا، أبقِ SELinux (على Rocky/Fedora) أو AppArmor (على Debian/Ubuntu) مفعّلًا: فهما يحصران الخدمات المخترَقة في نطاق محدود.

# Vérifier l'état de SELinux
getenforce
# Attendu : Enforcing

# Vérifier l'état d'AppArmor
sudo aa-status

9. قائمة مراجعة التحصين

الإجراءأمر التحققالحالة المتوقعة
SSH بالمفاتيح فقطsudo sshd -T | grep passwordauthenticationpasswordauthentication no
منع الدخول بحساب rootsudo sshd -T | grep permitrootloginpermitrootlogin no
جدار الحماية مفعّلsudo ufw status أو sudo firewall-cmd --stateactive / running
حظر الوارد افتراضيًاsudo ufw status verbosedeny (incoming)
fail2ban قيد التشغيلsudo fail2ban-client status sshdسجن sshd مفعّل
تحديثات أمنية تلقائيةsystemctl status unattended-upgrades أو dnf-automatic.timerمفعّل
لا منفذ غير متوقعsudo ss -tulpnالخدمات المعروفة فقط
لا ملفات قابلة للكتابة من الجميعfind / -xdev -type f -perm -0002قائمة فارغة
umask محصَّنumask0027
auditd قيد التشغيلsudo auditctl -lقواعد محمّلة
SELinux/AppArmor مفعّلgetenforce / aa-statusEnforcing / ملفات تعريف محمّلة
تعطيل الخدمات الزائدةsystemctl list-units --type=service --state=runningقائمة دنيا

أفضل الممارسات

  • اختبر كل تغيير في SSH داخل جلسة ثانية قبل إغلاق الأولى: فهي شبكة أمانك من حبس نفسك خارج الخادم.
  • افتح منفذ SSH في جدار الحماية قبل تفعيله، لا بعده أبدًا.
  • أضف عناوين IP الخاصة بالإدارة إلى ignoreip في fail2ban كي لا تحظر نفسك أبدًا.
  • لا تعطّل SELinux أو AppArmor أبدًا من أجل «حل» مشكلة ما: صحّح السياسة بدلًا من ذلك.
  • دقّق في المنافذ المستمِعة (ss -tulpn) بعد كل تثبيت لبرنامج.
  • أعد تطبيق قائمة المراجعة كاملة بعد كل ترقية كبرى للنظام.
  • انقل سجلاتك إلى خادم بعيد: فالمهاجم الذي يحصل على صلاحيات root يمحو الآثار المحلية.
  • الأمن عملية مستمرة وليس حالة ثابتة: خصّص مراجعة فصلية لهذه القائمة.

الخلاصة

لا يتطلب تحصين خادم لينكس أدوات غريبة ولا ميزانية: يكفي تقييد SSH بالمفاتيح، وجدار حماية بقائمة سماح، وfail2ban، وتحديثات تلقائية، وصلاحيات صارمة، وauditd، ومراجعة دورية للمنافذ، لدرء الغالبية الساحقة من الهجمات الانتهازية التي تجتاح الإنترنت باستمرار. والخيط الناظم لكل هذه الإجراءات هو مبدأ أقل قدر من الصلاحيات: فكل وصول غير ضروري هو وصول ينبغي إلغاؤه.

طبّق قائمة المراجعة الواردة في القسم 9 على كل خادم لديك، وأتمتها ضمن سكربتات التهيئة، وستنطلق من أساس سليم تعززه لاحقًا الإجراءات المتقدمة (إعداد SELinux أدق، وتجميع السجلات مركزيًا، وكشف التسلل).

InSkillCoach

نبذة عن InSkillCoach

خبير في التدريب والتقنيات

مدرّب متخصص في التقنيات المتقدمة والذكاء الاصطناعي، تدعمه شركة GNeurone Inc.

الشهادات:

  • AWS Certified Solutions Architect – Professional
  • شهادات Google Cloud
  • Microsoft Certified: DevOps Engineer Expert
  • Certified Kubernetes Administrator (CKA)
  • CompTIA Security+
1.4k
114

التعليقات

التعليقات مدعومة عبر GitHub Discussions

سجّل الدخول باستخدام GitHub للمشاركة في النقاش

تم نسخ الرابط!