هل تتخلى عن chroot أم تنسخ iproute2 إلى السجن؟
السجن غير المكتمل يفشل بعد بدء التشغيل، لا عند الإقلاع. اختر بين تخفيف التصليب ونسخ الملفات الثنائية والمكتبات إلى الجذر الجديد.
تبدأ الخدمة، ويتصل عميل، ولا يظهر أي مسار على الإطلاق في جانب الخادم. أو يرفض الخفي بدء التشغيل ويسمي أمرًا لم يستطع تنفيذه. تتبع النتيجتان الأسطر الثلاثة نفسها، التي تُنسخ عادةً معًا من دليل تصليب: الانتقال إلى حساب غير مخوّل، وإسقاط المجموعة، وتغيير جذر نظام الملفات. واحد فقط من الثلاثة يخفي الملفات، وواحد فقط منها يزيل صلاحية تغيير جدول التوجيه. فصلها هو الطريق لمعرفة أي سطر تريده فعلاً.
ما يزيله السجن ويحتاجه الخفي بعد
يحدث تغيير الجذر بعد بدء التشغيل، لذا يحتفظ الخفي بكل ما فتحه بالفعل ويفقد كل ما سيفتحه لاحقًا. أي مساعد يشغله الاتصال بعد تلك النقطة يجب أن يوجد داخل الجذر الجديد، مع المكتبات المشتركة التي يحمّلها. السجن المبني من ملف إعدادات وشهادة لا يملك أيًا منهما.
الانتقال إلى حساب غير مخوّل قيد منفصل. قد لا يتمكن التطبيق الذي تنازل عن root من تغيير المسارات أو رفع واجهة حتى عندما يكون الملف الثنائي هناك تمامًا، لذا يجب تشخيص العطلين بشكل منفصل.
ثلاثة شروط تحدد أي إصلاح تحتاج
الشرط الأول هو كيف يثبّت البناء الخاص بك المسارات. إصدارات OpenVPN الأحدث تهيّئ الواجهة وجدول التوجيه داخل العملية، بينما تعتمد الحزم الأقدم والإعدادات المخصصة على أدوات خارجية أو على سكربتات up وdown. إذا سمّى السجل أمرًا، فهناك أداة خارجية معنية والسجن يخفيها. وإذا أظهر السجل خطأ صلاحيات بدلاً من ذلك، فالمشكلة في الحساب.
الثاني هو الصيانة. يجب تحديث السجن ذي الملفات الثنائية المنسوخة كلما حُدّثت الحزمة التي توفرها، وإلا فإن أول تحديث يترك نفقًا مكسورًا خلفه. الثالث هو ما إذا كان ضابط معين يتطلب chroot فعلاً؛ فإذا كان الشرط يتعلق في الواقع بفصل الصلاحيات، فقد يكفي تغيير الحساب وحده.
| Signal in the log | Other side of the boundary | Repair direction |
|---|---|---|
| Command not found after startup | Binary and its libraries absent inside the new root | Populate the jail, or drop the chroot line |
| Operation not permitted | Account lost the privilege to edit routes | Keep the account privileged, or pre-create routes elsewhere |
| No such device | Jail lacks the tun device node | Create the node inside, or open it before the root change |
ما يجب أن يحتويه السجن العامل
السجن الذي ينفّذ أوامر يحتاج إلى الملف الثنائي، وكل مكتبة يرتبط بها، وأي عقدة جهاز يفتحها الخفي متأخرًا. انسخ الأجزاء واختبرها دون الـ VPN في الصورة:
ldd /usr/sbin/ip
chroot /etc/openvpn/jail /sbin/ip route show
chroot /etc/openvpn/jail /sbin/ip link set tun0 up
يسرد الأمر الأول التبعيات، وهو الأمر الذي يتخطاه الناس. الملف الثنائي المنسوخ الذي لا يجد مكتبة يفشل برسالة مختلفة عن الملف الثنائي المفقود، ويبدو كلاهما كعطل في OpenVPN عند قراءته من جانب العميل. تشغيل الأمر يدويًا داخل السجن يعيد إنتاج العطل دون إعادة تشغيل الخدمة.
انسخ أيضًا الإعدادات والشهادات وأي CRL إلى السجن، لأن ملفًا يتوقع الخفي إعادة قراءته بعد بدء التشغيل لن يُعثر عليه بعد تغيير الجذر. سجّل ما نسخته، لأن التحديث التالي لحزمة الشبكة يستبدل النسخ الأصلية ويترك السجن على النسخة القديمة.
قلّص التصليب بدلاً من ذلك
إذا كان السجن موجودًا فقط لأن دليلاً قال ذلك، فإن إزالة ذلك السطر الواحد مع الإبقاء على قيود الحساب نتيجة قابلة للدفاع. يحتفظ الخفي برؤيته لنظام الملفات ويفقد المشكلة، ولا يزال إسقاط الصلاحيات يزيل root من العملية طويلة العمر.
دوّن ما يتبقى، ولماذا. الإعداد الذي فقد ضابطًا بصمت دون ملاحظة هو كيف ينحرف التصليب، وستسأل المراجعة التالية لماذا اختفى السطر.
اقسم الأسطر الثلاثة قبل الاختيار
انسخ الإعدادات، وعطّل التوجيهات الثلاثة، وتأكد من اتصال عميل ومن ظهور المسارات المتوقعة. ثم أعد تمكين أسطر الحساب فقط، ثم chroot وحده. الخطوة التي ينكسر عندها النفق تحدد الحد، وتتجنب إعادة بناء سجن لم يكن السبب قط.
عندما يعود للتوجيه، شغّل جلسة عميل واحدة بقدر أكبر من التفصيل واقرأ السطر الذي يسمي الأمر أو الصلاحية التي فشلت. ذلك السطر أغلى من المهلة التي يبلغ عنها العميل في النهاية.