إيقاف عميل واحد من OpenVPN: لماذا يُعد الإبطال الرافعة الخاطئة
قتل الجلسة قابل للعكس؛ أما إبطال الشهادة فليس كذلك. حدد الرافعة التي تحتاجها الحالة، ثم أعد بناء قائمة الإبطال فقط عندما يناسب ذلك.
يبدو إيقاف وصول عميل واحد مؤقتا وإزالته نهائيا كأنهما المهمة نفسها إلى أن تحاول التراجع عن أحدهما. فإبطال الشهادة يكتب سجلا يعتبره الخادم نهائيا، والتراجع عنه يعني تعديل قاعدة بيانات الجهة المصدرة يدويا. أما إسقاط النفق الحاضر فهو أمر إداري لا يغير شيئا في الثقة. اختر الرافعة بسؤال ما إذا كان المفتاح ما زال جديرا بالثقة، لا بسؤال مدى إلحاح الطلب.
الاعتقاد السائد: الإبطال والتعليق شيء واحد
يعلق متعاقد لمدة أسبوع فيكون رد الفعل الأول هو الإبطال، لأن كلمة إبطال تبدو كإطفاء شيء ما. يبدو الأمر مرتبا، ولا يستغرق سوى عشر ثوان، ويترك تعديل قاعدة البيانات سبيلا وحيدا للعودة. رد الفعل مفهوم، وهو أقرب إلى إحراق جواز سفر من إغلاق باب. الجهاز المعلق والمفتاح المخترق يحتاجان معالجة مختلفة، وواحد فقط منهما رخيص العكس.
التمييز يتعلق بالبيانات السرية لا بالشخص. المفتاح الذي ما زال في الأيدي الصحيحة يمكن تعليقه واستئنافه دون أي خسارة في الثقة. أما المفتاح الذي ربما نسخ فلا ينبغي استعادته أبدا، لأن الاستعادة تفترض أن النسخة غير موجودة.
اكتب الجواب قبل أن تلمس أي واحد من النظامين. وإذا لم تستطع الجزم بما إذا كان المفتاح مكشوفا، فالجواب المتحفظ هو الاستبدال.
أسقط الجلسة الحاضرة عبر واجهة الإدارة
OpenVPN يوفر واجهة إدارة تستطيع سرد الجلسات وقتل إحداها بالاسم الشائع. فعله على localhost وأبقها بعيدا عن الواجهة العامة، وأرسل أمر القتل عندما يجب أن تختفي جلسة الآن. الأمر يغلق ذلك النفق وحده، ويظل كل عميل آخر يعمل.
هذا استجابة لمشكلة قائمة، وليس سياسة تعليق. يمكن للملف الشخصي نفسه أن يعيد الاتصال خلال دقيقة، لأن شيئا لم يتغير في بياناته السرية. استخدمه عندما يجب أن تذهب الجلسة ولا يزال القرار الدائم قيد الاتخاذ.
تأكد من أن الجلسة كانت متصلة قبل قتلها، حتى لا تطارد عميلا لم يتصل قط. أمر الحالة أدناه يطبع ما هو متصل حاليا.
printf 'status 2\nquit\n' | nc 127.0.0.1 7506
printf 'kill kiosk-14\nquit\n' | nc 127.0.0.1 7506إذا أبلغ أمر القتل بعدم وجود عميل بهذا الاسم، فالاسم الشائع في الشهادة ليس السلسلة التي كتبتها. اقرأ مخرجات الحالة بدلا من اسم ملف التعريف.
ما تتحكم فيه قائمة الإبطال فعليا
لا يرجع الخادم إلى علامة إبطال مخزنة على الشهادة. بل يقرأ قائمة إبطال الشهادات المحددة في crl-verify عند كل اتصال جديد، ويرفض أي شهادة يظهر رقمها التسلسلي في تلك القائمة. ويترتب على ذلك نتيجتان، وكلتاهما مهمة تشغيليا. يجب أن يكون الملف مقروءا للحساب الذي يتخلى له الخادم عن صلاحياته، ويظل العميل المتصل بالفعل يعمل حتى يعيد الاتصال.
النتيجة الثانية تفاجئ الناس أثناء الحوادث. إبطال شهادة لا يغلق النفق الذي يستخدمها حاليا. اقرن الإبطال بأمر قتل إداري إذا كان على الجلسة أن تنتهي فورا، وتعامل مع الإجراءين كخطوتين منفصلتين في دليل التشغيل.
افحص القائمة لترى ما سيفرضه الخادم فعليا، بدلا من الوثوق بطابع الوقت لآخر ملف نسخته. عدد الأرقام التسلسلية هو الجزء المهم.
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | sed -n '1,14p'
ls -l /etc/openvpn/server/crl.pemقائمة بلا مدخلات وقائمة بالمدخلات الصحيحة تبدوان متطابقتين في سرد الدليل، ولهذا يستحق عدد الأرقام التسلسلية الطباعة. سطر الأذونات لا يقل أهمية، لأن ملفا لا يستطيع الخادم الخفي قراءته ينتج فشلا يشبه عميلا مرفوضا.
استعادة سجل، بحذر
استعادة شهادة تعني عكس سجل في قاعدة بيانات الإصدار ونشر قائمة جديدة. يحتفظ easy-rsa 3 بتلك القاعدة باسم index.txt داخل دليل PKI، بينما استخدمت التخطيطات الأقدم ترتيبا مختلفا. يبدأ الصف بحرف حالة وتاريخ انتهاء. أما الصف المبطل فيدرج طابعا زمنيا للإبطال قبل أن يتابع بالرقم التسلسلي واسم ملف الشهادة والاسم المميز. وإعادة الصف إلى مكانه تعني حذف ذلك الطابع الزمني وقلب الحرف، مع ترك كل شيء آخر دون مساس.
انسخ الملف أولا، واكتب التعديل في صورة سكربت بدلا من الكتابة في محرر نصوص. خطأ مطبعي يغير عدد الحقول التي يحملها الصف يفسد الإصدار لكل شهادة تضاف بعده. ولهذا السبب يجب أتمتة التغيير ونسخ الملف قبل لمسه.
كثيرا ما يفشل الإبطال الثاني للاسم نفسه أيضا، لأن التشغيل الأول نقل تلك الشهادة ومفتاحها خارج الأدلة التي تتوقع الأداة وجودهما فيها. عندئذ لا تستطيع الأداة إيجاد ما طلب منها إبطاله، ورسالة الخطأ ليست واضحة دائما بشأن السبب.
cp /etc/easy-rsa/pki/index.txt /root/index.txt.$(date +%F-%H%M)
grep -c '^R' /etc/easy-rsa/pki/index.txt
easyrsa gen-crlانشر القائمة الجديدة، وصحح ملكيتها، واجعل الخادم يقرأها. إعادة التحميل كافية في معظم التنصيبات، لكن التأكيد يجب أن يأتي من اتصال جديد، لأن الجلسة القائمة لم تعاود التحقق من شيء.
تحقق من الرافعة التي تستحقها الحالة
اطرح السؤال الواحد الذي يحدد دليل التشغيل بأكمله: هل المفتاح الخاص ما زال في مكانه الصحيح فقط. إذا كان كذلك، فإن قتل الجلسة مع تعليق موثق يغطي الحالة ولا يترك سجلا دائما. وإذا لم يكن كذلك، فالجواب الآمن الوحيد هو مفتاح جديد مع إبقاء الشهادة القديمة مبطلة.
ثم تحقق من النتيجة بمحاولة اتصال لا بفارق في الإعدادات. فالفارق يخبرك بما قصدته، والاتصال يخبرك بما يفرضه الخادم.
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | grep -c 'Serial Number'
printf 'status 2\nquit\n' | nc 127.0.0.1 7506عندما يتصل عميل مستعاد ويظهر في مخرجات الحالة، يكون تعديل السجل قد نجح. وعندما يرفض عميل مبطل ويذكر السجل قائمة الإبطال، يكون الإبطال قد نجح. وأي شيء بين الحالتين هو مشكلة أذونات أو إعادة تحميل، ويستحق الإصلاح قبل وصول الطلب التالي.