اگر تا به حال از رمز عبور برای اتصال به سرور لینوکسی استفاده کردهاید، احتمالاً میدانید که این روش نهتنها کند و خستهکننده است، بلکه یکی از بزرگترین نقاط ضعف امنیتی سرور شما به شمار میرود. حملات brute-force به سرویس SSH یکی از رایجترین تهدیدهایی است که هر سرور متصل به اینترنت روزانه با آن مواجه میشود. راهحل استاندارد و تقریباً اجباری برای این مشکل، استفاده از کلید SSH است. در این مقاله به زبان ساده و با مثالهای عملی، یاد میگیرید که چطور یک جفت کلید بسازید، کلید عمومی را روی سرور قرار دهید و در نهایت ورود با رمز عبور را بهطور کامل غیرفعال کنید.
کلید SSH چیست و چرا باید از آن استفاده کنیم؟
کلید SSH یک روش احراز هویت مبتنی بر رمزنگاری نامتقارن است. به جای اینکه رمز عبوری را از طریق شبکه ارسال کنید (که همیشه قابل شنود یا حدس زدن است)، از یک جفت کلید ریاضی استفاده میکنید: یک کلید خصوصی که فقط روی سیستم شما (کلاینت) نگهداری میشود و یک کلید عمومی که روی سرور قرار میگیرد. وقتی میخواهید وارد سرور شوید، سرور یک چالش رمزنگاریشده ارسال میکند که فقط با کلید خصوصی شما قابل حل است. این فرآیند نهتنها امنتر است، بلکه امکان ورود بدون رمز (passwordless) را هم فراهم میکند.
مزیت اصلی این روش این است که کلید خصوصی هرگز از دستگاه شما خارج نمیشود و رمز عبوری هم در شبکه جابهجا نمیشود. حتی اگر کسی ترافیک شبکه را شنود کند، اطلاعات مفیدی به دست نمیآورد. علاوه بر این، میتوانید برای کلید خصوصی یک passphrase تعیین کنید تا اگر کسی به فایل کلید شما دسترسی پیدا کرد، نتواند از آن استفاده کند.
پیشنیازها و آمادهسازی
برای دنبال کردن این آموزش به موارد زیر نیاز دارید:
- یک سرور لینوکسی (اوبونتو، دبیان، CentOS یا هر توزیع دیگری) با دسترسی SSH
- یک سیستم کلاینت (لپتاپ یا کامپیوتر شخصی) که میخواهید از آن به سرور وصل شوید
- دسترسی به ترمینال در هر دو سیستم
در سیستمهای لینوکس و macOS، ابزار ssh-keygen بهصورت پیشفرض نصب است. اگر از ویندوز استفاده میکنید، نسخههای جدید ویندوز ۱۰ و ۱۱ شامل OpenSSH هستند و میتوانید از PowerShell یا CMD استفاده کنید. برای اطمینان از نصب بودن، دستور زیر را اجرا کنید:
ssh -V
اگر خروجی شامل نسخه OpenSSH باشد، همهچیز آماده است.
ساخت جفت کلید SSH
اولین قدم، تولید جفت کلید روی سیستم کلاینت است. دستور زیر را در ترمینال اجرا کنید:
ssh-keygen -t ed25519 -C "your_email@example.com"
در این دستور:
-t ed25519الگوریتم رمزنگاری را مشخص میکند.ed25519سریعتر و امنتر از RSA است و کلیدهای کوتاهتری تولید میکند. اگر سرور شما از این الگوریتم پشتیبانی نمیکند (سرورهای خیلی قدیمی)، میتوانید ازrsaبا طول ۴۰۹۶ بیت استفاده کنید:ssh-keygen -t rsa -b 4096-Cیک کامنت (معمولاً ایمیل شما) به کلید اضافه میکند تا بعداً تشخیص دهید کدام کلید متعلق به کدام سیستم است.
بعد از اجرای دستور، از شما سوال میشود که فایل کلید را کجا ذخیره کنید. مسیر پیشفرض ~/.ssh/id_ed25519 است که معمولاً بهترین گزینه است. فقط Enter بزنید. سپس از شما خواسته میشود یک passphrase تعیین کنید. این یک رمز عبور اضافی برای خود کلید خصوصی است. اگر میخواهید امنیت بیشتری داشته باشید، یک عبارت طولانی وارد کنید. اگر ترجیح میدهید بدون رمز وارد شوید، میتوانید خالی بگذارید، اما این کار امنیت را کاهش میدهد.
بعد از این مرحله، دو فایل در دایرکتوری ~/.ssh/ ایجاد میشود:
id_ed25519— کلید خصوصی (هرگز این فایل را با کسی به اشتراک نگذارید)id_ed25519.pub— کلید عمومی (این فایل را روی سرور قرار میدهیم)
برای مشاهده محتوای کلید عمومی، از دستور زیر استفاده کنید:
cat ~/.ssh/id_ed25519.pub
خروجی چیزی شبیه به این خواهد بود:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK8J3hY8xQy7vZ2mX9sLpQnR4vKcWxTz6HjYbGfQ your_email@example.com
این رشته را کپی کنید؛ در مرحله بعد به آن نیاز دارید.
اشتباه رایج: استفاده از کلید خصوصی به جای عمومی
یکی از رایجترین اشتباهات، کپی کردن محتوای فایل id_ed25519 (کلید خصوصی) به جای id_ed25519.pub (کلید عمومی) است. هرگز این کار را نکنید. کلید خصوصی باید همیشه روی سیستم شما بماند و اگر به دست فرد دیگری بیفتد، او میتواند بدون رمز وارد سرور شما شود.
انتقال کلید عمومی به سرور
حالا که کلید عمومی را دارید، باید آن را به فایل ~/.ssh/authorized_keys روی سرور اضافه کنید. سادهترین و مطمئنترین روش، استفاده از دستور ssh-copy-id است. این دستور بهصورت خودکار کلید عمومی را به سرور منتقل میکند و آن را در مکان درست قرار میدهد:
ssh-copy-id username@server_ip
بهجای username نام کاربری خود روی سرور و بهجای server_ip آدرس IP یا دامنه سرور را وارد کنید. برای اولین بار، از شما رمز عبور کاربر خواسته میشود. بعد از وارد کردن رمز، کلید عمومی به فایل authorized_keys اضافه میشود.
اگر به هر دلیلی ssh-copy-id در دسترس نیست (مثلاً در ویندوز)، میتوانید بهصورت دستی این کار را انجام دهید. ابتدا با رمز عبور وارد سرور شوید:
ssh username@server_ip
سپس در سرور، دایرکتوری .ssh را بسازید و فایل authorized_keys را ایجاد کنید:
mkdir -p ~/.ssh
touch ~/.ssh/authorized_keys
حالا محتوای کلید عمومی (که قبلاً کپی کردید) را به انتهای فایل اضافه کنید. میتوانید از ویرایشگر nano استفاده کنید:
nano ~/.ssh/authorized_keys
محتوا را paste کنید، سپس با Ctrl+X، Y و Enter ذخیره و خارج شوید. در نهایت، مجوزهای صحیح را تنظیم کنید:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
این مجوزها بسیار مهم هستند. اگر فایلها بیش از حد باز باشند، سرور ممکن است از پذیرش کلید خودداری کند.
تست اتصال با کلید SSH
قبل از غیرفعال کردن رمز عبور، حتماً اتصال با کلید را تست کنید. از سیستم کلاینت، دستور زیر را اجرا کنید:
ssh username@server_ip
اگر همهچیز درست باشد، بدون درخواست رمز عبور وارد سرور میشوید (البته اگر برای کلید خصوصی passphrase تعیین کرده باشید، از شما خواسته میشود آن را وارد کنید). اگر خطایی مانند Permission denied (publickey) دریافت کردید، احتمالاً کلید عمومی به درستی اضافه نشده یا مجوزها اشتباه است. مجوزها را دوباره بررسی کنید و مطمئن شوید که محتوای کلید عمومی دقیقاً در یک خط و بدون فاصله اضافی کپی شده است.
غیرفعال کردن ورود با رمز عبور
بعد از اینکه مطمئن شدید اتصال با کلید SSH بهدرستی کار میکند، وقت آن است که ورود با رمز عبور را غیرفعال کنید. این کار از حملات brute-force جلوگیری میکند و امنیت سرور شما را به سطح بالاتری میبرد.
ابتدا فایل پیکربندی SSH را ویرایش کنید:
sudo nano /etc/ssh/sshd_config
در این فایل، به دنبال خطوط زیر بگردید و مقادیر را تغییر دهید:
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
اگر این خطوط وجود ندارند، آنها را در انتهای فایل اضافه کنید. دقت کنید که PasswordAuthentication no مهمترین خط است. بعد از اعمال تغییرات، فایل را ذخیره کنید و سرویس SSH را مجدداً راهاندازی کنید:
sudo systemctl restart sshd
در توزیعهای مبتنی بر دبیان (مثل اوبونتو)، نام سرویس ممکن است ssh باشد به جای sshd. در این صورت از دستور sudo systemctl restart ssh استفاده کنید.
اشتباه رایج: قفل کردن خودتان از سرور
بزرگترین خطر در این مرحله این است که اگر کلید شما به درستی کار نکند، بعد از غیرفعال کردن رمز عبور، دیگر هیچ راهی برای ورود به سرور نخواهید داشت. برای جلوگیری از این فاجعه، دو کار را انجام دهید:
- قبل از غیرفعال کردن رمز عبور، یک جلسه SSH دوم به سرور باز کنید و آن را باز نگه دارید. اگر مشکلی پیش آمد، از آن جلسه برای اصلاح پیکربندی استفاده کنید.
- بعد از تغییر پیکربندی و قبل از بستن جلسه فعلی، در یک ترمینال جدید اتصال با کلید را تست کنید. اگر موفق بود، میتوانید جلسه قدیمی را ببندید.
همچنین توصیه میشود قبل از اعمال تغییرات، یک نسخه پشتیبان از فایل پیکربندی بگیرید:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
اگر بعداً مشکلی پیش آمد، میتوانید با دستور زیر پیکربندی را برگردانید:
sudo cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
مدیریت چند کلید و استفاده از ssh-agent
اگر از چند سرور استفاده میکنید، ممکن است برای هر کدام یک کلید جداگانه بسازید. برای مدیریت بهتر، میتوانید فایل ~/.ssh/config را در سیستم کلاینت ایجاد کنید. این فایل به شما امکان میدهد برای هر سرور یک نام مستعار تعریف کنید و تنظیمات خاصی اعمال کنید. مثال:
Host myserver
HostName 192.168.1.100
User root
IdentityFile ~/.ssh/id_ed25519_server1
Port 22
حالا بهجای تایپ دستور طولانی، فقط کافی است بنویسید:
ssh myserver
اگر برای کلیدهای خود passphrase تعیین کردهاید، وارد کردن آن در هر بار اتصال میتواند آزاردهنده باشد. در این صورت میتوانید از ssh-agent استفاده کنید که کلیدها را در حافظه نگه میدارد و بعد از یک بار وارد کردن passphrase، تا زمانی که سیستم روشن است، دیگر از شما سوال نمیکند:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
بعد از این، در همان جلسه ترمینال، اتصال به سرور بدون درخواست passphrase انجام میشود.
نکات تکمیلی برای امنیت بیشتر
غیرفعال کردن رمز عبور فقط یکی از قدمهای امنسازی SSH است. برای محافظت بیشتر از سرور خود، موارد زیر را هم در نظر بگیرید:
- تغییر پورت SSH: تغییر پورت پیشفرض ۲۲ به یک پورت غیرمعمول، تعداد حملات خودکار را بهشدت کاهش میدهد. این کار را در
sshd_configبا خطPort 2222انجام دهید. - محدود کردن کاربران مجاز: با خط
AllowUsers usernameفقط کاربران خاصی را مجاز به ورود کنید. - استفاده از fail2ban: این ابزار بهصورت خودکار IPهایی را که چند بار تلاش ناموفق داشتهاند، مسدود میکند.
- غیرفعال کردن ورود ریشه (root): با خط
PermitRootLogin noورود مستقیم با کاربر root را غیرفعال کنید و همیشه با یک کاربر معمولی وارد شوید و سپس باsudoدستورات را اجرا کنید.
اگر به دنبال یک زیرساخت امن و مقیاسپذیر برای پروژههای خود هستید، سرورهای ابری ServerNet با پشتیبانی کامل از SSH و امکانات مدیریتی پیشرفته میتوانند گزینه مناسبی باشند.
جمعبندی
استفاده از کلید SSH یک مهارت ضروری برای هر مدیر سروری است. با دنبال کردن مراحل این مقاله، شما یاد گرفتید که چطور یک جفت کلید بسازید، کلید عمومی را روی سرور قرار دهید و در نهایت ورود با رمز عبور را غیرفعال کنید. این کار نهتنها امنیت سرور شما را بهطور چشمگیری افزایش میدهد، بلکه تجربه کار روزانه با سرور را هم بسیار روانتر میکند. به یاد داشته باشید که همیشه قبل از اعمال تغییرات امنیتی، یک نسخه پشتیبان تهیه کنید و اتصال جدید را قبل از قطع جلسه فعلی تست کنید. با رعایت این نکات، میتوانید با خیال راحت از مزایای احراز هویت مبتنی بر کلید بهرهمند شوید.