سطحهای script-security در OpenVPN از 0 تا 3 و اینکه هر کدام چه چیزی را باز میکند
هر سطح script-security گسترش میدهد که یک پروفایل چه چیزی را میتواند اجرا کند: ابتدا کمککنندههای مدیریتی، سپس اسکریپتهای کاربر، و سپس گذرواژهها در محیط. دستورالعملها را بخوانید.
یک پروفایل را در یک کلاینت رومیزی وارد کنید و نخستین شکست اغلب خطی است که کلاینت از احترام به آن سر باز میزند: قلاب اسکریپتی که اجرا نمیکند، یا مقدار script-security که آن را بیش از حد مجاز میداند. بالا بردن عدد کادر گفتگو را از میان میبرد. اما دامنه آنچه این پروفایل اجازه دارد روی دستگاه شما اجرا کند نیز گستردهتر میشود، و دادن چنین امتیازی فقط برای بستن یک هشدار عجیب است. وارد کردن را تا دستورالعمل دنبال کنید و تصمیم ملموس میشود.
از کادر وارد کردن تا دستورالعمل
پروفایل یک فایل متنی با دستورالعملهاست و کلاینت آنها را پیش از وجود هر تونلی میخواند. دستورالعملهایی مانند up، down یا tls-verify برنامهای بیرونی را نام میبرند که OpenVPN باید در لحظهای معین اجرا کند. اینکه OpenVPN مایل به اجرای آن باشد تنظیم جداگانهای به نام script-security است و پروفایل معمولاً آن را هم تعیین میکند.
پس هشدار درباره رمزنگاری یا گواهیها نیست. درباره فایل پیکربندیای است که از کلاینت میخواهد چیزی را روی میزبان اجرا کند، و درباره کلاینتی که بررسی میکند آیا سطح مجوز فعلیاش چنین درخواستی را میپذیرد.
در این مرحله دو شکست متفاوت شبیه هم به نظر میرسند. پروفایلی که سطحی را میخواهد که کلاینت نمیدهد، رد شدن تولید میکند. پروفایلی که سطحی را میخواهد که کلاینت میدهد اما اسکریپت موجود نیست، در عوض شکست در زمان اجرا تولید میکند، و این دو در رشتههای پشتیبانی با هم اشتباه گرفته میشوند. یکی پرسش مجوز است و دیگری پرسش بستهبندی.
هر سطح در واقع چه چیزی را باز میکند
سطح 0 فراخوانی برنامههای بیرونی را کاملاً ممنوع میکند، که برای کلاینتی که رابط خود را بدون کمک پیکربندی میکند سازگار و برای کلاینتی که به سیستمعامل تکیه میکند ناسازگار است. سطح 1، پیشفرض، فایلهای اجرایی درونی را که پیکربندی رابط و مسیر به آنها نیاز دارد مجاز میداند. هیچیک از دو سطح چیزی را که کاربر فراهم کرده اجرا نمیکند.
| Level | What OpenVPN may execute | What it exposes |
|---|---|---|
| 0 | No external programs at all | Interface and route setup must not depend on helpers |
| 1 (default) | Built-in helpers such as ip, ifconfig, route or netsh | Privileged commands the platform already ships |
| 2 | Built-in helpers plus user-defined scripts | Whatever the named script does with the client's privileges |
| 3 | Everything above, plus passwords in environment variables | Credentials 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 یا مسیری را که تونل لازم داشت بردارد، و اتصال حاصل بینقص احراز هویت میشود در حالی که هیچ چیزی را حل نمیکند.
تصمیمی که باید ثبت شود باریک است: کدام اسکریپت، در کدام مسیر، در کدام سطح مجاز شده، برای کدام پروفایل. هر چیز دیگری در پروفایل بدون تغییر میماند، و این جملهای است که یک بازبین میتواند بررسی کند.