اسکریپت auth-user-pass-verify در OpenVPN: کد خروج را درست تنظیم کنید
وضعیت خروج هوک همان تصمیم است، نه خط گزارش آن. نتیجهٔ بازبین را به 0، 1 یا تعویقشده نگاشت کنید، فایل اعتبارنامه را بهعنوان داده بخوانید و در خطا بسته شکست بخورید.
OpenVPN تنها بر یک خروجی از اسکریپت ورود عمل میکند: وضعیت خروج. هر کار دیگری که اسکریپت انجام میدهد تزئین است. یک هوک میتواند به بازبین درست برسد، پاسخ را تجزیه کند و خطی دوستانه چاپ کند، اما وضعیتی برگرداند که عکس قصد نویسندهٔ آن را میرساند. ابتدا قرارداد را بخوانید و آداپتور را پیرامون آن بنویسید، تا کل این رده از باگها ناپدید شود.
قرارداد کوچک است: حسابی را که ارسال شده شناسایی کنید، از بازبین تأییدشده پرسش موردنظر را بپرسید و تنها نتیجهٔ مثبت مستند همان بازبین را برای همان درخواست بپذیرید. هر چیز دیگری زیرساخت است.
سه وضعیتی که هوک میتواند برگرداند
برای auth-user-pass-verify، راهنمای OpenVPN 2.6 کد خروج 0 را پذیرش، 1 را رد و 2 را احراز هویت تعویقشده تعریف میکند. اینها تنها سه پاسخی هستند که سرور میفهمد و هر یک پیامد متفاوتی برای اتصال دارد. اسکریپتی که با وضعیت آخرین فرمان خود خارج میشود، عملاً اجازه داده یک فراخوان گزارش یا یک مرحلهٔ پاکسازی رأی بدهد. وضعیت را در هر شاخه صریح بنویسید، از جمله شاخههایی که هرگز به بازبین نرسیدند.
موفقیت HTTP و موفقیت احراز هویت دو لایهٔ جداست و یکی گرفتن آنها رایجترین راه خراب شدن این هوک است. پاسخ 202 یعنی درخواست برای پردازش پذیرفته شده، نه اینکه گذرواژهای تأیید شده باشد. وضعیت موردانتظار، شکل پاسخ و حکم نهایی را از قرارداد API که دریافت کردهاید تعیین کنید و نام فیلدی را از خود نسازید فقط چون محتمل به نظر میرسد.
اگر پاسخ واقعاً بعداً برسد، آن مسیر تعویقشده است و باید بههمان شکل ساخته شود. تلاش تعویقشدهای که هرگز کامل نمیشود منابع را تا انقضای مهلت نگه میدارد.
فایل اعتبارنامه را دقیقاً همانگونه که نوشته شده بخوانید
در روش مستند از طریق فایل، سرور نام کاربری و گذرواژه را بهعنوان دو خط نخست یک فایل موقت مینویسد، آن مسیر را به اسکریپت میدهد و هنگام بازگشت اسکریپت فایل را حذف میکند. آن دو خط را بهعنوان داده بخوانید: هرگز فایل را source نکنید، هرگز آن را ارزیابی نکنید و هرگز محتوایش را در خط فرمانی که جدول فرایندها میبیند نچسبانید. گذرواژه را بایتبهبایت حفظ کنید، زیرا عادیسازی آن همانطور که یک نام کاربری را عادی میکنید، اعتبارنامه را بیصدا تغییر میدهد. پوشهٔ آن فایل موقت یک تصمیم استقرار است، پس تأیید کنید که وجود دارد و برای همه روی میزبان قابل خواندن نیست.
اعتبارنامهٔ خود بازبین را از اعتبارنامهٔ کاربر جدا نگه دارید: به یکپارچهسازی دروازه تعلق دارد، در مخزن اسرار پلتفرم زندگی میکند و تنها به مجوز بررسی نیاز دارد، بنابراین شاهدی نیست که شخص خاصی احراز هویت شده است. نگذارید هوک بازبین دوم گذرواژه هم بشود. بازنویسی دستی مقایسهٔ هش با بهینهسازی حلقه ایمن نمیشود و بازبین نگهداریشده از پیش طرح نمکین و پرهزینهٔ مخزن حسابها را میفهمد.
تصمیم بگیرید پاسخ غیرقابلطبقهبندی چه معنایی دارد
مهلتها، خطاهای انتقال، پاسخهای بدشکل و بکاند در دسترس نبودن یک ویژگی مشترک دارند: هیچیک تأیید مثبت نیست. هوک باید برای هر یک از آنها بسته شکست بخورد و دلیلی ثبت کند که اپراتور بتواند بر اساس آن اقدام کند. آن دلیل جایگاهش گزارش محافظتشده است، نه پیامی که به شخص در حال تلاش برای اتصال برگردانده میشود.
با مسیرهایی که اصلاً به بازبین نمیرسند هم به همان اندازه دقیق باشید. مقدار پیکربندی گمشده، سرّ ناخوانا یا وابستگی نصبنشده باید پاسخ رد همراه با نشانگر عملیاتی متمایز بدهد، نه پذیرش تصادفی. آن شاخهها را با حذف وابستگی در آزمایشگاه بسنجید، نه با استدلال دربارهٔ آنها. جایی که شکست در ثبت گزارش میتواند وضعیت خروج را تغییر دهد، ثبت گزارش بخشی از تصمیم شده و باید بیخطر شود.
پیکربندی سرور اینجا هم مهم است: اسکریپتهای تعریفشدهٔ کاربر تنها وقتی رعایت میشوند که پیکربندی در حال اجرا آنها را در سطح امنیتی لازم مجاز بداند، و این تنظیم انتخابی آگاهانه است، نه مقدار پیشفرضی که باید بالا برده شود.
حکم را بررسی کنید، نه خط چاپشده را
آزمونی بسازید که وضعیت خروج را مستقیم بررسی کند. یک فایل اعتبارنامهٔ نمونه بنویسید، هوک را با حسابی شناختهشدهٔ درست و حسابی شناختهشدهٔ نادرست روی آن اجرا کنید و وضعیتی را بخوانید که پوسته گزارش میکند، نه متنی که اسکریپت چاپ میکند. همین یک بررسی بیشتر باگهای قرارداد را پیش از آنکه مشتری متصل شود میگیرد.
سپس همان موارد را از طریق یک مشتری واقعی در برابر شنوندهای غیرتولیدی اجرا کنید و تأیید کنید سرور چه ثبت کرده است: پذیرفته، ردشده یا تعویقشده. حساب غیرفعال، گذرواژهٔ اشتباه، پاسخ بدشکل بازبین، مهلت و بازبین غیرقابلدسترس را پوشش دهید. اگر هر موردی به وضعیتی برسد که نمیتوانید نامش را ببرید، آداپتور تمام نشده است.
نگه دارید نگاشت نتیجهٔ بازبین به وضعیت خروج را کنار اسکریپت در مخزن، تا مهندس بعدی قرارداد را بدون مهندسی معکوس کد بخواند.