SSH در Gentoo — سرور OpenSSH، احراز هویت با کلید و امنسازی
آموزش کامل SSH در Gentoo: نصب سرور OpenSSH، پیکربندی sshd_config، احراز هویت با کلید ed25519، ssh-agent، ssh config، fail2ban و خطاهای رایج.
SSH (Secure Shell) پروتکلی امن برای ورود به سیستم و اجرای دستورات از راه دور است. در Gentoo، سرور پیشفرض SSH بستهٔ net-misc/openssh است که تقریباً در هر نصب سروری فعال میشود. در این مستند با نصب، پیکربندی، احراز هویت با کلید و امنسازی SSH آشنا میشویم.
نصب سرور OpenSSH
# نصب بسته (معمولاً در Stage3 نصب است)
emerge --ask net-misc/openssh
# خروجی:
# [ebuild R ] net-misc/openssh-9.7_p1-r1 USE="..."
# بررسی فایلهای نصبشده
equery files net-misc/openssh | grep -E 'sshd$|sshd_config'
# /usr/sbin/sshd
# /etc/ssh/sshd_configفعالسازی سرویس
در OpenRC:
# افزودن به runlevel پیشفرض
rc-update add sshd default
# خروجی:
# * service sshd added to runlevel default
# شروع سرویس
rc-service sshd start
# خروجی:
# * Starting sshd ...
# بررسی وضعیت
rc-service sshd status
# * status: startedدر systemd:
systemctl enable sshd
systemctl start sshd
systemctl status sshd
# Active: active (running)تفاوت sshd و ssh
بستهٔ OpenSSH شامل دو مؤلفه است: ssh (کلاینت) و sshd (سرور). دستور ssh user@host برای اتصال به سرور دیگر به کار میرود، در حالی که سرویس sshd روی سیستم خودتان اجرا میشود تا دیگران بتوانند به آن وصل شوند.
پیکربندی sshd_config
فایل پیکربندی سرور در /etc/ssh/sshd_config قرار دارد. پس از هر تغییر باید سرویس را ریاستارت کنید:
nano /etc/ssh/sshd_config
rc-service sshd restart # یا systemctl restart sshdپیش از ریاستارت، نحوِ فایل را بررسی کنید:
sshd -t
# بدون خروجی یعنی نحوی درست استجدول دستورالعملهای مهم sshd_config
| دستورالعمل | پیشفرض | توصیه | توضیح |
|---|---|---|---|
Port | 22 | 22 یا پورت دلخواه | پورت شنید sshd |
PermitRootLogin | prohibit-password | no | جلوگیری از ورود مستقیم root |
PasswordAuthentication | yes | no | فقط کلید، نه رمز |
PubkeyAuthentication | yes | yes | فعالبودن احراز با کلید |
AllowUsers | همه | ali bob | فقط این کاربران میتوانند |
AllowGroups | همه | wheel | فقط اعضای این گروه |
X11Forwarding | yes | no | هنگام نیاز به GUI |
MaxAuthTries | 6 | 3 | حداکثر تلاش احراز |
LoginGraceTime | 120 | 30 | ثانیه برای ورود |
ClientAliveInterval | 0 | 300 | بررسی اتصال هر ۵ دقیقه |
PermitEmptyPasswords | no | no | هرگز اجازه رمز خالی ندهید |
نمونهای از پیکربندی امن:
# /etc/ssh/sshd_config
Port 22
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowUsers ali
AllowGroups wheel
X11Forwarding no
MaxAuthTries 3
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2
Protocol 2احراز هویت با کلید
رمز عبور قابل حدس است، در معرض brute-force قرار میگیرد و در سرورهای میانی (man-in-the-middle) قابل رهگیری است. احراز هویت با کلید عمومی/خصوصی بسیار امنتر است: کلید خصوصی روی کلاینت نگهداری میشود و هرگز به سرور ارسال نمیگردد.
ساخت کلید
روی کلاینت (سیستمی که میخواهید از آن وصل شوید):
# ساخت کلید ed25519 (پیشنهادی، کوتاه و امن)
ssh-keygen -t ed25519 -C "ali@gentoo-laptop"
# خروجی:
# Generating public/private ed25519 key pair.
# Enter file in which to save the key (~/.ssh/id_ed25519):
# Enter passphrase (empty for no passphrase):
# Enter same passphrase again:
# Your identification has been saved in ~/.ssh/id_ed25519
# Your public key has been saved in ~/.ssh/id_ed25519.pub
# یا کلید RSA با طول 4096 (اگر ed25519 پشتیبانی نمیشود)
ssh-keygen -t rsa -b 4096 -C "ali@gentoo-laptop"چرا ed25519؟
الگوریتم Ed25519 بر پایهٔ منحنی Edwards25519 ساخته شده، بسیار سریعتر از RSA است، کلید کوتاهتری دارد (۶۸ کاراکتر در برابر بیش از ۷۰۰ کاراکتر برای RSA-4096) و در برابر حملات side-channel مقاومتر است. هرگز از ECDSA یا از RSA با طول کمتر از ۲۰۴۸ بیت استفاده نکنید.
کپی کلید عمومی به سرور
سادهترین راه با ssh-copy-id:
ssh-copy-id ali@gentoo-server
# خروجی:
# /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s)
# /usr/bin/ssh-copy-id: INFO: 1 key(s) remained to be installed
# ali@gentoo-server's password:
# Number of key(s) added: 1
# Now try logging into the machine, with: "ssh 'ali@gentoo-server'"اگر ssh-copy-id در دسترس نبود، دستی کپی کنید:
# روی سرور
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5..." >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keysمجوزها حیاتیاند
اگر ~/.ssh مجوز ۷۰۰ و authorized_keys مجوز ۶۰۰ نداشته باشند، sshd از روی احتیاط کلید را رد میکند. این شایعترین دلیل خطای Permission denied (publickey) است.
تست اتصال
ssh ali@gentoo-server
# خروجی:
# Enter passphrase for key '/home/ali/.ssh/id_ed25519':
# Last login: Mon Sep 12 10:23:45 2025 from 192.168.1.5پیکربندی کلاینت ssh config
فایل ~/.ssh/config به شما اجازه میدهد بهجای اینکه هر بار IP، پورت و کاربر را بنویسید، مستقیماً ssh myserver بزنید:
# ~/.ssh/config
Host myserver
HostName gentoo-server.example.com
User ali
Port 22
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 300
Host git-server
HostName git.example.com
User git
IdentityFile ~/.ssh/id_ed25519_git
Host *
ServerAliveInterval 60
TCPKeepAlive yesssh myserver # معادل ssh -i ~/.ssh/id_ed25519 -p 22 ali@gentoo-server.example.comssh-agent برای cache کردن passphrase
اگر روی کلید خصوصی passphrase گذاشتهاید (که باید این کار را بکنید)، تکرار آن خستهکننده میشود. ssh-agent آن را در حافظه نگه میدارد:
# شروع agent
eval $(ssh-agent)
# Agent pid 12345
# افزودن کلید
ssh-add ~/.ssh/id_ed25519
# Enter passphrase for /home/ali/.ssh/id_ed25519:
# Identity added: /home/ali/.ssh/id_ed25519
# لیست کلیدهای بارگذاریشده
ssh-add -l
# 256 SHA256:abc123... ali@gentoo-laptop (ED25519)برای شروع خودکار ssh-agent در هر نشست، میتوانید این قطعه را به ~/.bashrc اضافه کنید:
if [ -z "$SSH_AUTH_SOCK" ]; then
eval $(ssh-agent) > /dev/null
ssh-add ~/.ssh/id_ed25519 2> /dev/null
fifail2ban برای جلوگیری از brute-force
اگر SSH شما به اینترنت باز است، حتماً fail2ban نصب کنید تا IPهایی که چندین تلاش ناموفق انجام میدهند مسدود شوند:
emerge --ask net-analyzer/fail2ban
rc-update add fail2ban default # OpenRC
rc-service fail2ban start
# یا
systemctl enable --now fail2banپیکربندی در /etc/fail2ban/jail.local:
[sshd]
enabled = true
port = 22
maxretry = 3
bantime = 3600
findtime = 600خطاهای رایج
۱. Permission denied (publickey)
ali@gentoo-server: Permission denied (publickey).دلیل: کلید عمومی روی سرور نیست، مجوزها اشتباه است، یا PasswordAuthentication no تنظیم شده اما کلید هنوز پیکربندی نشده. راهحل:
# روی سرور بررسی کنید
ls -la ~/.ssh/
# drwx------ 2 ali ali .ssh (700)
# -rw------- 1 ali ali authorized_keys (600)
# محتوای authorized_keys
cat ~/.ssh/authorized_keys
# باید شامل کلید عمومی شما باشد
# بررسی لاگ sshd روی سرور
tail -f /var/log/auth.log # یا journalctl -u sshd
# ممکن است این پیام را ببینید: Authentication refused: bad ownership۲. Connection refused
ssh: connect to host gentoo-server port 22: Connection refusedدلیل: سرویس sshd اجرا نمیشود یا فایروال بسته است. راهحل:
# روی سرور
rc-service sshd status
# یا
systemctl status sshd
# بررسی پورت
ss -tlnp | grep :22
# tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))۳. ورود کند است (تأخیر چند ثانیهای)
دلیل: sshd تلاش میکند hostname کلاینت را از طریق DNS بهصورت معکوس resolve کند و DNS کند است. راهحل:
# /etc/ssh/sshd_config
UseDNS no
GSSAPIAuthentication norc-service sshd restartخارج کردن خودتان از سیستم
اگر PasswordAuthentication no را تنظیم کردهاید و کلید عمومی بهدرستی کپی نشده باشد، دیگر نمیتوانید وارد شوید! پیش از بستن نشست فعلی، یک ترمینال دیگر باز کنید و بررسی کنید که اتصال با کلید درست کار میکند یا نه. اگر کار نکرد، پیکربندی را به حالت قبل برگردانید و دوباره تلاش کنید.
خلاصه و مرحله بعد
SSH در Gentoo با بستهٔ net-misc/openssh نصب میشود و سرویس sshd آن را اجرا میکند. مهمترین گامهای امنسازی عبارتاند از: غیرفعالکردن ورود مستقیم root، فعالکردن احراز هویت با کلید ed25519، غیرفعالکردن ورود با رمز عبور و نصب fail2ban. فایل ~/.ssh/config و ssh-agent نیز تجربهٔ کاربری را بهبود میبخشند.
برای ایجاد کاربران و گروهها به آموزش Users و برای اجرای دستورات مدیریتی به آموزش sudo مراجعه کنید. برای کلیات شبکه هم آموزش Networking را ببینید.
این صفحه در تاریخ ۱ تیر ۱۴۰۵ بهروزرسانی شده است.