شرح StrictModes في SSH وتمرير الوكيل (ssh -A) والخيار ssh -a
يرفض StrictModes في SSH المفاتيح إن كان المجلد الرئيسي أو ~/.ssh أو authorized_keys قابلاً للكتابة من الآخرين؛ والحل بالأمر chmod. تجنب ssh -A على المضيفين غير الموثوقين؛ والخيار ssh -a يعطّله.
باختصار: `StrictModes yes` (الإعداد الافتراضي في OpenSSH) يجعل sshd يتحقق من ملكية وصلاحيات مجلدك الرئيسي و`~/.ssh` و`~/.ssh/authorized_keys` قبل قبول المفتاح، ويرفض الدخول برسالة «Authentication refused: bad ownership or modes» إن كان أي منها قابلاً للكتابة من المجموعة أو الآخرين أو مملوكاً لمستخدم آخر. أصلح الصلاحيات بدلاً من تعطيل الفحص. أما تمرير الوكيل بالخيار `ssh -A` فيتيح للمضيف البعيد استخدام مفاتيحك المحلية أثناء اتصالك، لذا تجنبه على المضيفين الذين لا تثق بهم تماماً واستخدم `ssh -J` (ProxyJump) بدلاً منه؛ والخيار `ssh -a` بالحرف الصغير يعطّل تمرير الوكيل صراحة.
يكمّل هذا الدليل دليل تحصين SSH وينطبق على Debian 12/13 وUbuntu 24.04 وأنظمة عائلة RHEL مثل AlmaLinux 9 وRocky 9.
ما الذي يفحصه StrictModes في SSH
StrictModes إعداد من جانب الخادم في `/etc/ssh/sshd_config`. غرضه بسيط: إن استطاع مستخدم آخر الكتابة في `authorized_keys` الخاص بك، فبإمكانه إضافة مفتاحه والدخول باسمك. لذا يرفض sshd الوثوق بالملف ما لم يكن المسار كله محمياً. ويفحص الملف والمجلدات التي فوقه، بما فيها المجلد الرئيسي.
تأكد من القيمة الفعلية بالأمر `sshd -T | grep -i strictmodes`. على Ubuntu 24.04 وDebian 13، افحص أيضاً الملفات الإضافية في `/etc/ssh/sshd_config.d/`.
| المسار | ما يتطلبه StrictModes | الصلاحيات الموصى بها |
|---|---|---|
| /home/alice | مملوك لـ alice أو root، غير قابل للكتابة من المجموعة/الجميع | 755 أو 750 أو 700 |
| /home/alice/.ssh | مملوك لـ alice أو root، غير قابل للكتابة من المجموعة/الجميع | 700 |
| /home/alice/.ssh/authorized_keys | مملوك لـ alice أو root، غير قابل للكتابة من المجموعة/الجميع | 600 |
| /root و/root/.ssh (دخول root) | مملوك لـ root، غير قابل للكتابة من المجموعة/الجميع | 700 |
إصلاح «Authentication refused: bad ownership or modes»
لا يعرض العميل سوى رسالة عامة `Permission denied (publickey)`. السبب الحقيقي موجود في سجل الخادم، الذي يسمّي المسار بدقة، مثل `Authentication refused: bad ownership or modes for directory /home/alice` أو `... for file /home/alice/.ssh/authorized_keys`. استخدم وحدة التحكم في الـ VPS أو جلسة أخرى لإصلاحه.
- 01.اقرأ السجل: `journalctl -u ssh -n 50` على Debian وUbuntu، أو `journalctl -u sshd -n 50` على AlmaLinux وRocky.
- 02.أصلح ملكية مجلد SSH للمستخدم: `chown -R alice:alice /home/alice/.ssh`.
- 03.أصلح الصلاحيات: `chmod 700 /home/alice/.ssh` و`chmod 600 /home/alice/.ssh/authorized_keys`.
- 04.أزل صلاحية الكتابة للمجموعة والجميع من المجلد الرئيسي: `chmod go-w /home/alice`.
- 05.على أنظمة SELinux (AlmaLinux وRocky وFedora)، استعد التسميات: `restorecon -Rv /home/alice/.ssh`.
- 06.اختبر من طرفية جديدة بالأمر `ssh -v alice@server` مع إبقاء الجلسة العاملة مفتوحة.
# all-in-one, run as root on the server
chown -R alice:alice /home/alice/.ssh
chmod go-w /home/alice
chmod 700 /home/alice/.ssh
chmod 600 /home/alice/.ssh/authorized_keys
namei -l /home/alice/.ssh/authorized_keys # shows owner and mode of every path componentNote · لا تضبط `StrictModes no` لإخفاء الخطأ. فهذا يزيل حماية حقيقية ويخفي سوء الإعداد بدلاً من إصلاحه.
StrictModes مقابل StrictHostKeyChecking
عمليات البحث عن «ssh strictmode» كثيراً ما تخلط بين خيارين لا علاقة بينهما. `StrictModes` موجود في `sshd_config` على الخادم ويفحص صلاحيات الملفات. أما `StrictHostKeyChecking` فموجود في `ssh_config` أو `~/.ssh/config` على العميل ويتحكم فيما يحدث عندما يكون مفتاح مضيف الخادم مجهولاً أو متغيراً. وللعميل أيضاً فحص صلاحيات خاص به: يرفض استخدام مفتاح خاص يستطيع مستخدمون آخرون قراءته، مع تحذير بشأن ملف مفتاح خاص غير محمي؛ ويصلح ذلك الأمر `chmod 600 ~/.ssh/id_ed25519`.
تمرير الوكيل بالخيار ssh -A: الخطر
ينشئ `ssh -A` (أو `ForwardAgent yes`) مقبساً على المضيف البعيد، يشير إليه `$SSH_AUTH_SOCK`، يمرر طلبات التوقيع عائداً إلى ssh-agent على جهازك. مفتاحك الخاص لا يغادر جهازك أبداً، لكن أي شخص يستطيع الوصول إلى ذلك المقبس يستطيع استخدام مفتاحك أثناء اتصالك. وعلى المضيف البعيد يشمل ذلك root وأي عملية تعمل باسم مستخدمك.
إن اختُرق الخادم أو كان يديره شخص آخر، يستطيع المهاجم الدخول بصمت إلى كل مضيف آخر يفتحه مفتاحك، بما في ذلك استضافة Git وخوادم الإنتاج. لهذا يعتمد عميل OpenSSH افتراضياً `ForwardAgent no`.
- ▹لا تمرر وكيلك أبداً إلى مضيفين مشتركين أو تابعين لجهات خارجية أو أُعيد تثبيتهم حديثاً ولم تحصّنهم.
- ▹إن اضطررت للتمرير، فاستخدم `ssh-add -c` بحيث يتطلب كل استخدام للمفتاح تأكيداً محلياً.
- ▹يدعم OpenSSH 8.9 والأحدث قيود الوجهة عبر `ssh-add -h`، ما يحدد المضيفين الذين يجوز استخدام المفتاح الممرَّر لهم.
- ▹من جانب الخادم، يعطّله `AllowAgentForwarding no` في `sshd_config`، وإن كان المستخدمون الذين لديهم وصول إلى الصدفة لا يزالون قادرين على إعداد مُمرّرات خاصة بهم.
فضّل ProxyJump (ssh -J) لخوادم العبور
يُستخدم معظم تمرير الوكيل للقفز عبر خادم عبور (bastion) إلى جهاز داخلي. يفعل `ssh -J` ذلك دون كشف وكيلك: خادم العبور يمرر فقط تدفق TCP مشفراً، والمصادقة على المضيف الداخلي تتم من طرف إلى طرف من حاسوبك. وللخوادم التي لا يمكن الوصول إليها إلا عبر شبكة خاصة، نفق WireGuard خيار آخر؛ راجع دليل WireGuard VPN أو دليل شبكة WireGuard المتشابكة، ولإعدادات keepalive وPSK راجع دليل ضبط WireGuard هذا.
على VPS من NoctisNode تحصل على صلاحيات root كاملة عبر SSH على جهاز KVM، لذا يمكن لخطة Wisp صغيرة أن تعمل كخادم قفز مخصص لا يعمل عليه شيء آخر؛ راجع خطط VPS.
# one-off
ssh -J [email protected] [email protected]
# ~/.ssh/config
Host bastion
HostName bastion.example.com
User alice
ForwardAgent no
Host db1
HostName 10.88.0.3
User alice
ProxyJump bastionماذا يفعل ssh -a (بالحرف الصغير)
يعطّل `ssh -a` بالحرف الصغير تمرير الوكيل لذلك الاتصال، وهو عكس `-A`. يفيد حين يفعّل `~/.ssh/config` خيار `ForwardAgent` لمضيف بحرف بدل (wildcard) وتريد التأكد من أن اتصالاً محدداً لا يمرر، مثل `ssh -a admin@untrusted-host`. لا تخلط بينه وبين `ssh-agent -a`، الذي يحدد مسار مقبس الوكيل، أو `ssh-add`، الذي يحمّل المفاتيح في الوكيل.
الأسئلة الشائعة
Qماذا يفعل StrictModes في sshd_config؟
Aيجعل sshd يتحقق من أن المجلد الرئيسي للمستخدم و~/.ssh وauthorized_keys مملوكة للمستخدم أو root وغير قابلة للكتابة من المجموعة أو الآخرين. إن فشل الفحص، تُرفض المصادقة بالمفتاح.
Qكيف أصلح Authentication refused: bad ownership or modes؟
Aشغّل `chmod go-w ~` و`chmod 700 ~/.ssh` و`chmod 600 ~/.ssh/authorized_keys`، وتأكد أن الملفات مملوكة للمستخدم. سجل الخادم يسمّي المسار الخاطئ بدقة.
Qهل تمرير الوكيل بالخيار ssh -A آمن؟
Aفقط على المضيفين الذين تثق بهم تماماً. أثناء اتصالك، يستطيع root أو حساب مخترق على المضيف البعيد استخدام وكيلك الممرَّر للمصادقة باسمك في أماكن أخرى؛ استخدم `ssh -J` بدلاً منه.
Qما الفرق بين ssh -A وssh -a؟
Aالخيار `-A` بالحرف الكبير يفعّل تمرير ssh-agent الخاص بك إلى المضيف البعيد. والخيار `-a` بالحرف الصغير يعطّل تمرير الوكيل لذلك الاتصال، متجاوزاً أي `ForwardAgent yes` في إعداداتك.
Qهل يجب أن أضبط StrictModes no؟
Aلا. تعطيله يسمح بالدخول حتى عندما يستطيع مستخدمون آخرون تعديل authorized_keys الخاص بك، وهذه ثغرة أمنية حقيقية؛ أصلح الملكية والصلاحيات بدلاً من ذلك.