◀ العودة إلى المدونة
Linux

تأمين خادم Linux

نشر في 22 Jan 2024· 7 min قراءة
#Linux#Sécurité#Serveur

تأمين خادم Linux الخاص بك

تأمين خادم Linux هو الخطوة الأولى قبل أي نشر في بيئة الإنتاج. فالخادم الافتراضي (VPS) المُنشأ حديثاً بعنوان IP عام يتلقى محاولات اتصال SSH آلية خلال دقائق: روبوتات تجوب الإنترنت باستمرار بحثاً عن كلمات مرور ضعيفة وخدمات سيئة الإعداد وبرمجيات غير محدّثة. إليك الإجراءات الأساسية، بالترتيب الذي أطبّقها به على جهاز جديد.

الهدف ليس جعل الخادم منيعاً تماماً، فهذا غير موجود، بل تقليص سطح الهجوم وجعل الهجمات الانتهازية غير فعالة. تستهدف الأمثلة أدناه Debian وUbuntu؛ لكن المبادئ تنطبق على كل التوزيعات.

تجهيز مستخدم ومفتاح SSH

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

# On the server (as root)
adduser deploy
usermod -aG sudo deploy

# On your workstation
ssh-keygen -t ed25519 -C "deploy@myserver"
ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@203.0.113.10
ssh deploy@203.0.113.10

لا تنتقل إلى الخطوة التالية إلا بعد نجاح الاتصال بالمفتاح مع المستخدم الجديد، وتحقق من أنه يستطيع استخدام sudo.

إعدادات SSH

# /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
Port 2222
MaxAuthTries 3
AllowUsers deploy

لكل توجيه دور محدد:

  • PermitRootLogin no: حساب root الموجود على كل الأجهزة هو الهدف الأول للهجمات. يتصل المسؤولون بحساباتهم الخاصة ثم يستخدمون sudo، مما يترك أثراً باسم كل شخص.
  • PasswordAuthentication no: من دون كلمات مرور، تصبح هجمات القاموس بلا فائدة. اضبط أيضاً KbdInteractiveAuthentication no، وإلا فقد تبقى المصادقة بكلمة المرور ممكنة عبر PAM.
  • Port 2222: تغيير المنفذ لا يحمي من هجوم موجّه، لكنه يقلل بشكل كبير الضجيج في السجلات.
  • MaxAuthTries 3: يحدّ من عدد المحاولات في كل اتصال.
  • AllowUsers deploy: قائمة بيضاء للحسابات المسموح لها بالاتصال. يُرفض أي مستخدم آخر، حتى لو امتلك مفتاحاً صالحاً.

في التوزيعات الحديثة، يمكنك وضع هذه التوجيهات في ملف مخصص، مثل /etc/ssh/sshd_config.d/hardening.conf، بدلاً من تعديل الملف الرئيسي. انتبه: يحتفظ sshd لكل توجيه بـأول قيمة يقرؤها، والملفات المضمّنة تُقرأ في البداية. قبل إعادة التشغيل، اختبر الإعدادات دائماً وأبقِ جلستك الحالية مفتوحة:

sudo sshd -t && sudo systemctl restart ssh
# From a second terminal, before closing the current session:
ssh -p 2222 deploy@203.0.113.10

في Ubuntu 24.04، يُفعَّل SSH عبر socket من systemd: بعد تغيير المنفذ، نفّذ sudo systemctl daemon-reload ثم sudo systemctl restart ssh.socket حتى يُعتمد المنفذ الجديد.

الجدار الناري باستخدام UFW

مبدأ الجدار الناري بسيط: رفض كل حركة المرور الواردة، ثم فتح المنافذ الضرورية فقط بشكل صريح. UFW (Uncomplicated Firewall) طبقة سهلة القراءة فوق nftables/iptables، مثبتة افتراضياً على Ubuntu.

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp    # SSH
sudo ufw allow 80/tcp      # HTTP
sudo ufw allow 443/tcp     # HTTPS
sudo ufw enable

الترتيب مهم: اسمح بمنفذ SSH قبل تنفيذ ufw enable، وإلا فقد ينقطع اتصالك الحالي. ثم تحقق من القواعد باستخدام sudo ufw status verbose. خياران مفيدان:

  • sudo ufw limit 2222/tcp يحل محل قاعدة allow ويرفض العنوان الذي يحاول 6 اتصالات أو أكثر خلال 30 ثانية.
  • sudo ufw allow from 10.0.0.0/24 to any port 5432 proto tcp يفتح منفذاً لشبكة خاصة فقط، مثلاً لقاعدة بيانات.

فخ مهم: Docker يتجاوز UFW. المنفذ المنشور باستخدام -p 5432:5432 يكون قابلاً للوصول من الإنترنت حتى لو لم يسمح به UFW، لأن Docker يكتب قواعد iptables الخاصة به. انشر المنافذ الداخلية على 127.0.0.1 (-p 127.0.0.1:5432:5432) أو لا تنشرها إطلاقاً.

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

تستغل معظم الاختراقات ثغرات معروفة سبق إصلاحها. تثبّت حزمة unattended-upgrades التحديثات الأمنية تلقائياً:

sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

افتراضياً، تُطبَّق التحديثات الأمنية فقط. بعضها، ولا سيما تحديثات النواة، لا يسري إلا بعد إعادة التشغيل. يمكنك السماح بإعادة تشغيل تلقائية في ساعة هادئة داخل /etc/apt/apt.conf.d/50unattended-upgrades:

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

للتحقق من الإعدادات دون تثبيت أي شيء: sudo unattended-upgrade --dry-run --debug. على خادم لا يجب أن يعيد التشغيل وحده، اترك هذا الخيار معطلاً وراقب وجود الملف /var/run/reboot-required.

Fail2Ban

احمِ نفسك من هجمات القوة الغاشمة:

sudo apt install fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

يقرأ Fail2Ban السجلات، ويرصد إخفاقات المصادقة المتكررة، ويحظر مؤقتاً عنوان IP المخالف عبر الجدار الناري. قد يُستبدل الملف jail.conf أثناء التحديثات: لذا نعمل دائماً في jail.local. وبدلاً من نسخ الملف كاملاً، يكفي غالباً أن تكتب فيه القيم التي تريد تجاوزها فقط:

# /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
backend  = systemd

[sshd]
enabled = true
port    = 2222

الإعداد backend = systemd ضروري على Debian 12، حيث تُسجَّل اتصالات SSH في journald وليس في /var/log/auth.log. لا تنسَ تحديد منفذ SSH المخصص، وإلا فسيُطبَّق الحظر على المنفذ 22. بعض الأوامر المفيدة:

sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
sudo fail2ban-client set sshd unbanip 198.51.100.7

تقليص سطح الهجوم

كل خدمة تستمع على الشبكة هي باب محتمل. اسرد المنافذ المفتوحة وعطّل كل ما ليس ضرورياً:

sudo ss -tulpn
sudo systemctl disable --now cups.service   # example: a useless service on a server

يجب أن تستمع قواعد البيانات وRedis وواجهات الإدارة على 127.0.0.1 أو على شبكة خاصة، وليس أبداً على الواجهة العامة. كما تعزز بعض معاملات النواة حزمة الشبكة:

# /etc/sysctl.d/99-hardening.conf
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0

طبّقها باستخدام sudo sysctl --system.

السجلات والتدقيق

يجب أن يتيح الخادم الآمن أيضاً فهم ما حدث بعد وقوعه. اجعل سجل systemd دائماً (Storage=persistent في /etc/systemd/journald.conf)، وأرسل السجلات إلى جهاز منفصل: فالمهاجم الذي يحصل على صلاحيات root يستطيع محو السجلات المحلية. وللفحص الدوري، تراجع أداة Lynis (sudo lynis audit system) مئات نقاط الإعداد وتقترح تحسينات ملموسة.

قائمة التحقق الأمنية

  • تعطيل دخول root عبر SSH
  • استخدام المصادقة بالمفاتيح فقط
  • إعداد جدار ناري مقيِّد
  • تثبيت Fail2Ban وإعداده
  • تفعيل التحديثات الأمنية التلقائية
  • إعداد سجلات مركزية
  • إعداد مراقبة للنظام
  • التحقق من المنافذ المفتوحة باستخدام ss -tulpn ومن المنافذ التي ينشرها Docker
  • إعداد نسخ احتياطية خارجية واختبار استعادتها

الأمان عملية مستمرة، وليس إعداداً يُنجز مرة واحدة: أعد التدقيق بعد كل تغيير مهم، واحصر صلاحيات الوصول في الحد الأدنى الضروري.