كيف يحوّل OpenConnect ملف تعريف ارتباط تسجيل الدخول إلى نفق؟
يستبدل OpenConnect ملف تعريف ارتباط تسجيل الدخول عبر الويب بنفق VPN. الملف حامل للجلسة، لذا احمِ التسليم لا صفحة الدخول وحدها.
يربط OpenConnect تبادلين منفصلين بقيمة واحدة قصيرة العمر: تسجيل الدخول عبر الويب ونفق الـ VPN. التبادل الأول هو HTTPS عادي: تذهب بيانات الاعتماد أو رحلة SAML ذهابًا وإيابًا أو رمز إلى البوابة، ويحمل الرد ملف تعريف ارتباط للمصادقة. أما التبادل الثاني فيقدّم ذلك الملف إلى البوابة نفسها كدليل على أن مرحلة الويب قد حدثت بالفعل، وعندها فقط يبدأ النفق.
لا يجري التفاوض على أي شيء يخص النفق أثناء تسجيل الدخول. هذا هو الجزء الجدير بالفهم، لأن معظم أخطاء كتابة السكربتات تفترض أن ملف تعريف الارتباط كلمة مرور تُخزَّن، أو مفتاح يحمي حركة المرور، بينما هو في الحقيقة تذكرة حاملة لجلسة معيّنة على بوابة معيّنة.
ما يتبادله العميل والبوابة، بالترتيب
تبدو مرحلة المصادقة كموقع ويب محمي عادي. يرسل OpenConnect بيانات اعتماد المستخدم، أو يتبع إعادة توجيه البوابة إلى مزوّد هوية، فترد البوابة بمستند يضمّن ملف تعريف ارتباط المصادقة. في بروتوكول AnyConnect تنتقل هذه القيمة في ترويسة ملف تعريف ارتباط مع الطلبات التالية، عادة باسم مثل webvpn، ويعاملها الدليل على أنها البيانات التي تحمل الجلسة إلى الأمام.
المرحلة الثانية طلب CONNECT إلى نقطة نهاية الـ VPN في البوابة مع إرفاق ذلك الملف. تتحقق البوابة منه، وتخصّص عنوانًا، ويبدأ العميل CSTP فوق TLS، مع DTLS كمسار بيانات أسرع اختياري بمجرد وجود الجلسة. وعند هذه النقطة فقط تُحدَّد معاملات النفق والمسارات وإعدادات DNS ومفاتيح حركة المرور الخاصة بالجلسة. لقد أوصل الملف العميل عبر الباب؛ لكنه لم يشفّر شيئًا.
يفسّر هذا التسلسل سبب وجود openconnect --authenticate. شغّله، فينفّذ مرحلة الويب، ويطبع كتلة صغيرة من متغيرات الصدفة مثل COOKIE، HOST، CONNECT_URL، FINGERPRINT، ثم يخرج قبل بناء أي نفق. ويمكن لسكربت غلاف أن يبدأ الاتصال الحقيقي بهذه القيم، وهو بالضبط الفصل الذي يحتاجه نشر بلا واجهة أو نشر بحاويتين.
ملف تعريف الارتباط حامل جلسة، لا مفتاح
تعامل مع القيمة كما تتعامل مع معرّف جلسة في تطبيق ويب. من يحملها خلال عمرها يستطيع أن يطلب من البوابة النفق الذي تستحقه تلك الجلسة، لذا فإن سريتها مهمة. لكن نسخها لا يكشف حركة المرور، لأن سرية النفق تأتي من مصافحة TLS والمفاتيح المشتقة، لا من سلسلة الملف نفسه.
وهي أيضًا ليست منحة دائمة. تقرر البوابة ومزوّد الهوية كم تعيش الجلسة، ومتصفح لا يزال يعرض صفحة مسجّلًا فيها لا يقول شيئًا عن صلاحية جلسة النفق. إعادة الاتصال بعد الانتهاء تعني تكرار مرحلة الويب وإنتاج ملف جديد، وهذا هو مقصد إعادة المصادقة لا إزعاجًا يُلتف حوله بالهندسة.
لا تعامل ملف تعريف الارتباط كبديل شامل للبيانات الأخرى. تأكيد SAML وكلمة مرور في المتصفح وملف أصدرته خدمة مختلفة كائنات مختلفة بجماهير مختلفة، ولصق أحدهما في حقل الآخر يفشل عادة عند البوابة أو، وهو أسوأ، ينجح أمام حدّ الثقة الخطأ.
تمرير الملف دون ترك نسخ
أأمن تسليم ميكانيكي على لينكس هو الإدخال القياسي. يقرأ --cookie-on-stdin القيمة من stdin، فلا يظهر الملف أبدًا في قائمة معاملات العملية حيث يستطيع أي مستخدم محلي قراءته باستخدام ps. والخط الأنابيب الذي يصادق في عملية ويغذّي النفق في عملية أخرى يبقي القيمة في أنبوب لا في ملف أو متغير بيئة.
المعاملات ومتغيرات البيئة أضعف لأسباب مختلفة. المعامل مرئي في جدول العمليات طوال عمر العميل، وكثيرًا ما يستقر في سجل الصدفة. ومتغير البيئة يُورَّث للأبناء، ووحدة systemd التي تضبطه في ملف الوحدة تخزّن السر في إعداد قابل للقراءة. وإذا لزم ملف، فاقصره على حساب الخدمة واحذفه عند انتهاء الجلسة.
اجعل حدّ الامتياز متعمّدًا أيضًا. العملية التي تتحدث إلى مزوّد الهوية وربما تفتح متصفحًا ينبغي أن تعمل باسم المستخدم صاحب ذلك التسجيل. والعملية التي تهيّئ المسارات وDNS وجهاز النفق قد تحتاج امتيازًا أكبر. تشغيل المتصفح كله كـroot لإتاحة ملفه لنفق مملوك لـroot هو المقايضة الخاطئة، ويمكن لإعدادات OpenConnect الحديثة أن تمرّر القيمة عبر ذلك الحد صراحة.
يستحق التسجيل الشك نفسه. يمكن لمخرجات العميل المطوّلة وسكربتات المساعدة وتشخيصات البوابة أن تردد مواد الطلب، وليس كل مستوى تسجيل يحجب الملف. التقط أصغر سجل خطأ تحتاجه، وأبعده عن القنوات المشتركة، وافحص نسخة محجوبة قبل إرفاقها بتذكرة.
التحقق والانتهاء في المرحلة الثانية
على المرحلة الثانية أن تتحقق من الخادم رغم ذلك. إن FINGERPRINT الذي يطبعه --authenticate هو تثبيت شهادة بصيغة pin-sha256:، وتمريره إلى استدعاء النفق باستخدام --servercert يُبقي الفحص مربوطًا بالبوابة التي صادقت عليها. وإيقاف التحقق من الشهادة لتبسيط سكربت يزيل الدليل الوحيد على أن الملف يُسلَّم إلى المضيف المقصود.
حين ترفض البوابة الملف، فالعلاج جولة مصادقة جديدة لا ذاكرة أطول. خزّن الملف لعمر الاتصال فقط، واحذف الملفات المؤقتة عند الخروج، واستخدم عملية إزالة الجلسة لدى مزوّد الهوية أو البوابة عندما تُعرَّض جلسة أو يُفقد جهاز. وملف مخزّن مؤقتًا ليس إعفاءً من MFA.
قبل أتمتة هذا، تحقق من أربعة أمور: أن النفق يعمل بالحساب الصحيح، وأن الملف يصل عبر stdin، وأن بصمة الشهادة مثبتة، وأن الجلسة تُهمل عند إغلاق النفق. إن غاب أحدها، فقد وسّعت الأتمتة الثقة في الملف بدل أن تعيد إنتاج التدفق اليدوي.