أمن لينكس: تحصين خادم في بيئة الإنتاج
يتلقى خادم لينكس المكشوف على الإنترنت أولى محاولات الاختراق خلال دقائق من تشغيله: فحص للمنافذ، وتجريب لكلمات مرور 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 | الملف المُنشأ | المجلد المُنشأ | الاستخدام |
|---|---|---|---|
| 022 | 644 (rw-r—r—) | 755 (rwxr-xr-x) | القيمة الافتراضية المعتادة |
| 027 | 640 (rw-r-----) | 750 (rwxr-x---) | موصى بها للخادم المحصَّن |
| 077 | 600 (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 passwordauthentication | passwordauthentication no |
| منع الدخول بحساب root | sudo sshd -T | grep permitrootlogin | permitrootlogin no |
| جدار الحماية مفعّل | sudo ufw status أو sudo firewall-cmd --state | active / running |
| حظر الوارد افتراضيًا | sudo ufw status verbose | deny (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 محصَّن | umask | 0027 |
| auditd قيد التشغيل | sudo auditctl -l | قواعد محمّلة |
| SELinux/AppArmor مفعّل | getenforce / aa-status | Enforcing / ملفات تعريف محمّلة |
| تعطيل الخدمات الزائدة | systemctl list-units --type=service --state=running | قائمة دنيا |
أفضل الممارسات
- اختبر كل تغيير في SSH داخل جلسة ثانية قبل إغلاق الأولى: فهي شبكة أمانك من حبس نفسك خارج الخادم.
- افتح منفذ SSH في جدار الحماية قبل تفعيله، لا بعده أبدًا.
- أضف عناوين IP الخاصة بالإدارة إلى
ignoreipفي fail2ban كي لا تحظر نفسك أبدًا. - لا تعطّل SELinux أو AppArmor أبدًا من أجل «حل» مشكلة ما: صحّح السياسة بدلًا من ذلك.
- دقّق في المنافذ المستمِعة (
ss -tulpn) بعد كل تثبيت لبرنامج. - أعد تطبيق قائمة المراجعة كاملة بعد كل ترقية كبرى للنظام.
- انقل سجلاتك إلى خادم بعيد: فالمهاجم الذي يحصل على صلاحيات root يمحو الآثار المحلية.
- الأمن عملية مستمرة وليس حالة ثابتة: خصّص مراجعة فصلية لهذه القائمة.
الخلاصة
لا يتطلب تحصين خادم لينكس أدوات غريبة ولا ميزانية: يكفي تقييد SSH بالمفاتيح، وجدار حماية بقائمة سماح، وfail2ban، وتحديثات تلقائية، وصلاحيات صارمة، وauditd، ومراجعة دورية للمنافذ، لدرء الغالبية الساحقة من الهجمات الانتهازية التي تجتاح الإنترنت باستمرار. والخيط الناظم لكل هذه الإجراءات هو مبدأ أقل قدر من الصلاحيات: فكل وصول غير ضروري هو وصول ينبغي إلغاؤه.
طبّق قائمة المراجعة الواردة في القسم 9 على كل خادم لديك، وأتمتها ضمن سكربتات التهيئة، وستنطلق من أساس سليم تعززه لاحقًا الإجراءات المتقدمة (إعداد SELinux أدق، وتجميع السجلات مركزيًا، وكشف التسلل).
نبذة عن InSkillCoach
خبير في التدريب والتقنيات
مدرّب متخصص في التقنيات المتقدمة والذكاء الاصطناعي، تدعمه شركة GNeurone Inc.
الشهادات:
- AWS Certified Solutions Architect – Professional
- شهادات Google Cloud
- Microsoft Certified: DevOps Engineer Expert
- Certified Kubernetes Administrator (CKA)
- CompTIA Security+
التعليقات
التعليقات مدعومة عبر GitHub Discussions
سجّل الدخول باستخدام GitHub للمشاركة في النقاش