ساخت و استفاده از کلید SSH
ورود امن، قابلآزمایش و قابللغو
کلید SSH جای «رمز جادویی روی سرور» نیست؛ یک جفت کلید است که بخش خصوصی آن باید فقط نزد شما بماند و بخش عمومی برای حساب کاربری مقصد مجاز میشود. ایمنی واقعی به passphrase، مجوز فایلها، آزمایش قبل از محدودکردن رمز و برنامهی بازیابی وابسته است.
کلید عمومی و خصوصی دقیقاً چه نقشی دارند؟
کلید خصوصی روی client برای اثبات مالکیت استفاده میشود و نباید برای کسی ارسال یا روی سرور مقصد کپی شود. کلید عمومی قابل اشتراک است و خط آن در فایل ~/.ssh/authorized_keys حساب مقصد قرار میگیرد. سرور با challenge رمزنگاریشده بررسی میکند client کلید خصوصی متناظر را دارد، بدون آنکه خود کلید خصوصی منتقل شود.
passphrase فایل خصوصی را در حالت ذخیرهشده محافظت میکند؛ اگر لپتاپ یا فایل کپیشده به دست فرد دیگری برسد، یک مانع اضافه ایجاد میشود. این با رمز حساب سرور متفاوت است. نامگذاری واضح کلیدها بر اساس دستگاه و کاربرد نیز لغو یک کلید گمشده را سادهتر میکند.
جفتکلید را کجا و چگونه بسازیم؟
کلید را روی دستگاهی بسازید که از آن متصل میشوید، نه روی VPS. OpenSSH در Linux، macOS و نسخههای جدید Windows دستور ssh-keygen دارد. برای کاربرد معمول و سامانههای سازگار، Ed25519 انتخاب سادهای است:
ssh-keygen -t ed25519 -C "work-laptop-2026"
مسیر پیشنهادی یا یک نام اختصاصی را انتخاب و passphrase قوی وارد کنید. خروجی شامل یک فایل خصوصی و یک فایل عمومی با پسوند .pub است. اگر محیط مقصد سیاست رمزنگاری یا سازگاری خاصی دارد، الگوریتم مجاز را از مستندات همان محیط انتخاب کنید؛ الگوریتم را صرفاً از یک آموزش قدیمی کپی نکنید.
کلید عمومی را بدون خرابکردن مجوزها نصب کنید
اگر ورود رمزی موقتاً فعال است، روی Linux و macOS ابزار ssh-copy-id معمولاً کلید عمومی را برای همان کاربر نصب و permissionهای لازم را تنظیم میکند:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server-ip
در روش دستی، متن کامل یک خط فایل .pub باید به authorized_keys همان کاربر افزوده شود. دایرکتوری .ssh معمولاً permission برابر 700 و فایل authorized_keys برابر 600 دارد و مالک هر دو باید همان کاربر باشد. کلید root در حساب یک کاربر عادی عمل نمیکند و برعکس؛ محل فایل به حسابی وابسته است که در فرمان SSH مینویسید.
قبل از هر محدودیت، یک نشست تازه آزمایش کنید
ترمینال فعلی را باز نگه دارید و در پنجرهای جدا اتصال صریح با کلید را امتحان کنید:
ssh -i ~/.ssh/id_ed25519 user@server-ip
با ssh -v میتوانید ببینید client کدام کلید را پیشنهاد میدهد و ردشدن در چه مرحلهای است. فقط پس از موفقیت چندباره، اطمینان از دسترسی sudo در صورت نیاز و وجود console یا راه بازیابی، درباره محدودکردن PasswordAuthentication تصمیم بگیرید. تغییر پیکربندی sshd بدون اعتبارسنجی و بدون نشست جایگزین میتواند دسترسی شما را قطع کند.
ssh-agent و فایل config چه کمکی میکنند؟
ssh-agent کلید بازشده را برای مدت نشست نگه میدارد تا لازم نباشد passphrase را در هر اتصال وارد کنید. با ssh-add کلید را به agent اضافه کنید و از قابلیت امن سیستمعامل برای شروع و ذخیرهسازی آن استفاده کنید. agent forwarding را پیشفرض روشن نکنید؛ سرور واسطِ مورد اعتماد میتواند در زمان اتصال از agent شما درخواست امضا کند.
در ~/.ssh/config میتوان برای هر Host، نام کاربر، hostname، پورت و IdentityFile مشخص کرد. این کار از فرستادن تصادفی همه کلیدها و اشتباه بین محیط production و test کم میکند. فایل config و کلید خصوصی نیز باید فقط برای حساب محلی خودتان قابل خواندن باشند.
چرخش، لغو و بازیابی کلید را از ابتدا طراحی کنید
برای هر شخص و هر دستگاه کلید جدا داشته باشید. هنگام تعویض دستگاه، ابتدا کلید جدید را اضافه و آزمایش کنید، سپس فقط خط کلید قدیمی را با تطبیق fingerprint یا comment حذف کنید. یک کلید مشترک میان چند نفر، تشخیص مالک و لغو دسترسی یک نفر را دشوار میکند.
نسخه پشتیبان کلید خصوصی باید رمزگذاریشده و با کنترل دسترسی باشد؛ در برخی محیطها ساخت کلید تازه و افزودن عمومی آن از نگهداری کپیهای متعدد امنتر است. اگر دستگاه گم شد، کلید عمومی متناظر را از همه مقصدها لغو کنید. همچنین host key سرور با user key فرق دارد؛ هشدار تغییر host key را بدون بررسی علت نادیده نگیرید.
پرسشهای پرتکرار
کدام فایل را باید روی سرور بگذارم؟
فقط فایل عمومی با پسوند .pub را در authorized_keys حساب مقصد قرار دهید. فایل خصوصی بدون پسوند باید روی دستگاه شما و محرمانه بماند.
Ed25519 بهتر است یا RSA؟
برای محیطهای مدرن و سازگار، Ed25519 انتخاب ساده و رایجی است. اگر سیاست سازمانی، FIPS یا سامانه قدیمی محدودیت دارد، الگوریتم و اندازه کلید مجاز را از مستندات همان محیط تعیین کنید.
چرا با وجود authorized_keys هنوز رمز میخواهد؟
ممکن است client کلید دیگری را پیشنهاد دهد، کلید برای کاربر اشتباه نصب شده باشد، مالکیت یا permission فایلها درست نباشد یا sshd احراز هویت کلیدی را نپذیرد. خروجی ssh -v و log سرور مسیر تشخیص را نشان میدهند.
آیا بعد از نصب کلید فوراً ورود با رمز را غیرفعال کنم؟
خیر. ابتدا در یک نشست تازه ورود کلیدی، دسترسی لازم و مسیر بازیابی را آزمایش کنید. سپس پیکربندی sshd را اعتبارسنجی و تغییر را با احتیاط اعمال کنید.
آیا میتوانم یک کلید را برای همه سرورها استفاده کنم؟
از نظر فنی ممکن است، اما کلید جدا برای دستگاه یا دامنه اعتماد، دامنه خسارت و فرایند لغو را محدود میکند. کلید مشترک بین چند شخص توصیه نمیشود.
اگر کلید خصوصی را گم کنم چه میشود؟
کلید خصوصی از کلید عمومی قابل بازیابی نیست. با یک مسیر دسترسی دیگر یا console، کلید عمومی قبلی را لغو و جفتکلید تازه اضافه کنید؛ به همین دلیل مسیر بازیابی باید از قبل مشخص باشد.
منابع رسمی و مطالعه بیشتر
کلیدت را روی یک سرور لینوکسی بهکار بگیر
پیش از انتخاب، منابع و سیستمعامل موجود را با نیاز برنامهات بررسی کن.