SSH چیست؟ پروتکلی برای اتصال رمزشده به سرور و اجرای دستور روی آن از راه دور. مدیر سرور لینوکس تقریباً همیشه با SSH کار می کند: نصب برنامه، ویرایش تنظیمات، دیدن لاگ ها و بکاپ گیری. SSH به جای Telnet آمد که رمز و دستورها را بدون رمزگذاری می فرستاد. SSH به طور پیش فرض روی پورت 22 کار می کند و همین پورت از اولین مکان هایی است که ربات ها روی هر سرور تازه امتحان می کنند.
اتصال ساده
در لینوکس و macOS و در ویندوز 10 به بعد، دستور ssh در خط فرمان آماده است:
ssh admin@203.0.113.10
ssh -p 2222 admin@server.example.com
اولین بار مرورگر اثر انگشت (fingerprint) کلید سرور را نشان می دهد و می پرسد به آن اعتماد دارید یا نه. اگر سرور را خودتان ساخته اید، می توانید اثر انگشت را با کنسول سرور مقایسه کنید. بعد از آن این اثر انگشت در فایل ~/.ssh/known_hosts ذخیره می شود. اگر بعداً هشدار «تغییر کرده» دیدید، یا سرور دوباره نصب شده یا کسی بین شما و سرور قرار گرفته؛ بدون بررسی ادامه ندهید.
ورود با رمز یا با کلید
ورود با رمز ساده است ولی ضعیف ترین حالت است، چون رمز را می شود حدس زد، و ربات ها روز و شب این کار را می کنند. ورود با کلید روش پیشنهادی است. دو کلید ساخته می شود: کلید خصوصی که روی کامپیوتر شما می ماند و کلید عمومی که روی سرور می رود. سرور با کلید عمومی یک چالش می سازد که فقط صاحب کلید خصوصی می تواند جواب بدهد.
ssh-keygen -t ed25519 -C "ali@example.com"
ssh-copy-id admin@203.0.113.10
دستور اول جفت کلید ed25519 می سازد (بهتر است برای کلید خصوصی یک رمز عبور بگذارید). دستور دوم کلید عمومی را به ~/.ssh/authorized_keys کاربر روی سرور اضافه می کند. بعد از آن بدون وارد کردن رمز حساب سرور وارد می شوید. روی ویندوز اگر ssh-copy-id ندارید، محتوای فایل id_ed25519.pub را دستی به آن فایل اضافه کنید.
امن سازی sshd_config
تنظیمات سرور SSH در فایل /etc/ssh/sshd_config است. بعد از اینکه ورود با کلید را تست کردید، این مقدارها را عوض کنید:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
AllowUsers admin deploy
معنی هر خط:
- ورود مستقیم root بسته می شود. مدیر با کاربر عادی وارد می شود و با sudo کار می کند، که لاگ بهتری هم می ماند.
- ورود با رمز غیرفعال می شود و فقط کلید قبول می شود.
- بعد از 3 تلاش ناموفق، اتصال قطع می شود.
- فقط کاربرانی که نام برده اید می توانند وارد شوند.
تغییر را با این دستورها اعمال کنید و همیشه قبل از بستن جلسه فعلی، یک جلسه دوم را امتحان کنید:
sudo sshd -t
sudo systemctl reload ssh
دستور اول فایل را از نظر خطا بررسی می کند. اگر تنظیم را اشتباه کنید و جلسه باز پشتیبان نداشته باشید، خودتان بیرون می مانید و فقط از کنسول سرور (iLO، iDRAC یا کنسول سرویس دهنده ابری) می توانید برگردید. نام سرویس در اوبونتو ssh و در AlmaLinux sshd است.
عوض کردن پورت و ابزارهای محافظ
تغییر پورت 22 به عدد دیگر لاگ های ورود ناموفق را کم می کند، چون ربات های ساده فقط پورت 22 را امتحان می کنند. اما مهاجم هدفمند با اسکن پورت آن را پیدا می کند، پس این کار جایگزین بقیه تنظیم ها نیست. در کنارش:
- Fail2ban تلاش های ناموفق مکرر را در لاگ می بیند و IP مهاجم را برای مدتی در فایروال می بندد.
- فایروال سرور دسترسی SSH را فقط از IP های دفتر یا VPN مجاز کند.
- احراز هویت دومرحله ای برای SSH با PAM و برنامه هایی مثل Google Authenticator برای سرورهای حساس.
اصول نوشتن این قاعده ها در انواع فایروال و نحوه کار قاعده ها آمده است.
فایل config برای راحتی
برای سرورهایی که زیاد به آن ها وصل می شوید، در فایل ~/.ssh/config نام کوتاه تعریف کنید:
Host web1
HostName 203.0.113.10
User admin
Port 2222
IdentityFile ~/.ssh/id_ed25519
بعد از آن فقط ssh web1 کافی است. با گزینه ProxyJump هم می شود از یک سرور میانی (bastion) به سرورهای داخلی رسید، بدون اینکه آن ها آدرس عمومی داشته باشند.
Port forwarding و تونل SSH
SSH می تواند ترافیک را در یک تونل رمزشده بفرستد. مثلاً دیتابیسی که فقط به localhost سرور گوش می دهد را می شود روی کامپیوتر خودتان باز کرد:
ssh -L 3307:127.0.0.1:3306 admin@203.0.113.10
حالا اتصال به 127.0.0.1:3307 روی کامپیوتر شما به دیتابیس سرور می رسد. این کار بهتر از باز کردن پورت دیتابیس روی اینترنت است. تونل SSH برای استفاده دائمی و اتصال شعبه ها مناسب نیست و برای آن VPN سازمانی انتخاب بهتری است.
خطاهای رایج
- Permission denied (publickey): کلید روی سرور نیست یا مجوز فایل ها اشتباه است. پوشه
~/.sshباید 700 و فایلauthorized_keysباید 600 باشد. - Connection refused: سرویس SSH اجرا نیست یا پورت اشتباه است یا فایروال بسته.
- Connection timed out: بسته ها به سرور نمی رسند؛ فایروال، آدرس اشتباه یا قطع بودن سرور.
- WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED: کلید سرور عوض شده، که اگر سرور را دوباره نصب نکرده اید باید جدی بگیرید.
- Too many authentication failures: agent چند کلید را پشت سر هم امتحان می کند. با
-o IdentitiesOnly=yes -i کلیدفقط یک کلید مشخص را بفرستید.
انتقال فایل: scp، sftp و rsync
همان ارتباط SSH برای انتقال فایل هم به کار می رود و لازم نیست FTP بی رمز استفاده کنید:
scp backup.tar.gz admin@203.0.113.10:/srv/backups/
scp -r admin@203.0.113.10:/var/www/site ./site-copy
sftp admin@203.0.113.10
rsync -avz --progress ./site/ admin@203.0.113.10:/var/www/site/
rsync فقط تفاوت ها را می فرستد و برای انتقال های تکراری سریع تر است. با گزینه --dry-run قبل از اجرا ببینید چه چیزی تغییر می کند، مخصوصاً وقتی --delete هم می زنید که فایل های اضافه مقصد را پاک می کند.
SSH در ویندوز
ویندوز 10 و 11 و ویندوز سرور جدید، کلاینت OpenSSH داخلی دارند و دستور ssh در PowerShell و Windows Terminal کار می کند. برنامه PuTTY هم هنوز رایج است. کلید خصوصی PuTTY فرمت خودش (PPK) دارد و با ابزار PuTTYgen به فرمت OpenSSH تبدیل می شود. اگر کسی در شرکت کلید خصوصی را روی فلش نگه می دارد، آن را رمزگذاری کنید و حتماً برای کلید رمز عبور بگذارید.
ssh-agent برای نوشتن نکردن رمز کلید
اگر برای کلید رمز گذاشته اید، ssh-agent آن را یک بار می پرسد و تا پایان نشست در حافظه نگه می دارد:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l
از forwarding عامل (ssh -A) فقط روی سرورهای مورد اعتماد استفاده کنید. روی سرور آلوده، مهاجم می تواند از agent شما برای ورود به سرورهای دیگر سوءاستفاده کند. به جای آن از ProxyJump استفاده کنید که کلید را به سرور میانی نمی فرستد.
برای دستورهای روزمره بعد از ورود، دستورات لینوکس را ببینید.
مدیریت کلیدها در تیم
- هر نفر کلید خودش را داشته باشد. کلید مشترک را نمی شود برای یک نفر ابطال کرد.
- وقتی کسی تیم را ترک می کند، کلیدش را از
authorized_keysهمه سرورها پاک کنید. فهرست این کلیدها را جایی نگه دارید. - برای سرور تولید، حساب مدیر جدا از حساب استقرار خودکار (مثل CI/CD) داشته باشید. کلید استقرار فقط به کاری که لازم دارد دسترسی بدهد (CI/CD چیست).
- کلیدهای قدیمی RSA با طول کم را عوض کنید. ed25519 انتخاب مناسب امروز است.
برای افزودن عامل دوم به ورود، احراز هویت دو مرحله ای را بخوانید.
منابع و مستندات رسمی
- RFC 4251 درباره معماری پروتکل SSH
- راهنمای رسمی OpenSSH برای sshd_config
- مستندات رسمی مایکروسافت درباره OpenSSH در ویندوز
فهرست کامل تر بستن راه های نفوذ به سرور، در خدمت هاردنینگ سرور آمده است.
وقتی اتصال شکست می خورد، با ssh -v admin@server جزئیات را ببینید و لاگ سرور را در /var/log/auth.log بخوانید. تنظیم اولیه سرور جدید در نصب لینوکس روی سرور و فهرست کامل امن سازی در هاردنینگ سرور آمده. اگر مدیریت دسترسی SSH و کلیدهای تیم را نمی خواهید خودتان نگه دارید، این کار جزو مدیریت سرور لینوکس است.



