برای تولید کلید OpenVPN به فایل موقت نیاز ندارید
نگه داشتن مواد کلید در حافظه از چرخه عمر فایل پرهیز میکند، نه از افشا. جریان خروجی و خطا را جدا نگه دارید و کلید را پس از آن مانند یک راز بدانید.
تولید کلید به فایل موقت نیازی ندارد و حذف آن کمتر از آنچه بیشتر راهنماها القا میکنند درست میکند. آنچه را برمیدارد چرخه عمر یک فایل و مسابقه پاکسازی پیرامون آن است. آنچه را دستنخورده میگذارد هر فرصتی برای افشای راز در ادامه است. مشکل درستی در این اسکریپتها معمولاً جای دیگری است، چون تشخیص و مواد کلید در جریانهای متفاوتی سفر میکنند.
فایل هرگز آن افشایی نبود که فکر میکردید
فایل موقت یک خطر مشخص است وقتی برای همه خواندنی باشد، وقتی از یک فروپاشی جان سالم به در ببرد، یا وقتی پس از یک استثنا مرحله پاکسازی نادیده گرفته شود. اینها واقعیاند و ارزش رفع دارند. همچنین محلی، دیدنی و آسان برای آزمودن هستند. پیش از آنکه نتیجه بگیرید تغییر فقط ظاهری بوده، هر یک را در اسکریپت خودتان نام ببرید.
خطرهای آرامتر در پاییندست نشستهاند: کلیدی که هنگام اشکالزدایی چاپ میشود، استثنایی که کل شیء نتیجه را سریال میکند، مدیریتکننده فروپاشی که یک دامپ حافظه مینویسد، جمعکننده گزارش که نخست مسیر فایل و سپس محتوا را دریافت میکند. پرهیز از فایل موقت برای هیچیک از اینها کاری نمیکند و باور به خلاف آن همان راهی است که بازنویسی خوشنیت راز را بیش از پیش افشا کرده رها میکند. تغییر را یک بهبود در یک زنجیره بدانید، نه راهحل.
کلاینت وقتی نام فایل داده نمیشود چه مینویسد
نسخههای کنونی کلاینت وقتی فرمان کلید بدون مسیر خروجی داده شود، کلید تولیدشده را به خروجی استاندارد میفرستند. همین رفتار مستند است که رویکرد درونحافظهای را ممکن میکند و نیاز به ترفند قدیمیتر نشانهرفتن ابزار به مسیر یک دستگاه را برمیدارد.
import subprocess
proc = subprocess.run(
["openvpn", "--genkey", "tls-crypt"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=True,
)
key_material = proc.stdout
فرمان را بهصورت فهرست بدهید. اینجا به گسترش پوسته نیازی نیست و فعالکردن پوسته مرز آرگومانها را به نقلقولی وابسته میکرد که در کنترل شما نیست. اگر اسکریپت ممکن است با مسیر جستوجویی متفاوت از آنچه انتظار دارید اجرا شود، فایل اجرایی موردنظر را با مسیر مطلق به کار ببرید.
بررسی کد بازگشت نمیگذارد مسیر موفقیت پس از یک فراخوانی ناموفق ادامه یابد. بدون آن، یک رشته بایتی خالی میتواند به جلو جریان یابد و فقط بسیار دیرتر شکست بخورد، در همان نقطهای که کلید به کار میرود و پیام خطا دیگر اصلاً از تولید سخن نمیگوید.
دو جریان، دو معنا
خروجی استاندارد کلید را حمل میکند. خطای استاندارد هر چیزی را حمل میکند که ابزار میخواهد به شما بگوید، از جمله هشدارهایی درباره پیکربندی، نسخه و نوع کلید. بازگرداندن هر دو به یک بافر همان خطایی است که کلیدی با ظاهر باورپذیر میسازد که جملهای در میانش دوخته شده است.
مسیر شکست را هم جدا نگه دارید. وقتی فراخوانی شکست میخورد، فرمان ناموفق و وضعیت خروج را گزارش کنید و سپس آگاهانه تصمیم بگیرید که آیا بخشی از خطای استاندارد برای نمایش ایمن است. ریختن کل شیء نتیجه در یک گزارش میانبر معمول است و میتواند کلید را با خود ببرد.
خواندن ایمن برای داده دودویی اگر بعداً مواد را هش کنید یا مقایسه کنید اهمیت دارد. حالت متنی با کدگذاری غیرمنتظره میتواند بایتهایی را تغییر دهد که هرگز قرار نبود متن باشند، و کلید تغییرکرده تا وقتی دستدهی شکست نخورد از کلید نادرست قابل تمایز نیست.
اگر با این حال آن را نگه میدارید، آگاهانه این کار را بکنید
بیشتر استقرارها در نهایت کلید را روی دیسک، روی دروازه یا در مخزن راز لازم دارند. یک بار بنویسیدش، با مجوزهای محدود از هنگام ساخت نه با chmod دیرتر، و نوشتن را اتمی کنید تا فایل ناقص هرگز همانی نشود که یک سرویس هنگام راهاندازی میخواند. تغییرنام از مسیری در همان پوشه معمولاً برای این کار کافی است. مسیر آمادهسازی را در شاخه شکست بردارید، چون نوشتن ناموفق همان نسخهای است که مردم فراموش میکنند.
حالت فایل را هنگام ساخت تنظیم کنید و حالت پوشه را هم محدود نگه دارید. از هر مسیری زیر جایی که کار پشتیبانگیری بیفکر آن را جارو میکند بپرهیزید، چون راز در یک پشتیبان شبانه راز در هر نسخه از آن پشتیبان است. همین استدلال برای یک حجم مشترک که سرویسهای دیگر میتوانند بخوانند نیز صادق است.
کلید مشترک هویت نیست
تولید این مواد گواهی صادر نمیکند، کلاینتی را ثبت نمیکند و مشخص نمیکند چه کسی متصل میشود. کلید مشترک کانالی میان طرفهایی را محافظت میکند که از پیش به هم اعتماد دارند؛ هویت همچنان از گواهی و هر احراز هویتی که پیش روی آن است میآید.
انواع کلید هم جایگزین یکدیگر نیستند. یک کلید متقارن برای یک ویژگی جایگزین آماده برای دیگری نیست و نسخههای تازهتر گونههای خود را با فایلهای متفاوت در هر دو سر میافزایند. نوعی را تولید کنید که پیکربندی شما واقعاً نام میبرد، سپس آن را در نقشی که آن نوع تعریف میکند به کار ببرید.
نتیجه را با یک اتصال واقعی بیازمایید نه با نگاه به اندازه فایل. اگر دستدهی کامل شود و گزارشها هیچ هشداری درباره کلید نشان ندهند، مسیر تولید درست است؛ اگر کلید بهسبب جریان ادغامشده بریده شده بود، اتصال بهگونهای شکست میخورد که به طرف مقابل اشاره میکند نه به اسکریپت.