ورود به سرور با کلید SSH و امن‌سازی SSH (بدون رمز عبور)

رمز عبور SSH قابل حدس زدن و تکرارپذیر است ولی کلید SSH عملاً غیرقابل حدس است. با کلید نه‌تنها امن‌تر، بلکه سریع‌تر هم وارد می‌شوید. این راهنما کل مسیر از ساخت کلید تا تنظیمات سخت‌گیرانهٔ سرور را نشان می‌دهد.

SSH و انتقال فایلمقدماتی10 دقیقه

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

الگوریتم ed25519 کوتاه، سریع و امن است. برای کلید یک عبارت عبور (passphrase) بگذارید تا در صورت دزدیده شدن فایل، بی‌فایده باشد.

bash
ssh-keygen -t ed25519 -C "matin@laptop"
# فایل‌ها: ~/.ssh/id_ed25519 (خصوصی) و ~/.ssh/id_ed25519.pub (عمومی)

کلید خصوصی (بدون .pub) را هرگز به کسی نفرستید و در گیت قرار ندهید.

۲کپی کلید عمومی به سرور

ssh-copy-id کلید را به فایل authorized_keys سرور اضافه می‌کند و دسترسی‌ها را درست می‌کند.

bash
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@SERVER_IP

# دستی، اگر ssh-copy-id ندارید
cat ~/.ssh/id_ed25519.pub | ssh user@SERVER_IP 'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'

۳تست ورود با کلید

باید بدون درخواست رمز حساب کاربری وارد شوید (فقط شاید عبارت عبور کلید).

bash
ssh user@SERVER_IP
ssh -v user@SERVER_IP   # برای عیب‌یابی

۴فایل ~/.ssh/config برای اتصال کوتاه

به‌جای نوشتن IP و کاربر و پورت در هر بار، یک نام کوتاه تعریف کنید. سپس فقط ssh web بزنید.

ini
nano ~/.ssh/config

Host web
    HostName 203.0.113.10
    User deploy
    Port 22
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 60

Host db
    HostName 10.0.0.5
    User deploy
    ProxyJump web

با ProxyJump به سروری که فقط از شبکهٔ داخلی در دسترس است از طریق سرور اول وصل می‌شوید.

۵بستن ورود با رمز عبور و root

فقط بعد از اینکه ورود با کلید را تست کردید این کار را انجام دهید و یک نشست دیگر را باز نگه دارید.

bash
sudo nano /etc/ssh/sshd_config.d/99-hardening.conf

PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes
MaxAuthTries 3
AllowUsers deploy
ClientAliveInterval 300
ClientAliveCountMax 2

sudo sshd -t && sudo systemctl reload ssh

اگر sshd -t خطا داد reload نکنید. کانفیگ اشتباه ممکن است دسترسی شما را قطع کند.

۶استفاده از ssh-agent

با agent فقط یک بار عبارت عبور کلید را وارد می‌کنید.

bash
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l

۷بررسی تلاش‌های ورود ناموفق

ببینید چه کسانی به سرور شما حمله می‌کنند و در صورت نیاز fail2ban نصب کنید.

bash
sudo lastb | head
sudo journalctl -u ssh --since today | grep -i 'failed' | tail
sudo fail2ban-client status sshd

۸انتقال فایل و تونل

با همان کلید scp و rsync هم کار می‌کنند. تونل SSH برای دسترسی امن به سرویس‌های داخلی (مثل دیتابیس) مفید است.

bash
scp file.zip web:/tmp/
rsync -avz ./dist/ web:/var/www/app/

# تونل: پورت محلی 3307 را به MySQL روی سرور وصل می‌کند
ssh -N -L 3307:127.0.0.1:3306 web

پرسش‌های پرتکرار دربارهٔ ورود به سرور با کلید SSH و امن‌سازی SSH (بدون رمز عبور)

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

اگر ورود با رمز غیرفعال شده باشد باید از کنسول پنل ارائه‌دهندهٔ سرور (VNC یا Rescue) وارد شوید و کلید جدید را به authorized_keys اضافه کنید. برای همین همیشه یک راه دسترسی جایگزین و بکاپ از کلیدها داشته باشید.

فایل‌های ~/.ssh چه دسترسی‌هایی باید داشته باشند؟

پوشهٔ ~/.ssh ۷۰۰ و فایل‌های کلید خصوصی و authorized_keys ۶۰۰. اگر دسترسی‌ها بازتر باشد SSH کلید را نادیده می‌گیرد.