تبدأ الخدمة، ويتصل عميل، ولا يظهر أي مسار على الإطلاق في جانب الخادم. أو يرفض الخفي بدء التشغيل ويسمي أمرًا لم يستطع تنفيذه. تتبع النتيجتان الأسطر الثلاثة نفسها، التي تُنسخ عادةً معًا من دليل تصليب: الانتقال إلى حساب غير مخوّل، وإسقاط المجموعة، وتغيير جذر نظام الملفات. واحد فقط من الثلاثة يخفي الملفات، وواحد فقط منها يزيل صلاحية تغيير جدول التوجيه. فصلها هو الطريق لمعرفة أي سطر تريده فعلاً.

ما يزيله السجن ويحتاجه الخفي بعد

يحدث تغيير الجذر بعد بدء التشغيل، لذا يحتفظ الخفي بكل ما فتحه بالفعل ويفقد كل ما سيفتحه لاحقًا. أي مساعد يشغله الاتصال بعد تلك النقطة يجب أن يوجد داخل الجذر الجديد، مع المكتبات المشتركة التي يحمّلها. السجن المبني من ملف إعدادات وشهادة لا يملك أيًا منهما.

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

ثلاثة شروط تحدد أي إصلاح تحتاج

الشرط الأول هو كيف يثبّت البناء الخاص بك المسارات. إصدارات OpenVPN الأحدث تهيّئ الواجهة وجدول التوجيه داخل العملية، بينما تعتمد الحزم الأقدم والإعدادات المخصصة على أدوات خارجية أو على سكربتات up وdown. إذا سمّى السجل أمرًا، فهناك أداة خارجية معنية والسجن يخفيها. وإذا أظهر السجل خطأ صلاحيات بدلاً من ذلك، فالمشكلة في الحساب.

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

Signal in the logOther side of the boundaryRepair direction
Command not found after startupBinary and its libraries absent inside the new rootPopulate the jail, or drop the chroot line
Operation not permittedAccount lost the privilege to edit routesKeep the account privileged, or pre-create routes elsewhere
No such deviceJail lacks the tun device nodeCreate 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 وحده. الخطوة التي ينكسر عندها النفق تحدد الحد، وتتجنب إعادة بناء سجن لم يكن السبب قط.

عندما يعود للتوجيه، شغّل جلسة عميل واحدة بقدر أكبر من التفصيل واقرأ السطر الذي يسمي الأمر أو الصلاحية التي فشلت. ذلك السطر أغلى من المهلة التي يبلغ عنها العميل في النهاية.

مقالات ذات صلة