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

من مربع حوار الاستيراد إلى التوجيه

الملف الشخصي ملف نصي يحوي توجيهات، والعميل يقرأها قبل أن يوجد أي نفق. توجيه مثل up أو down أو tls-verify يسمّي برنامجًا خارجيًا ينبغي أن يشغّله OpenVPN في لحظة محددة. أما ما إذا كان OpenVPN على استعداد لتشغيله فهو إعداد منفصل يُسمى script-security، والملف الشخصي يعيّنه عادة أيضًا.

فالتحذير إذن لا يتعلق بالتشفير أو الشهادات. إنه يتعلق بملف إعداد يطلب من العميل تنفيذ شيء على المضيف، وبالعميل الذي يتحقق مما إذا كان مستوى أذونه الحالي يسمح بذلك الطلب.

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

ما الذي يفتحه كل مستوى في الواقع

المستوى 0 يحظر استدعاءات البرامج الخارجية كليًا، وهو منطقي مع عميل يضبط واجهته بنفسه دون مساعدة وغير منطقي مع عميل يستدعي نظام التشغيل. المستوى 1، الافتراضي، يسمح بالملفات التنفيذية المدمجة التي تحتاجها تهيئة الواجهة والتوجيه. لا يشغّل أي من المستويين شيئًا وفّره المستخدم.

LevelWhat OpenVPN may executeWhat it exposes
0No external programs at allInterface and route setup must not depend on helpers
1 (default)Built-in helpers such as ip, ifconfig, route or netshPrivileged commands the platform already ships
2Built-in helpers plus user-defined scriptsWhatever the named script does with the client's privileges
3Everything above, plus passwords in environment variablesCredentials visible to child processes and their logs

المستوى 2 هو الحد المثير للاهتمام، لأنه يسمح بسكربتات يعرّفها المستخدم. من تلك النقطة تنطبق امتيازات العميل على شيفرة ربما لم تقرأها قط، تُستدعى في لحظات لم تخترها، في بيئة تتضمن تفاصيل الاتصال. المستوى 3 يذهب أبعد ويسمح بتمرير كلمات المرور عبر متغيرات البيئة، ولهذا تصفه الوثيقة بأنه قد يكون غير آمن.

لا شيء من هذه الأرقام إعداد قوة. الملف الشخصي عند المستوى 3 لا يملك تشفيرًا أفضل من ملف عند المستوى 1؛ فلديه ببساطة سطح تنفيذ أكبر، والنفق متطابق.

قرّر ما يستحقه الملف الشخصي

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

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

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

grep -nE 'script-security|^up |^down |tls-verify' client.ovpn

غيّر شيئًا واحدًا، ثم راقب أيضًا عملية الإغلاق

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

openvpn --config client.ovpn --script-security 2 --verb 3
ip route show default

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

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

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

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