OpenVPN گذرواژه را از ترمینال میخواند، نه از stdin
OpenVPN واقعاً گذرواژه را از کجا میخواند، چرا فایلی روی stdin شکست میخورد، و سه مسیر پشتیبانیشده برای ورود اسکریپتی در لینوکس و macOS.
OpenVPN نام کاربری و گذرواژه را روی ترمینال کنترلکننده میپرسد و فایلی که به ورودی استاندارد هدایت شده باشد آن ترمینال نیست. همان یک جزئیات اسکریپتی را توضیح میدهد که با وجود گذرواژه در لوله، معلق میماند. اعلان را کلاینت میکشد و خواندن از دستگاه ترمینال انجام میشود، پس هدایت stdin هیچ چیز را تغییر نمیدهد. کلاینت را از یکی از مسیرهای ورودی مستندش تغذیه کنید و همان اسکریپت در نخستین تلاش وصل میشود.
سه مسیر تقریباً همه حالتها را پوشش میدهد و هر کدام به شیوه خودش شکست میخورد. بر اساس اعلانی انتخاب کنید که کلاینت واقعاً نشان میدهد، نه بر اساس گزینهای که اسکریپتکردنش آسانتر است.
اعلان از stdin نمیآید
وقتی OpenVPN به اعتبارنامه نیاز دارد ترمینال کنترلکننده را باز میکند و از همانجا میخواند. به همین دلیل یک آزمون تعاملی خوب به نظر میرسد، در حالی که همان فرمان زیر cron یا یک فایل unit بیحرکت مینشیند و اعلان در گزارشی نوشته میشود که کسی نگاهش نمیکند. برخی ساختها وقتی ترمینالی وجود ندارد به ورودی استاندارد برمیگردند و این ناسازگاری از یک شکست سخت بدتر است، چون مشکل را تا زمان استقرار پنهان میکند.
پیش از نوشتن هر کدی محیط را بررسی کنید: کلاینت را با همان کاربر و همان stdin اجرا کنید که زمانبند یا مدیر سرویس اجرا خواهد کرد. اگر اعلان هرگز در گزارش ظاهر نشود و فرایند پیش نرود، چیزی منتظر ترمینالی است که وجود ندارد.
مسیر اول: فایل اعتبارنامه دوخطی
گزینه احراز هویت یک مسیر میگیرد و فایل دقیقاً دو خط دارد، نخست نام کاربری سپس گذرواژه، و هیچ چیز دیگر. مسیر را صریح بدهید بهجای تکیه بر یک نام فایل پیشفرض، چون فایل اعتبارنامه سرگردانی در پوشه کار همان راهی است که حساب اشتباه به کار گرفته میشود. حالت را روی 0600 بگذارید و مالکیت را به حسابی بدهید که کلاینت را اجرا میکند.
کلاینت آن فایل را یک بار هنگام راهاندازی میخواند، پس چرخاندن گذرواژه یعنی راهاندازی دوباره فرایند. این معمولاً همان رفتاری است که میخواهید و جای آن در runbook کنار رویه چرخش است.
مسیر دوم: askpass برای عبارت عبور کلید
کلید خصوصی محافظتشده با عبارت عبور یک اعلان دوم و متفاوت ایجاد میکند و پاسخ فایلی خودش را دارد: گزینه askpass عبارت عبور را از خط اول یک فایل میخواند. برای تونلهای مبتنی بر SSH معادل آن برنامه askpass است که کلاینت اجرا میکند و خروجی استانداردش راز میشود.
هیچکدام از دو شکل راز را در فهرست آرگومانها نمیگذارد و هر دو آن را به شکل فایل یا برنامه اجراییای که چاپش میکند باقی میگذارند. محافظت، مجوزهای فایل و مالکیت فرایند است، نه پنهانکاری. کمکیای که رشتهای سختکدشده را بازگو کند رازی با گامهای اضافه است.
مسیر سوم: CLI خود کلاینت درگاه
کلاینتهای سازمانی معمولاً یک نقطه ورود خط فرمان عرضه میکنند که بدون هیچ پنجرهای به یک درگاه نامدار وصل میشود و همان مسیر پشتیبانیشده است. در لینوکس کلاینت GlobalProtect عملیات اتصال و واردکردن گواهی را از طریق CLI خود ارائه میدهد و درگاههایی که از احراز هویت گواهی استفاده میکنند پیش از کارکردن اتصال خودکار به گام واردکردن نیاز دارند. آن را به فشردنهای کلید ساختگی ترجیح دهید: وضعیت خروج واقعی میگیرید، وابستگی به تمرکز پنجره ندارید و از صفحه قفلشده جان سالم بهدر میبرد.
اگر نخستین اتصال هنوز انسانی میخواهد تا گواهی را بپذیرد، خودکارسازی تمام نشده است. واردکردن را در زمان نصب انجام دهید و آن را بهعنوان پیشنیاز ثبت کنید.
وقتی جریان به شبهترمینال نیاز دارد
دنبالهای که گذرواژه و سپس کد یکبارمصرف میخواهد هیچ فایل واحدی برای خواندن ندارد. درایور ترمینالی مانند Expect ابزار درست است، چون بهترتیب منتظر هر الگو میماند و پیش از آنکه بتواند چیزی را تطبیق دهد به فرایند آغازشده نیاز دارد.
دو شکست غالب است. اسکریپتی که بیآنکه کلاینت را راه بیندازد منتظر اعلان میماند تا ابد منتظر میماند، و Tcl پوسته نیست، پس حساب پوستهای که داخل یک بلوک expect نوشته شود آنگونه که خوانده میشود ارزیابی نمیشود. پرچم اشکالزدایی را هنگام ساختن الگوها روشن نگه دارید و سپس خاموشش کنید.
رازهایی که درز میکنند، و کجا پنهان میشوند
هر چیزی که بهعنوان آرگومان داده شود در فهرست فرایندها دیده میشود، پس اعتبارنامهها جایشان در فایل یا پشت یک کمککننده است، هرگز روی خط فرمان نه. کدهای یکبارمصرف بر اساس طراحی مصرف میشوند و باید برای هر تلاش تولید شوند. گزارشهای شکست اغلب نام کاربری و گاهی بیشتر را حمل میکنند، پس پیش از فرستادن به هر جا آنها را پاکسازی کنید و راز را بیرون از خود پروفایل نگه دارید، چون فایل پیکربندی با گذرواژه جایگرفته در بلیتها و مخزنها چسبانده میشود. چرخاندن حساب آنگاه یعنی شکار هر نسخه، و این دقیقاً همان هزینهای است که این چیدمان از آن پرهیز میکند.
مسیرهایی را که برگزیدید حسابرسی کنید، سپس آنها را به فایل unit یا زمانبندی وصل کنید که واقعاً کلاینت را اجرا خواهد کرد. تونل دقیقاً تا زمانی زنده است که آن فرایند زنده است.