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

وشيء واحد فقط مخيف في الأمر: أن تعطّل كلمة المرور فتبقى في الخارج. وإليك الترتيب الذي لا يمكن أن يحدث فيه ذلك.

المفتاح

يُولَّد على آلتك أنت، لا على الخادم:

ssh-keygen -t ed25519 -C "work laptop"

ed25519 بدل RSA: أقصر وأسرع وبلا أسئلة عن الطول. ولا يلزم RSA إلا إذا كنت مضطرًا للوصول إلى شيء قديم جدًا؛ وعندها -t rsa -b 4096.

ويستحق وضع عبارة مرور على المفتاح: فملف المفتاح قد يُسرق من حاسوب محمول، وبدون عبارة مرور يعمل فورًا. ولن تضطر لكتابتها في كل مرة — فذلك يتكفّل به ssh-agent، وهو يعمل أصلًا على macOS وعلى معظم أنظمة لينكس المكتبية.

ونسخه إلى الخادم أمر واحد، ما دامت كلمة المرور لا تزال تعمل:

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@203.0.113.25

إن لم يكن ssh-copy-id متاحًا، يُضاف محتوى الملف .pub سطرًا في ~/.ssh/authorized_keys على الخادم. والأذونات مهمة: الدليل .ssh بصلاحية 700، والملف 600، ومالكه المستخدم. ومع أي شيء آخر يرفض sshd قراءة الملف بصمت، وهذا أشيع سبب لعبارة «المفتاح لا يعمل».

الفحص الذي يحسم الأمر

قبل تعطيل أي شيء، افتح اتصالًا ثانيًا دون إغلاق الأول:

ssh -o PasswordAuthentication=no user@203.0.113.25

يمنع هذا الخيار العميل من الرجوع إلى كلمة المرور — فإن نجح الدخول فقد نجح بالمفتاح. ولا تمضِ قدمًا حتى ينجح هذا الأمر. وأبقِ الاتصال الأول مفتوحًا حتى النهاية: فهو ما سيصلح كل ما تفلح في إفساده.

تعطيل كلمات المرور وعقبة غير بديهية

توضع الإعدادات في ملف منفصل كي لا يستبدلها تحديث حزمة. لكن اسم الملف مهم:

sudo tee /etc/ssh/sshd_config.d/10-hardening.conf <<'EOF'
PasswordAuthentication no
PermitRootLogin no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
LogLevel VERBOSE
EOF

والمسألة أن OpenSSH يستخدم أول قيمة يجدها لمعامل ما، لا الأخيرة كما هو الحال في كل مكان تقريبًا. وتُقرأ الملفات في sshd_config.d بالترتيب الأبجدي، وصور Ubuntu السحابية تضع هناك 50-cloud-init.conf الذي يحتوي غالبًا على PasswordAuthentication yes. وملفك ذو الرقم 90 لن يفعل شيئًا في هذه الحالة: يبدو الإعداد في مكانه بينما تستمر كلمة المرور في العمل. ومن هنا الرقم 10 — فهو يُقرأ قبله.

ويمكنك رؤية ما نتج فعلًا دون تخمين:

sudo sshd -T | grep -Ei 'passwordauth|permitrootlogin|pubkeyauth'

يطبع هذا الأمر الإعداد الفعّال بعد كل التضمينات. ثق به لا بمحتوى الملفات.

ثم فحص للصياغة وإعادة تحميل لطيفة للخدمة:

sudo sshd -t && sudo systemctl reload ssh

وsshd -t إلزامي: فخطأ مطبعي في الإعداد مع restart يترك الخدمة ساقطة ويتركك في الخارج. كما أن reload لا يقطع الجلسات المفتوحة.

Ubuntu 24.04: المنفذ ليس حيث تظن

فخ منفصل في إصدارات Ubuntu الحديثة: يُشغَّل sshd هناك عبر مقبس systemd. وفي هذا الوضع لا يفعل السطر Port في sshd_config شيئًا — فالمقبس هو الذي يستمع لا العفريت. وإن كنت تغيّر المنفذ، فهذا ما يجب تحريره:

sudo systemctl edit ssh.socket

وينبغي أن يشير ListenStream= (والقيمة الفارغة تُصفّر السابقة) إلى المنفذ الجديد. والعَرَض الذي يفضح ذلك: الإعداد تغيّر، والخدمة أُعيد تشغيلها، والخادم لا يزال يجيب على المنفذ 22.

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

من يُسمح له بالدخول أصلًا

إضافة مفيدة هي قائمة صريحة:

AllowUsers deploy admin

وكل ما ليس في القائمة يُقطع قبل فحص المفتاح أصلًا. وهذا يغطي أيضًا حالة إنشاء حزمة ما لمستخدم نظام له صدفة ودليل منزلي.

طريق احتياطي للدخول

مفتاح واحد على حاسوب محمول واحد هو نقطة فشل وحيدة. فالقرص يموت، والحاسوب يُفقد، ويصير الخادم غير قابل للوصول نهائيًا. والحد الأدنى المعقول:

  • مفتاح ثانٍ من جهاز آخر في authorized_keys؛
  • نسخة من المفتاح الخاص في مدير كلمات مرور أو على ذاكرة مشفّرة؛
  • وصول مختبَر إلى وحدة التحكم لدى مزوّدك — VNC أو تسلسلي. ومختبَر تعني أنك دخلت عبره مرة واحدة على الأقل، لا أن «هناك زرًا في مكان ما في اللوحة».

وما دمت هناك، انظر إلى ما هو موجود سلفًا في authorized_keys — لمستخدمك ولـ root معًا. فمفتاح غريب هناك ينجو من أي تغيير لكلمة المرور ويبقى وصولًا عاملًا.

وبعد ذلك

لن يزول تخمين كلمات المرور، بل يصير عديم الجدوى فحسب: ستواصل السجلات تجميع آلاف الأسطر من نوع Failed password، ولا يمكن لأي منها أن ينتهي بنجاح. أما ما يستحق المراقبة الآن فهو عمليات الدخول الناجحة: من أي عنوان، وبأي مستخدم، وفي أي ساعة. فدخول ناجح بمفتاح من عنوان غير مألوف حدث أهم بكثير من مليون إخفاق، وملاحظته وسط التدفق العام أصعب بكثير. وهذه الصورة بالذات تعرضها صفحة العرض التوضيحي أدناه.