الرئيسية
» كيف
»
كيفية تقييد مستخدمي SSH بمجلدات محددة على نظام Ubuntu 24.04 (دليل SFTP Chroot)
كيفية تقييد مستخدمي SSH بمجلدات محددة على نظام Ubuntu 24.04 (دليل SFTP Chroot)
لا ينبغي أن يمنح منح المقاول صلاحية تحميل بعض الملفات جلسة طرفية تلقائية تتيح له رؤية الخادم بأكمله. في نظام أوبونتو 24.04 LTS، يُمكن لبرنامج OpenSSH تقييد حساب نقل الملفات إلى دليل مُحدد باستخدام ChrootDirectoryقاعدة وخادم مُدمج internal-sftp. والفرق الجوهري هو أن هذا التقييد خاص ببروتوكول SFTP فقط ، وليس طريقة سهلة لتوفير واجهة Bash كاملة الوظائف ولكنها مُقيدة.
يشرح هذا الدليل ما تحميه الإعدادات فعليًا، ثم يستعرض عملية إعداد قابلة للعكس من ثماني مراحل لحسابات متعددة، لكل منها دليلها الخاص. تستخدم الأوامر حسابًا افتراضيًا باسم contractorومضيفًا افتراضيًا باسم server.example.com؛ استبدلهما بقيمك الخاصة. هذه أمثلة على التكوين، وليست نتائج مؤكدة من اختبار خادم حقيقي.
أي نوع من القيود تحتاج إليه فعلاً؟
ثلاثة عناصر تحكم غالبًا ما يتم الخلط بينها. تحدد صلاحيات لينكس الملفات التي يمكن لحساب ما قراءتها أو تعديلها؛ ويحدد تغيير الدليل الرئيسي للحساب موقعًا أوليًا؛ بينما يغير chroot جذر نظام الملفات المقدم لعملية ما. هذه العناصر ليست قابلة للتبادل.
الهدف
نقطة بداية مناسبة
قيد هام
التحميل والتنزيل فقط داخل مجلد مخصص
ChrootDirectoryمعForceCommand internal-sftp
لا يوفر واجهة سطر أوامر لينكس تفاعلية
السماح بوجود واجهة سطر أوامر مع التحكم في القراءة والكتابة
ملكية يونكس، والمجموعات، وقوائم التحكم بالوصول، وأقل الامتيازات
قد يتمكن مستخدم سطر الأوامر العادي من اجتياز مسارات أخرى قابلة للقراءة
مفهوم خاطئ: تعيين /home/contractorمجلد رئيسي يُقيّد المستخدم فيه. هذا غير صحيح. يمكن لمستخدم سطر الأوامر العادي الانتقال إلى أي مجلد متاح في نظام الملفات. إذا كان تبادل الملفات هو المطلوب فعلاً، فاختر خيار SFTP فقط الموضح أدناه بدلاً من محاولة إخفاء المجلدات باستخدام موجه الأوامر.
وثائق OpenSSH ChrootDirectory، Matchوفي دليل sshd_configForceCommand الرسمي لنظام Ubuntu 24.04 .
قم بإعداد بيئة معزولة لدليل SFTP فقط في ثماني مراحل
قبل تعديل SSH عن بُعد، أبقِ جلسة المسؤول الحالية مفتوحة وتأكد من امتلاكك صلاحية الوصول إلى وحدة التحكم أو الاسترداد. استخدم حسابًا منفصلاً غير مميز لعمليات النقل؛ ولا تُضِف حساب المسؤول إلى المجموعة المقيدة.
1. تحقق من OpenSSH واحتفظ بجلسة استرداد
على الخادم، قم بتثبيت OpenSSH إذا لزم الأمر، وتحقق من الخدمة، واحفظ الإعدادات الرئيسية. تدعم وثائق خادم أوبونتو الرسمية مسارات الخدمة والإعدادات هذه.
sudo apt update
sudo apt install openssh-server
sudo systemctl status ssh
sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.pre-sftp
عرض طرفي لحالة خدمة SSH، مفيد للتحقق من توفر OpenSSH قبل تغيير قواعد الوصول.
تُعدّ المجموعة مفيدةً عند توقع وجود أكثر من حساب مقيّد. يمنح هذا المثال كل عضو بيئة معزولة منفصلة باستخدام %uالرمز المميز، الذي يُحوّله OpenSSH إلى اسم المستخدم المتصل. /uploadمن المفترض أن يكون مسار الصفحة الرئيسية موجودًا داخل بيئة chroot المستقبلية، لذا لا تُنشئ دليلًا على مستوى المضيف /upload.
قد يطلب منك النظام adduserتعيين كلمة مرور. في الأنظمة التي تُعطّل مصادقة كلمة مرور SSH، أنشئ مفتاحًا عامًا وقم بتفويضه؛ لا تُفعّل تسجيل الدخول بكلمة مرور بشكل عام لمجرد اتباع مثال. nologinيُعدّ استخدام سطر الأوامر إجراءً وقائيًا إضافيًا، ولكن الأمر المُطبّق internal-sftpهو ما يجعل هذا التكوين قابلاً للنقل فقط. اختبر هذه التركيبة على نظام المصادقة الخاص بك.
يحدد أمر إنشاء الحساب الحساب المقيد ومسار الصفحة الرئيسية الذي سيكون متاحًا بعد تطبيق chroot.
3. أنشئ دليل chroot مملوكًا للمستخدم الجذر
هذا هو الخطأ الذي يقع فيه العديد من الأدلة. يتطلب OpenSSH أن يكون كل مكون من مسار chroot مملوكًا للمستخدم الجذر (root) وغير قابل للكتابة من قبل مستخدمين أو مجموعات أخرى. لا تجعل جذر السجن نفسه قابلاً للكتابة من قبل حساب SFTP.
/تحقق من المكونات الموجودة /srvأيضًا؛ فالأوامر المذكورة أعلاه لا تُصلح تلقائيًا أذونات الأصل غير الآمنة. إذا كان أي مكون قابلًا للكتابة من قِبل المجموعة أو مملوكًا للمستخدم، فصحح ملكيته ووضعه فقط بعد التحقق مما إذا كانت تطبيقات أخرى تعتمد عليه.
يتم عرض دليل السجن ودليله الأصل مع ملكية الجذر، وهو الشرط الذي يتحقق منه OpenSSH عند بدء الجلسة.
4. أضف دليلاً فرعياً قابلاً للكتابة داخل السجن
يمكن للحساب الكتابة إلى مجلد فرعي دون السماح له بتغيير جذر chroot. أنشئ /srv/sftp/contractor/uploadملفًا لملفات الحساب الفعلية؛ سيظهر هذا الملف من داخل SFTP على النحو التالي /upload: .
تختلف ملكية الملفات المتوقعة عمدًا: root:rootبالنسبة لجذر السجن، وبالنسبة contractor:contractorلمجلد التحميل القابل للكتابة. تجنب استخدام الأمر `cd` chmod 777، لأنه سيؤدي إلى تعريض النظام لمخاطر غير ضرورية، وسيتم رفضه إذا طُبِّق على جذر السجن.
يمكن كتابة المجلد الفرعي الخاص بالتحميل بواسطة الحساب المقيد، بينما يظل المجلد المغلق مملوكًا للمستخدم الجذر.
5. أضف قاعدة مطابقة إلى ملف sshd_config
افتح الملف /etc/ssh/sshd_configوأضف الكتلة التالية في النهاية، بعد أي توجيهات وكتل موجودة Match. استخدم محرر نصوص مثل `/usr/bin/subscribe` sudoeditأو sudo nano`/usr/bin/subscribe`. راجع القواعد الموجودة Matchأولًا: إذا خصصت عدة كتل متطابقة نفس الكلمة المفتاحية، فسيستخدم OpenSSH أول مثيل مناسب. يعالج Ubuntu أيضًا الملفات الموجودة في `/usr/bin/subscribe` /etc/ssh/sshd_config.d/من ملف `/usr/bin/subscribe` سابق Include؛ قد تؤثر القواعد الموجودة هناك على الأولوية.
Match Group sftpclients
ChrootDirectory /srv/sftp/%u
ForceCommand internal-sftp -d /upload
PermitTTY no
DisableForwarding yes
Match Groupيستهدف أعضاء sftpclients. ChrootDirectoryيضع كل مستخدم تحت /srv/sftp/USERNAME. ForceCommand internal-sftp -d /uploadيشغل خدمة SFTP داخل العملية ويبدأ داخل الدليل القابل للكتابة. PermitTTY noيمنع تخصيص الطرفية، بينما DisableForwarding yesيعطل ميزات إعادة توجيه SSH للاتصالات المطابقة.
احتفظ Subsystem sftpبالتوجيه العام الذي توفره أوبونتو ما لم يكن لديك سببٌ آخر لتغييره؛ فأمر SFTP الداخلي الإجباري لا يتطلب استبدال هذا السطر العام. لا تُضِف توجيهًا عامًا إضافيًا Match Allلمجرد إنهاء كتلة برمجية دون فهم تأثيره.
تقوم كتلة تكوين OpenSSH المشروطة بتجميع قيود الدليل وأمر SFTP فقط معًا.
6. تحقق من بناء الجملة والإعدادات الفعالة قبل إعادة التحميل
لا يُثبت نجاح عملية التحليل صحة أذونات السجن، ولا يُثبت أن الحساب المقصود يطابق السياسة. لذا، يُرجى إجراء كلا الفحصين بشكل صريح.
يجب أن يحدد التكوين الفعال مسار chroot المقصود، وأمر SFTP الإجباري، وتعطيل تخصيص TTY، وقيود إعادة التوجيه. عنوان المثال 192.0.2.10هو لأغراض التوثيق فقط؛ إذا كانت لديك Matchقواعد تعتمد على العنوان، فاستبدله بعنوان مصدر العميل الحقيقي. -T -Cالنموذج موثق في دليل sshd الخاص بنظام Ubuntu 24.04 .
في حال فشل التحقق، قم بتصحيح الإعدادات قبل إعادة تحميل SSH. إذا كانت القيم الفعلية غير متوقعة، فافحص الأجزاء المضمنة وترتيب الكتل الشرطية الموجودة، وليس فقط الأسطر الأخيرة التي قمت بتعديلها.
7. أعد تحميل SSH واحتفظ بصلاحيات المسؤول الخاصة بك
بعد إجراء الفحوصات بنجاح، أعد تشغيل خدمة SSH لكي تستخدم الاتصالات الجديدة السياسة المُعدّلة. أبقِ اتصال المسؤول الحالي نشطًا أثناء فتح نافذة طرفية ثانية للتأكد من استمرار عمل الوصول الإداري بشكل طبيعي.
sudo systemctl reload ssh
sudo systemctl status ssh --no-pager
توضح نافذة إدارة خدمة SSH كيفية التحقق من سلامة الخدمة بعد تغيير التكوين.
قد يؤدي إعادة التشغيل الكاملة إلى تطبيق التغييرات، ولكن يُفضّل إعادة التحميل عند توفر الدعم وتجنب أي انقطاع غير ضروري. تختلف مخرجات أوامر الخدمة ورسائل السجل باختلاف المضيف، لذا يُرجى فحص النتيجة الفعلية بدلاً من افتراض أن العودة الناجحة إلى موجه الأوامر تضمن الوصول.
8. اختبار عمليات النقل المسموح بها وحظر الوصول إلى واجهة سطر الأوامر
من جهاز كمبيوتر آخر، اتصل كمستخدم ذي صلاحيات محدودة. استخدم اسم المضيف الفعلي للخادم وملف اختبار مناسب. يجب أن يكون أول دليل SFTP هو /upload، ويجب أن يظهر جذر chroot كـ /بدلاً من مسار المضيف /srv/sftp/contractor.
sftp contractor@server.example.com
sftp> pwd
sftp> cd /
sftp> ls
sftp> cd /upload
sftp> put sample.txt
sftp> cd /etc
sftp> exit
يُسمح بتحميل ملف اختبار غير ضار /upload. لا ينبغي أن يكون الوصول إلى المجلد الفعلي للمضيف /etcممكنًا: إذ يُعرّف chroot جذرًا مختلفًا، ولن /etcيكون الوصول إليه ممكنًا إلا إذا أنشأتَ أو كشفتَ عن هذا المجلد داخل البيئة المعزولة. نص خطأ العميل غير مهم.
يوضح موجه أوامر SFTP استعراض نظام ملفات محصور بدلاً من نظام ملفات المضيف.
ssh contractor@server.example.com
يجب عدم فتح جلسة SSH تفاعلية عادية لهذا الحساب. بدلاً من ذلك، قد يتم إغلاق الاتصال أو عرض رسالة متعلقة بالبروتوكول؛ لذا لا تعتمد على عبارة محددة. في حال فتح جلسة SSH، تعامل مع الإعدادات على أنها غير آمنة، وراجع عضوية المجموعة، Matchوالأولوية، sshd -T -Cوالمخرجات الفعلية قبل استخدام الحساب.
توضح محاولة الاتصال الطرفي عملية فحص الوصول إلى الصدفة التي تم إجراؤها بعد تمكين قيود SFTP فقط.
ماذا لو استخدمت مفاتيح SSH العامة؟
يعمل التوثيق باستخدام المفتاح العام مع بيئة SFTP المعزولة، ولكن وضع مسار المستخدم الرئيسي على مستوى المضيف /uploadيعني أن المسار الافتراضي ~/.ssh/authorized_keysقد لا يكون موجودًا خارج البيئة المعزولة. البديل العملي هو السماح لـ SSH بقراءة ملف مفتاح يتحكم فيه المستخدم الجذر قبل بدء تشغيل chroot. أضف هذا داخل نفس Match Group sftpclientsالكتلة إذا اخترت تخزين المفاتيح مركزيًا.
AuthorizedKeysFile /etc/ssh/authorized_keys/%u
ثم أنشئ /etc/ssh/authorized_keys/contractorملفًا يحتوي على المفتاح العام المُصرَّح به للمقاول، مع منح المستخدم الجذر صلاحية الوصول إليه، ودون منح صلاحيات الكتابة للمجموعة أو المستخدمين الآخرين. على سبيل المثال، بعد نسخ ملف المفتاح العام المُدقَّق والمُسمّى بشكل آمن contractor.pubإلى دليل إداري مؤقت:
لا تقم بنسخ المفتاح الخاص إلى الخادم. يعتمد إعداد مسار المفتاح، وإعدادات المصادقة الافتراضية، وفحوصات الحساب على سياسة SSH الحالية لديك؛ تحقق من إمكانية الوصول إلى المفتاح العام قبل تعطيل طريقة مصادقة تعمل بالفعل.
الإخفاقات الشائعة ودلالاتها
العرض
السبب الأكثر ترجيحًا
التحقق التالي
يتم قطع اتصال SFTP فورًا بعد المصادقة
أحد مكونات مسار chroot قابل للكتابة أو غير مملوك للمستخدم الجذر؛ أو بدلاً من ذلك، يكون دليل البدء المطلوب غير موجود.
قم بتشغيل سجلات الخدمة namei -l /srv/sftp/contractorوفحصها /uploadومراجعتها.
يتصل المستخدم لكن لا يمكنه التحميل
المجلد الفرعي القابل للكتابة له مالك أو وضع خاطئ
افحص statمخرجات المجلد الفرعي للتحميل؛ لا تُغيّر ملكية جذر السجن إلى المستخدم.
لا يزال بإمكانك فتح واجهة SSH
عدم تطابق المجموعة أو قاعدة SSH سابقة سارية
اركض id contractorوsshd -T -C
تم رفض تسجيل الدخول باستخدام المفتاح العام
ملف المفاتيح المصرح بها غير موجود في المسار المُكوّن أو فشلت أذوناته في التحقق من الصحة
افحص AuthorizedKeysFileموضع المفتاح، وملكية الملف، وسجل SSH
فشل عميل SCP قديم
وهو يتوقع بروتوكول SCP القديم، الذي يحتاج إلى واجهة طرفية عن بعد
استخدم بروتوكول SFTP أو عميل SCP الذي يستخدم SFTP، وليسscp -O
تحقق من السجلات باستخدام sudo journalctl -u ssh -n 80 --no-pagerالأمر المناسب. يعتمد الخطأ المحدد على إعدادات PAM، وتكوين SSH، والوصول إلى نظام الملفات، وطريقة المصادقة. يستخدم OpenSSH 9.0 والإصدارات الأحدث بروتوكول SFTP لعمليات scpالنقل القياسية افتراضيًا، بينما يتطلب الوضع القديم استخدام سطر الأوامر، كما هو موضح في دليل استخدام scp في Ubuntu 24.04 .
هل يمكنك حصر جلسة SSH التفاعلية في مجلد واحد؟
لا يمكن تحقيق ذلك بتغيير دليل المستخدم الرئيسي أو باستخدام مثال SFTP فقط المذكور أعلاه. ChrootDirectoryيمكن أيضًا استخدام OpenSSH لجلسات سطر الأوامر، ولكن يجب أن تتضمن البيئة المعزولة (jail) بيئة سطر أوامر قابلة للاستخدام، ومكتباتها المشتركة، وعُقد الأجهزة المطلوبة، وأي تبعيات للأوامر. يتطلب بناء هذه البيئة بشكل آمن أكثر من مجرد إضافة سطر واحد sshd_config. من السهل إنشاء إعداد هش أو مُضلل، خاصةً عند استخدام أوامر سطر أوامر أو عمليات ربط عشوائية.
إذا كان المستخدم بحاجة فعلية إلى أوامر تفاعلية، فحدد أولًا الأوامر والملفات التي يحتاجها بدقة. بالنسبة لمجموعة أوامر صغيرة، استخدم أوامر عن بُعد محدودة النطاق أو نقطة نهاية مخصصة للتطبيق. أما بالنسبة للبيئات المستقلة الأوسع، فضع في اعتبارك استخدام حاوية أو جهاز افتراضي مع ربط صريح لنظام الملفات، وضوابط صلاحيات، وقيود على الشبكة. لا يُعدّ استخدام chroot وحده بديلاً عن عزل النظام بالكامل، ولا يوفر كل من chroot وأذونات ملفات Unix الحماية من مستخدم ذي صلاحيات عالية قادر على تغيير النظام الأساسي.
قائمة التحقق الأمني قبل منح الوصول
حساب التحويل ليس حساب مسؤول وينتمي فقط إلى المجموعات الضرورية.
كل مكون يؤدي إلى السجن مملوك للمستخدم الجذر ولا يمكن الكتابة إليه من قبل المجموعة أو العالم.
يقع موقع التحميل القابل للكتابة داخل السجن، وليس في جذر السجن نفسه.
يتطابق المستخدم المقصود مع ChrootDirectory، ForceCommand internal-sftpوتم تعطيل إعادة التوجيه في التكوين الفعال.
تنجح عملية تحميل SFTP حقيقية، وتفشل محاولة الوصول إلى الملفات الموجودة على المضيف فقط، ويتم حظر الوصول العادي إلى واجهة سطر الأوامر SSH.
تتم إدارة النسخ الاحتياطي والاحتفاظ والحصص والمراقبة وإلغاء الحساب بشكل منفصل؛ ولا يقوم سجن الدليل بتنفيذ هذه السياسات تلقائيًا.
للحصول على مزيد من التفاصيل التقنية، يُرجى الرجوع إلى مرجع تكوين OpenSSH لنظام Ubuntu 24.04 ودليل خادم SFTP لنظام Ubuntu . هذه التعليمات مُخصصة لنظام Ubuntu 24.04 LTS؛ قد تُغير حزم البرامج ومقاطع SSH البرمجية الموجودة السلوك الفعلي، لذا فإنّ المرجع النهائي هو التكوين واختبارات الاتصال الفعلية على جهازك.