آموزش سرور

ورود با کلید SSH و تغییر پورت؛ امن‌سازی SSH بدون قفل شدن

تهیه: کلودیفای (نگارش با کمک هوش مصنوعی) · انتشار: · زمان مطالعه: ۴ دقیقه

ssh-ed25519 AAAA…SSHآموزش سرورورود با کلید SSH و تغییرپورت؛ امن‌سازی SSHبدون قفل شدنمجلهٔ کلودیفایclodify.net/blog
پاسخ کوتاه

مؤثرترین قدم امنیتی سرور لینوکس این است که ورود با رمز را ببندید و فقط با کلید SSH وارد شوید. ترتیب درست: ساخت کلید روی کامپیوتر خودتان ← افزودن آن به سرور ← تست ورود با کلید در یک پنجرهٔ جدید ← سپس PasswordAuthentication no. تغییر پورت اختیاری است و فقط حملات خودکار را کم می‌کند؛ قبل از تغییر، پورت جدید را در فایروال باز کنید.

چرا ورود با رمز خطرناک است؟

هر سرور با آی‌پی عمومی، چند دقیقه پس از روشن شدن هدف ربات‌هایی قرار می‌گیرد که مدام رمزهای رایج را روی پورت ۲۲ امتحان می‌کنند. اگر رمز ضعیف باشد یا جایی لو رفته باشد، سرور در اختیار مهاجم قرار می‌گیرد. کلید SSH عملاً قابل حدس نیست و با بستن ورود رمزی، این حملات بی‌اثر می‌شوند. برای دیدن این تلاش‌ها روی سرور خودتان:

sudo journalctl -u ssh --since "1 hour ago" | grep -i "failed" | tail
ورود با رمز
  • قابل حدس و حملهٔ Brute Force
  • رمز روی شبکه فرستاده می‌شود (رمزنگاری‌شده)
  • اشتراک‌گذاری اشتباه رایج است
در برابر
ورود با کلید
  • کلید خصوصی هرگز از کامپیوتر شما خارج نمی‌شود
  • حدس زدن عملاً ناممکن است
  • قابل لغو برای هر دستگاه
شکل ۱ کلید SSH امنیت ورود را چند برابر می‌کند.

گام ۱: ساخت کلید روی کامپیوتر خودتان

کلید را روی کامپیوتر شخصی بسازید، نه روی سرور:

ssh-keygen -t ed25519 -C "laptop-1405"
  • مسیر پیش‌فرض را بپذیرید (~/.ssh/id_ed25519).
  • یک passphrase بگذارید تا اگر لپ‌تاپ گم شد، کلید قابل استفاده نباشد.
  • دو فایل ساخته می‌شود: id_ed25519 (خصوصی؛ هرگز به کسی ندهید) و id_ed25519.pub (عمومی؛ روی سرور قرار می‌گیرد).
me@laptop: ~
$ ssh-keygen -t ed25519 -C "me@laptop"Your identification has been saved in ~/.ssh/id_ed25519$ ssh-copy-id root@203.0.113.10Number of key(s) added: 1$ 
شکل ۲ ساخت کلید ed25519 و افزودن کلید عمومی به سرور.

گام ۲: افزودن کلید عمومی به سرور

در مک و لینوکس:

ssh-copy-id root@203.0.113.10

در ویندوز (PowerShell):

type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh root@203.0.113.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

اگر برای کار روزمره کاربر جداگانه دارید (توصیه می‌شود)، کلید را برای همان کاربر هم اضافه کنید: ssh-copy-id deploy@203.0.113.10.

گام ۳: تست ورود با کلید (حیاتی)

پنجرهٔ SSH فعلی را نبندید. یک ترمینال جدید باز کنید و وصل شوید:

ssh -i ~/.ssh/id_ed25519 root@203.0.113.10

اگر بدون پرسیدن رمز سرور (فقط passphrase کلید) وارد شدید، کلید درست کار می‌کند.

گام ۴: بستن ورود با رمز

در اوبونتوهای جدید بهتر است تنظیمات را در یک فایل جداگانه داخل sshd_config.d بنویسید تا با به‌روزرسانی‌ها بازنویسی نشود:

sudo tee /etc/ssh/sshd_config.d/10-hardening.conf >/dev/null <<'CONF'
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
PubkeyAuthentication yes
CONF
sudo sshd -t && sudo systemctl reload ssh
  • sshd -t تنظیمات را پیش از اعمال آزمایش می‌کند؛ اگر خطا داد، reload نکنید.
  • prohibit-password یعنی root فقط با کلید وارد می‌شود. اگر کاربر sudo دارید، می‌توانید آن را no کنید.
  • در برخی تصاویر ابری فایلی مانند 50-cloud-init.conf در همان پوشه PasswordAuthentication yes دارد؛ چون فایل‌ها به ترتیب الفبایی خوانده می‌شوند و اولین مقدار معتبر است، نام فایل خودتان را با عدد کوچک‌تر (مثل 10-) شروع کنید. با این دستور مقدار نهایی را ببینید:
sudo sshd -T | grep -Ei 'passwordauthentication|permitrootlogin'

دوباره در یک پنجرهٔ جدید ورود را تست کنید. ورود با رمز باید با Permission denied (publickey) رد شود.

گام ۵ (اختیاری): تغییر پورت SSH

تغییر پورت امنیت واقعی اضافه نمی‌کند، اما لاگ‌ها را از حملات خودکار خلوت‌تر می‌کند. ترتیب درست مهم است:

# ۱) باز کردن پورت جدید در فایروال (اگر UFW فعال است)
sudo ufw allow 2222/tcp

اوبونتو ۲۲.۱۰ به بعد (از جمله ۲۴.۰۴) — حالت socket activation

در این نسخه‌ها SSH به‌طور پیش‌فرض با ssh.socket گوش می‌دهد و تغییر Port در sshd_config به‌تنهایی کافی نیست:

sudo mkdir -p /etc/systemd/system/ssh.socket.d
sudo tee /etc/systemd/system/ssh.socket.d/port.conf >/dev/null <<'CONF'
[Socket]
ListenStream=
ListenStream=2222
CONF
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket

دبیان و اوبونتوهای قدیمی‌تر

echo "Port 2222" | sudo tee /etc/ssh/sshd_config.d/20-port.conf
sudo sshd -t && sudo systemctl restart ssh

سپس در پنجرهٔ جدید تست کنید: ssh -p 2222 root@203.0.113.10. فقط پس از موفقیت، پورت ۲۲ را در فایروال ببندید: sudo ufw delete allow OpenSSH.

اگر قفل شدید چه کنید؟

وضعیت راه نجات
پنجرهٔ قبلی SSH هنوز باز است از همان پنجره تنظیمات را برگردانید
سرور خارج با «حالت Rescue» سرور را در Rescue بوت کنید، دیسک را mount و فایل تنظیمات را اصلاح کنید
هیچ راهی ندارید تیکت پشتیبانی؛ یا در بدترین حالت «نصب مجدد» (داده‌ها پاک می‌شود)

به همین دلیل همیشه پیش از تغییرات SSH یک اسنپ‌شات (اگر پلن پشتیبانی می‌کند) یا بکاپ بگیرید.

گام‌های تکمیلی

  • فایروال: فقط پورت‌های لازم باز باشند؛ آموزش فایروال UFW.
  • Fail2ban: آی‌پی‌هایی که مکرر ورود ناموفق دارند را موقتاً مسدود می‌کند؛ در چک‌لیست امنیتی آمده است.
  • کلید برای هر دستگاه: برای لپ‌تاپ و موبایل کلید جدا بسازید تا در صورت گم شدن یک دستگاه، فقط همان کلید را از authorized_keys حذف کنید.

سؤالات متداول

RSA بهتر است یا ed25519؟

ed25519 کوتاه‌تر، سریع‌تر و امروز توصیهٔ رایج است. اگر سیستم قدیمی‌ای از آن پشتیبانی نمی‌کند، از rsa -b 4096 استفاده کنید.

کلید خصوصی را گم کردم؛ چه کنم؟

اگر هنوز راه دیگری برای ورود دارید (کلید دیگر یا پنجرهٔ باز)، کلید جدید بسازید و کلید قبلی را از ~/.ssh/authorized_keys حذف کنید. در غیر این صورت از Rescue یا پشتیبانی کمک بگیرید.

تغییر پورت SSH لازم است؟

الزامی نیست. ورود فقط با کلید و Fail2ban مهم‌ترند؛ تغییر پورت فقط لاگ‌ها را خلوت‌تر می‌کند.

بعد از تغییر پورت، Fail2ban هم باید تغییر کند؟

بله؛ در تنظیم jail مربوط به sshd، port = 2222 را قرار دهید.

آیا می‌توانم ورود با رمز را فقط برای یک آی‌پی باز بگذارم؟

بله، با بلوک Match Address در sshd_config؛ اما ساده‌تر و امن‌تر این است که همه با کلید وارد شوند.

آماده‌اید؟ سرورتان را بسازید.

از ۱٬۲۰۰ تومان در ساعت · پرداخت ریالی

سرورتان را همین حالا بسازید.

ساعتی بپردازید. هر وقت خواستید حذف کنید.