برای مدیریت یک سرور لینوکسی از راه دور، معمولاً از پروتکل SSH استفاده می‌شود. ساده‌ترین روش ورود به سرور، وارد کردن نام کاربری و رمز عبور است؛ اما این روش در برابر حملات Brute Force، رمزهای ضعیف، فیشینگ و افشای اطلاعات ورود آسیب‌پذیرتر است. راهکار امن‌تر، استفاده از SSH Key یا احراز هویت مبتنی بر کلید عمومی است.

در روش SSH Key، به‌جای ارسال یا وارد کردن رمز حساب سرور، یک جفت کلید رمزنگاری‌شده ایجاد می‌شود. کلید خصوصی فقط روی کامپیوتر شما باقی می‌ماند و کلید عمومی روی سرور قرار می‌گیرد. هنگام اتصال، سرور بررسی می‌کند آیا شما واقعاً کلید خصوصی متناظر را در اختیار دارید یا خیر؛ بدون اینکه کلید خصوصی از سیستم شما خارج شود.

در این مقاله، ساخت SSH Key در macOS و Linux را با ابزار استاندارد OpenSSH آموزش می‌دهیم. همچنین تفاوت کلید عمومی و خصوصی، انتخاب بین Ed25519 و RSA، استفاده از Passphrase، تنظیم Permission، انتقال کلید به سرور، استفاده از SSH Agent و Keychain مک، مدیریت چند کلید، امن‌سازی SSH Server و رفع خطاهای رایج را بررسی می‌کنیم.

سطح مقاله: مقدماتی تا متوسط | مناسب برای: مدیران سرور، کاربران VPS، برنامه‌نویسان، متخصصان DevOps، مدیران سایت، کاربران macOS و Linux و افرادی که به سرورهای لینوکسی متصل می‌شوند.

فهرست مطالب

SSH Key چیست؟

SSH Key یک جفت کلید رمزنگاری‌شده است که برای احراز هویت کاربر هنگام اتصال به سرور SSH استفاده می‌شود. این جفت کلید از دو بخش تشکیل شده است:

  • Private Key یا کلید خصوصی: روی کامپیوتر شخصی کاربر نگهداری می‌شود و نباید در اختیار فرد دیگری قرار بگیرد.
  • Public Key یا کلید عمومی: روی سرور مقصد و معمولاً در فایل ~/.ssh/authorized_keys قرار می‌گیرد.

کلید عمومی را می‌توانید روی چند سرور قرار دهید، اما کلید خصوصی باید همیشه محرمانه باقی بماند. برای ورود، کلاینت SSH ثابت می‌کند کلید خصوصی متناظر با Public Key ثبت‌شده روی سرور را در اختیار دارد.

SSH Key فقط برای ورود به سرور کاربرد ندارد. از همین ساختار می‌توان برای موارد زیر استفاده کرد:

  • اتصال امن به سرورهای Linux و VPS
  • احراز هویت در GitHub، GitLab و مخازن Git
  • اجرای خودکار Deploy و CI/CD
  • انتقال فایل با SCP، SFTP و Rsync
  • ساخت SSH Tunnel
  • اتصال ابزارهای مدیریت سرور و DevOps
  • دسترسی امن سرویس‌ها و Automationها

اگر از سرور مجازی ایران، سرور مجازی آلمان یا سرور اختصاصی استفاده می‌کنید، بهتر است ورود مدیریتی را از ابتدا با SSH Key تنظیم کنید.

احراز هویت با SSH Key چگونه کار می‌کند؟

در زمان ورود با SSH Key، کلید خصوصی شما به سرور ارسال نمی‌شود. فرایند احراز هویت به‌صورت خلاصه چنین است:

  1. کلاینت SSH به سرور اعلام می‌کند یک Public Key مشخص در اختیار دارد.
  2. سرور بررسی می‌کند آیا آن Public Key در فایل authorized_keys کاربر وجود دارد یا خیر.
  3. کلاینت با کلید خصوصی خود داده‌ای را امضا می‌کند.
  4. سرور امضا را با Public Key ذخیره‌شده بررسی می‌کند.
  5. اگر امضا معتبر باشد، دسترسی کاربر تأیید می‌شود.

در این فرایند، کلید خصوصی فقط روی دستگاه شما باقی می‌ماند. به همین دلیل مهاجم نمی‌تواند صرفاً با شنود ارتباط SSH به کلید خصوصی دسترسی پیدا کند.

تفاوت Public Key و Private Key

ویژگیPrivate KeyPublic Key
نمونه نام فایلid_ed25519id_ed25519.pub
محل نگهداریفقط روی سیستم شخصیروی سرور مقصد
قابل اشتراک‌گذاریهرگزبله
Permission پیشنهادی600644
نقشاثبات هویت و امضای رمزنگاری‌شدهبررسی امضای کلید خصوصی

هشدار مهم: فایل بدون پسوند، مثل id_ed25519 یا id_rsa، کلید خصوصی است. این فایل را در ایمیل، پیام‌رسان، Git Repository، سرور یا فضای عمومی آپلود نکنید.

فقط فایل دارای پسوند .pub برای کپی روی سرور مناسب است.

چرا SSH Key از رمز عبور امن‌تر است؟

رمزهای عبور کوتاه یا قابل حدس ممکن است با حملات Brute Force، Credential Stuffing، بدافزار یا فیشینگ افشا شوند. در مقابل، کلیدهای SSH از ساختارهای رمزنگاری بسیار بزرگ و پیچیده استفاده می‌کنند که حدس زدن مستقیم آن‌ها عملاً امکان‌پذیر نیست.

مزایای مهم SSH Key عبارت‌اند از:

  • مقاومت بیشتر در برابر Brute Force
  • عدم ارسال رمز حساب سرور در زمان ورود
  • امکان غیرفعال کردن کامل Password Authentication
  • امکان استفاده از Passphrase برای حفاظت از Private Key
  • مدیریت دسترسی هر کاربر با کلید مستقل
  • امکان لغو دسترسی با حذف یک خط از authorized_keys
  • مناسب برای Automation، Deploy و CI/CD

بااین‌حال، SSH Key به‌تنهایی همه مشکلات امنیتی را حل نمی‌کند. اگر سیستم شخصی شما آلوده شود یا کلید خصوصی بدون Passphrase سرقت شود، مهاجم ممکن است بتواند از آن استفاده کند. بنابراین امنیت کامپیوتر محلی، Passphrase، رمزگذاری دیسک و مدیریت صحیح کلیدها همچنان اهمیت دارند.

تفاوت Ed25519 و RSA؛ کدام کلید بهتر است؟

OpenSSH از چند الگوریتم برای ساخت کلید پشتیبانی می‌کند. دو گزینه رایج برای کاربران عمومی Ed25519 و RSA هستند.

ویژگیEd25519RSA
انتخاب پیشنهادی برای کلید جدیدبلهبرای سازگاری با سیستم‌های قدیمی
اندازه کلیدکوتاه و ثابتمعمولاً ۳۰۷۲ یا ۴۰۹۶ بیت
سرعتسریعکندتر از Ed25519
حجم فایل و امضاکمتربیشتر
سازگاریمناسب سیستم‌های مدرنسازگاری بیشتر با ابزارهای قدیمی

برای بیشتر کاربران macOS، Linux، سرورهای جدید Ubuntu و نسخه‌های مدرن OpenSSH، پیشنهاد اصلی این است:

ssh-keygen -t ed25519

اگر سرور، کنترل پنل، تجهیزات شبکه یا نرم‌افزار قدیمی شما از Ed25519 پشتیبانی نمی‌کند، از RSA ۴۰۹۶ بیتی استفاده کنید:

ssh-keygen -t rsa -b 4096

الگوریتم قدیمی DSA یا کلیدهای ssh-dss برای کلید جدید مناسب نیستند و نباید استفاده شوند.

پیش‌نیازهای ساخت SSH Key

برای ادامه آموزش به این موارد نیاز دارید:

  • یک کامپیوتر دارای macOS یا Linux
  • دسترسی به Terminal
  • نصب بودن OpenSSH Client
  • یک سرور لینوکسی دارای SSH Server
  • نام کاربری و IP یا Hostname سرور
  • رمز عبور اولیه حساب سرور برای انتقال Public Key

باز کردن Terminal در macOS

در macOS می‌توانید Terminal را از مسیر زیر باز کنید:

Applications → Utilities → Terminal

یا با Spotlight عبارت Terminal را جستجو کنید.

باز کردن Terminal در Linux

در بیشتر توزیع‌های Linux، ترمینال از منوی برنامه‌ها قابل اجرا است. در بسیاری از محیط‌های دسکتاپ میانبر زیر نیز کار می‌کند:

Ctrl + Alt + T

بررسی نصب OpenSSH

ssh -V

نمونه خروجی:

OpenSSH_9.x, OpenSSL 3.x

شماره دقیق نسخه ممکن است متفاوت باشد. مشاهده اطلاعات نسخه یعنی OpenSSH Client روی سیستم نصب است.

اگر در Ubuntu یا Debian دستور پیدا نشد:

sudo apt update
sudo apt install openssh-client -y

در Fedora، Rocky Linux یا AlmaLinux:

sudo dnf install openssh-clients -y

بررسی کلیدهای SSH موجود

قبل از ایجاد کلید جدید، محتویات پوشه SSH را بررسی کنید:

ls -la ~/.ssh

ممکن است فایل‌هایی شبیه موارد زیر ببینید:

id_ed25519
id_ed25519.pub
id_rsa
id_rsa.pub
known_hosts
config

وجود فایل‌های id_ed25519 و id_ed25519.pub یعنی قبلاً یک جفت کلید Ed25519 ساخته‌اید.

وجود فایل‌های id_rsa و id_rsa.pub نیز نشان‌دهنده یک جفت کلید RSA است.

اگر نمی‌دانید کلید قبلی کجا استفاده شده، آن را بدون بررسی بازنویسی نکنید. بازنویسی Private Key باعث می‌شود اتصال‌هایی که به کلید قبلی وابسته‌اند دیگر کار نکنند.

تهیه نسخه پشتیبان از کلید موجود

در صورت نیاز به حفظ کلید قبلی، ابتدا از آن بکاپ بگیرید:

cp ~/.ssh/id_ed25519 ~/.ssh/id_ed25519.backup
cp ~/.ssh/id_ed25519.pub ~/.ssh/id_ed25519.pub.backup

نسخه پشتیبان کلید خصوصی را نیز باید مانند اصل کلید محرمانه و با Permission محدود نگهداری کنید.

ساخت کلید Ed25519 در macOS و Linux

برای ساخت یک کلید Ed25519 جدید، دستور زیر را در کامپیوتر محلی اجرا کنید:

ssh-keygen -t ed25519 -C "[email protected]"

عبارت ایمیل فقط یک Comment برای شناسایی کلید است و در امنیت یا عملکرد کلید نقشی ندارد. می‌توانید به‌جای ایمیل توضیح دیگری بنویسید:

ssh-keygen -t ed25519 -C "ali-production-server"

بعد از اجرای دستور، OpenSSH محل ذخیره کلید را می‌پرسد:

Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/username/.ssh/id_ed25519):

در Linux مسیر پیش‌فرض معمولاً شبیه این است:

/home/username/.ssh/id_ed25519

در macOS مسیر معمولاً شبیه این است:

/Users/username/.ssh/id_ed25519

اگر هنوز کلیدی با این نام ندارید، کلید Enter را بزنید تا مسیر پیش‌فرض انتخاب شود.

سپس از شما Passphrase پرسیده می‌شود:

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

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

Your identification has been saved in /Users/username/.ssh/id_ed25519
Your public key has been saved in /Users/username/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:EXAMPLE_FINGERPRINT [email protected]

دو فایل ایجاد شده‌اند:

~/.ssh/id_ed25519       Private Key
~/.ssh/id_ed25519.pub   Public Key

نمایش Public Key

cat ~/.ssh/id_ed25519.pub

نمونه ساختار:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... [email protected]

تمام این خط، از ssh-ed25519 تا Comment انتهایی، کلید عمومی شماست.

فایل کلید خصوصی را با cat نمایش ندهید و در اختیار دیگران قرار ندهید.

معنی گزینه‌های دستور ssh-keygen

دستور مورد استفاده:

ssh-keygen -t ed25519 -C "[email protected]"
گزینهکاربرد
ssh-keygenابزار ساخت و مدیریت کلیدهای OpenSSH
-t ed25519انتخاب الگوریتم Ed25519
-Cاضافه کردن Comment برای شناسایی کلید
-fمشخص کردن نام و مسیر فایل کلید
-bتعیین تعداد بیت برای الگوریتم‌هایی مانند RSA
-aافزایش دورهای KDF برای محافظت بیشتر از کلید دارای Passphrase

ساخت کلید با نام اختصاصی

برای جلوگیری از بازنویسی کلید پیش‌فرض یا برای ساخت کلید جداگانه برای هر سرور:

ssh-keygen \
  -t ed25519 \
  -C "production-server" \
  -f ~/.ssh/id_ed25519_production

دو فایل زیر ساخته می‌شوند:

~/.ssh/id_ed25519_production
~/.ssh/id_ed25519_production.pub

افزایش مقاومت Passphrase در برابر حدس زدن

برای افزایش تعداد دورهای تابع مشتق‌سازی کلید می‌توانید از گزینه -a استفاده کنید:

ssh-keygen \
  -t ed25519 \
  -a 100 \
  -C "production-server"

افزایش این مقدار، باز کردن کلید با Passphrase را کمی کندتر می‌کند و در صورت سرقت فایل کلید، حمله آفلاین به Passphrase را پرهزینه‌تر می‌سازد.

ساخت کلید RSA ۴۰۹۶ بیتی

اگر ابزار یا سرور قدیمی از Ed25519 پشتیبانی نمی‌کند، یک کلید RSA با اندازه ۴۰۹۶ بیت بسازید:

ssh-keygen -t rsa -b 4096 -C "[email protected]"

فایل‌های پیش‌فرض RSA:

~/.ssh/id_rsa
~/.ssh/id_rsa.pub

برای نام اختصاصی:

ssh-keygen \
  -t rsa \
  -b 4096 \
  -C "legacy-server" \
  -f ~/.ssh/id_rsa_legacy

در زمان استفاده از RSA، تفاوت مهمی میان نوع کلید RSA و الگوریتم امضای قدیمی ssh-rsa وجود دارد. نسخه‌های جدید OpenSSH می‌توانند از کلید RSA با امضاهای امن‌تر SHA-۲ استفاده کنند؛ بنابراین صرف وجود فایل id_rsa به معنی استفاده از امضای قدیمی SHA-۱ نیست.

Passphrase کلید SSH چیست؟

Passphrase رمزی است که فایل Private Key را روی دیسک رمزنگاری می‌کند. اگر شخصی فایل کلید خصوصی شما را کپی کند اما Passphrase آن را نداند، نمی‌تواند بلافاصله از کلید استفاده کند.

Passphrase با رمز حساب سرور تفاوت دارد:

  • رمز حساب سرور روی سرور بررسی می‌شود.
  • Passphrase برای باز کردن کلید خصوصی روی کامپیوتر محلی استفاده می‌شود.
  • Passphrase به سرور مقصد ارسال نمی‌شود.

استفاده از Passphrase برای کلیدهای شخصی، مدیریتی و Production به‌شدت توصیه می‌شود.

آیا می‌توان SSH Key بدون Passphrase ساخت؟

بله. با خالی گذاشتن Passphrase، کلید بدون رمز ساخته می‌شود. این حالت در بعضی Automationها ضروری است؛ اما اگر فایل کلید سرقت شود، مهاجم می‌تواند بدون مانع اضافی از آن استفاده کند.

برای CI/CD و Automation بهتر است به‌جای استفاده بی‌محدودیت از کلید بدون Passphrase، دسترسی کلید را محدود کنید، کاربر اختصاصی بسازید، فرمان‌های مجاز را کنترل کنید یا از Secret Manager و کلیدهای کوتاه‌عمر استفاده کنید.

تنظیم Permission فایل‌های SSH

OpenSSH روی مجوز فایل‌های کلید خصوصی حساس است. اگر سایر کاربران بتوانند Private Key را بخوانند، SSH ممکن است کلید را نادیده بگیرد و خطای زیر را نمایش دهد:

WARNING: UNPROTECTED PRIVATE KEY FILE!
Permissions are too open.

مجوزهای پیشنهادی:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub

اگر کلید نام دیگری دارد، همان نام را جایگزین کنید:

chmod 600 ~/.ssh/id_ed25519_production
chmod 644 ~/.ssh/id_ed25519_production.pub

برای بررسی:

ls -la ~/.ssh

خروجی مناسب باید مشابه این باشد:

drwx------  .ssh
-rw-------  id_ed25519
-rw-r--r--  id_ed25519.pub

اضافه کردن کلید به SSH Agent در Linux

اگر روی Private Key یک Passphrase قرار داده باشید، در حالت عادی هنگام هر اتصال از شما خواسته می‌شود آن را وارد کنید. SSH Agent می‌تواند کلید رمزگشایی‌شده را موقتاً در حافظه نگه دارد تا در طول Session نیازی به تکرار Passphrase نباشد.

بررسی فعال بودن Agent

echo $SSH_AUTH_SOCK

اگر یک مسیر نمایش داده شد، Agent در حال اجراست. اگر خروجی خالی بود:

eval "$(ssh-agent -s)"

نمونه خروجی:

Agent pid 12345

اضافه کردن کلید

ssh-add ~/.ssh/id_ed25519

اگر کلید Passphrase دارد، یک‌بار از شما درخواست می‌شود آن را وارد کنید.

مشاهده کلیدهای بارگذاری‌شده

ssh-add -l

حذف یک کلید از Agent

ssh-add -d ~/.ssh/id_ed25519

حذف همه کلیدها از Agent

ssh-add -D

ذخیره کلید SSH در Keychain مک

در macOS می‌توانید Passphrase کلید را در Keychain ذخیره کنید تا بعد از ورود مجدد یا Restart نیز اتصال‌ها ساده‌تر انجام شوند.

ابتدا Agent را فعال کنید:

eval "$(ssh-agent -s)"

سپس کلید را با گزینه مخصوص Keychain اضافه کنید:

ssh-add --apple-use-keychain ~/.ssh/id_ed25519

در نسخه‌های قدیمی‌تر macOS ممکن است از این گزینه استفاده شود:

ssh-add -K ~/.ssh/id_ed25519

تنظیم فایل SSH Config در macOS

فایل تنظیمات را بسازید یا باز کنید:

nano ~/.ssh/config

این تنظیمات را اضافه کنید:

Host *
    AddKeysToAgent yes
    UseKeychain yes
    IdentityFile ~/.ssh/id_ed25519

Permission فایل را محدود کنید:

chmod 600 ~/.ssh/config

گزینه UseKeychain مخصوص نسخه OpenSSH ارائه‌شده همراه macOS است و نباید بدون بررسی در فایل Config مشترک Linux قرار داده شود.

انتقال Public Key به سرور

بعد از ساخت کلید، باید Public Key را در حساب کاربر روی سرور قرار دهید. روش رایج در Linux استفاده از ssh-copy-id است.

ssh-copy-id [email protected]

به‌جای username نام کاربر سرور و به‌جای IP نمونه، IP واقعی سرور را وارد کنید.

برای مثال:

ssh-copy-id [email protected]

اگر اولین اتصال شما باشد، پیام بررسی Host Key نمایش داده می‌شود:

The authenticity of host '192.0.2.10' can't be established.
Are you sure you want to continue connecting?

قبل از تأیید، بهتر است Fingerprint کلید میزبان را از یک مسیر قابل اعتماد، مانند کنسول دیتاسنتر، با مقدار نمایش‌داده‌شده مقایسه کنید.

سپس رمز حساب سرور را یک‌بار وارد می‌کنید و Public Key به فایل زیر اضافه می‌شود:

~/.ssh/authorized_keys

انتقال یک کلید با نام اختصاصی

ssh-copy-id \
  -i ~/.ssh/id_ed25519_production.pub \
  [email protected]

انتقال کلید به SSH روی پورت غیرپیش‌فرض

ssh-copy-id \
  -i ~/.ssh/id_ed25519.pub \
  -p 2222 \
  [email protected]

اگر در macOS دستور ssh-copy-id نصب نیست، از روش دستی بخش بعد استفاده کنید.

انتقال دستی کلید عمومی به سرور

روشی که در macOS و Linux قابل استفاده است:

cat ~/.ssh/id_ed25519.pub | \
ssh [email protected] \
'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys'

این دستور:

  1. محتوای Public Key را می‌خواند.
  2. با رمز حساب به سرور متصل می‌شود.
  3. پوشه ~/.ssh را در صورت نبود ایجاد می‌کند.
  4. کلید را به انتهای authorized_keys اضافه می‌کند.

روش کاملاً دستی

Public Key را روی سیستم محلی نمایش دهید:

cat ~/.ssh/id_ed25519.pub

تمام خط را کپی کنید. سپس با رمز عبور وارد سرور شوید:

ssh [email protected]

روی سرور:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys

کلید عمومی را در یک خط جدید Paste کنید. سپس:

chmod 600 ~/.ssh/authorized_keys
chown -R "$(id -un)":"$(id -gn)" ~/.ssh

کلید عمومی باید در یک خط کامل قرار بگیرد. شکستن کلید در چند خط باعث نامعتبر شدن آن می‌شود.

تست ورود به سرور با SSH Key

اکنون اتصال را امتحان کنید:

ssh [email protected]

اگر کلید در مسیر پیش‌فرض باشد، OpenSSH معمولاً آن را خودکار پیدا می‌کند.

اگر نام یا مسیر کلید اختصاصی است:

ssh \
  -i ~/.ssh/id_ed25519_production \
  [email protected]

برای پورت غیرپیش‌فرض:

ssh \
  -i ~/.ssh/id_ed25519_production \
  -p 2222 \
  [email protected]

اگر کلید Passphrase دارد و در Agent بارگذاری نشده، Passphrase کلید از شما پرسیده می‌شود. این درخواست با Password حساب سرور متفاوت است.

مشاهده جزئیات اتصال

اگر ورود انجام نمی‌شود، حالت Verbose را فعال کنید:

ssh -v [email protected]

برای جزئیات بیشتر:

ssh -vvv [email protected]

در خروجی به عبارت‌هایی مانند موارد زیر دقت کنید:

Offering public key
Server accepts key
Authentication succeeded

مدیریت اتصال‌ها با فایل SSH Config

اگر مرتباً به سرور متصل می‌شوید، نوشتن IP، User، Port و مسیر کلید در هر بار اتصال خسته‌کننده است. می‌توانید این اطلاعات را در فایل ~/.ssh/config ذخیره کنید.

nano ~/.ssh/config

نمونه برای Linux:

Host production
    HostName 203.0.113.10
    User deploy
    Port 22
    IdentityFile ~/.ssh/id_ed25519_production
    IdentitiesOnly yes
    AddKeysToAgent yes

حالا به‌جای دستور طولانی فقط بنویسید:

ssh production

نمونه تنظیم برای macOS

Host production
    HostName 203.0.113.10
    User deploy
    Port 22
    IdentityFile ~/.ssh/id_ed25519_production
    IdentitiesOnly yes
    AddKeysToAgent yes
    UseKeychain yes

Permission فایل Config:

chmod 600 ~/.ssh/config

مزایای IdentitiesOnly

گزینه زیر به SSH می‌گوید فقط کلید مشخص‌شده در Config را امتحان کند:

IdentitiesOnly yes

این تنظیم وقتی چند کلید در SSH Agent دارید، از خطای Too many authentication failures جلوگیری می‌کند.

مدیریت چند SSH Key

بهتر است برای محیط‌ها، سازمان‌ها یا اهداف حساس، کلیدهای جدا داشته باشید. برای مثال:

~/.ssh/id_ed25519_personal
~/.ssh/id_ed25519_work
~/.ssh/id_ed25519_production
~/.ssh/id_ed25519_gitlab

ساخت کلید Production:

ssh-keygen \
  -t ed25519 \
  -a 100 \
  -C "ali-production" \
  -f ~/.ssh/id_ed25519_production

نمونه Config برای چند سرور:

Host production
    HostName 203.0.113.10
    User deploy
    IdentityFile ~/.ssh/id_ed25519_production
    IdentitiesOnly yes

Host staging
    HostName 203.0.113.20
    User deploy
    IdentityFile ~/.ssh/id_ed25519_staging
    IdentitiesOnly yes

Host gitlab.example.com
    HostName gitlab.example.com
    User git
    IdentityFile ~/.ssh/id_ed25519_gitlab
    IdentitiesOnly yes

مزیت کلیدهای جداگانه این است که در صورت افشای یک کلید، فقط دسترسی‌های همان کلید در معرض خطر قرار می‌گیرند.

غیرفعال کردن ورود با رمز عبور

بعد از اینکه ورود با SSH Key را با موفقیت آزمایش کردید، می‌توانید Password Authentication را روی سرور غیرفعال کنید تا حملات حدس رمز بی‌اثر شوند.

قبل از انجام این مرحله:

  • اتصال فعلی SSH را باز نگه دارید.
  • در یک Terminal دوم، ورود با کلید را تست کنید.
  • مطمئن شوید کاربر شما دسترسی sudo دارد.
  • به کنسول اضطراری دیتاسنتر دسترسی داشته باشید.

تنظیم در Ubuntu جدید

یک فایل Drop-in بسازید:

sudo nano /etc/ssh/sshd_config.d/99-key-authentication.conf

تنظیمات زیر را وارد کنید:

PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no

قبل از Reload، صحت Syntax را بررسی کنید:

sudo sshd -t

اگر هیچ خروجی نمایش داده نشد، تنظیمات از نظر Syntax معتبر است. سرویس را Reload کنید:

sudo systemctl reload ssh

در بعضی توزیع‌ها نام سرویس sshd است:

sudo systemctl reload sshd

اکنون در یک Terminal جدید، اتصال را دوباره امتحان کنید. تا قبل از تأیید ورود موفق، Session قبلی را نبندید.

اگر پورت SSH را تغییر داده‌اید، باید پورت جدید را در فایروال نیز مجاز کنید. برای مطالعه بیشتر می‌توانید راهنمای باز کردن پورت در فایروال اوبونتو را بخوانید.

مشاهده، تغییر و بازیابی کلیدهای SSH

نمایش Fingerprint کلید عمومی

ssh-keygen -lf ~/.ssh/id_ed25519.pub

نمایش Fingerprint با جزئیات و Randomart

ssh-keygen -lvf ~/.ssh/id_ed25519.pub

تغییر Passphrase کلید خصوصی

ssh-keygen -p -f ~/.ssh/id_ed25519

ابتدا Passphrase قبلی و سپس Passphrase جدید از شما پرسیده می‌شود.

ساخت مجدد Public Key از Private Key

اگر فایل .pub حذف شده اما Private Key را دارید:

ssh-keygen -y \
  -f ~/.ssh/id_ed25519 \
  > ~/.ssh/id_ed25519.pub

سپس Permission را تنظیم کنید:

chmod 644 ~/.ssh/id_ed25519.pub

تغییر Comment کلید

ssh-keygen -c -f ~/.ssh/id_ed25519

حذف دسترسی یک کلید از سرور

روی سرور فایل زیر را باز کنید:

nano ~/.ssh/authorized_keys

خط مربوط به Public Key موردنظر را حذف کنید. حذف Public Key از سرور، Private Key را پاک نمی‌کند؛ فقط دسترسی آن کلید به همان حساب سرور لغو می‌شود.

ساخت کلید SSH سخت‌افزاری

برای امنیت بالاتر می‌توان Private Key را به یک کلید امنیتی سخت‌افزاری سازگار با FIDO2 متصل کرد. OpenSSH برای این کار از انواعی مانند ed25519-sk پشتیبانی می‌کند.

ssh-keygen -t ed25519-sk -C "hardware-security-key"

در این مدل، برای استفاده از کلید معمولاً باید توکن سخت‌افزاری متصل باشد و کاربر آن را لمس یا تأیید کند. این روش برای دسترسی‌های حساس، مدیران زیرساخت و محیط‌های Production گزینه امنیتی قدرتمندی است.

پشتیبانی دقیق به نسخه OpenSSH، سیستم‌عامل و مدل Security Key بستگی دارد.

رفع خطاهای رایج SSH Key

خطای Permission denied (publickey)

این خطا یعنی سرور هیچ‌کدام از کلیدهای ارائه‌شده را نپذیرفته است.

ابتدا با حالت Verbose بررسی کنید:

ssh -vvv [email protected]

موارد زیر را کنترل کنید:

  • نام کاربری درست است.
  • Public Key در حساب همان کاربر قرار دارد.
  • کلید در ~/.ssh/authorized_keys موجود است.
  • کلید خصوصی درست توسط کلاینت استفاده می‌شود.
  • PubkeyAuthentication روی سرور فعال است.
  • Permission و مالکیت فایل‌های سرور درست است.

اصلاح Permission روی سرور

پس از ورود از طریق کنسول یا روش جایگزین:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R "$(id -un)":"$(id -gn)" ~/.ssh

خطای WARNING: UNPROTECTED PRIVATE KEY FILE

chmod 600 ~/.ssh/id_ed25519

مالک فایل را نیز بررسی کنید:

ls -l ~/.ssh/id_ed25519

کلید در SSH Agent وجود ندارد

ssh-add -l

اگر پیام زیر را دیدید:

The agent has no identities.

کلید را اضافه کنید:

ssh-add ~/.ssh/id_ed25519

خطای Too many authentication failures

این خطا معمولاً وقتی رخ می‌دهد که Agent تعداد زیادی کلید را یکی‌یکی برای سرور ارسال می‌کند.

کلید را مستقیم مشخص کنید:

ssh \
  -o IdentitiesOnly=yes \
  -i ~/.ssh/id_ed25519_production \
  [email protected]

یا در ~/.ssh/config:

IdentitiesOnly yes

SSH کلید اشتباه را انتخاب می‌کند

کلید موردنظر را مستقیم وارد کنید:

ssh -i ~/.ssh/id_ed25519_work user@server

برای مشاهده اینکه SSH چه تنظیماتی را اعمال می‌کند:

ssh -G production

خطای Host key verification failed

این خطا به Host Key سرور مربوط است، نه کلید شخصی شما. ممکن است سیستم‌عامل سرور دوباره نصب شده، IP به سرور دیگری منتقل شده یا حمله Man-in-the-Middle در جریان باشد.

قبل از حذف رکورد قدیمی، Fingerprint جدید را از کنسول یا ارائه‌دهنده سرور تأیید کنید. سپس:

ssh-keygen -R 203.0.113.10

برای SSH روی پورت غیرپیش‌فرض:

ssh-keygen -R "[203.0.113.10]:2222"

هشدار تغییر Host Key را بدون بررسی نادیده نگیرید.

Public Key در چند خط شکسته شده است

هر Public Key باید به‌طور کامل در یک خط فایل authorized_keys قرار گیرد. شکستن کلید در چند خط یا حذف بخشی از رشته Base64 باعث رد شدن آن می‌شود.

خطای Load key: invalid format

دلایل احتمالی:

  • فایل کلید ناقص یا خراب شده است.
  • خط‌های ابتدا و انتهای Private Key حذف شده‌اند.
  • فایل با Line Ending نامناسب تغییر کرده است.
  • فایل Public Key به‌جای Private Key به گزینه -i داده شده است.
  • ابزار مقصد فقط فرمت PEM قدیمی را پشتیبانی می‌کند.

فرمت کلید را بررسی کنید:

head -n 1 ~/.ssh/id_ed25519

در کلید جدید OpenSSH معمولاً عنوان زیر دیده می‌شود:

-----BEGIN OPENSSH PRIVATE KEY-----

محتوای کامل Private Key را در خروجی عمومی، تیکت پشتیبانی یا پیام‌رسان ارسال نکنید.

کلید بعد از Restart مک بارگذاری نمی‌شود

کلید را با Keychain اضافه کنید:

ssh-add --apple-use-keychain ~/.ssh/id_ed25519

و در ~/.ssh/config قرار دهید:

Host *
    AddKeysToAgent yes
    UseKeychain yes
    IdentityFile ~/.ssh/id_ed25519

ssh-copy-id در macOS پیدا نمی‌شود

از روش سازگار با SSH استفاده کنید:

cat ~/.ssh/id_ed25519.pub | \
ssh username@server \
'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys'

بهترین روش‌های امنیتی SSH Key

  • برای کلیدهای جدید از Ed25519 استفاده کنید.
  • برای کلیدهای مدیریتی Passphrase قوی قرار دهید.
  • Private Key را هرگز روی سرور مقصد کپی نکنید.
  • Private Key را در Git، ایمیل یا پیام‌رسان قرار ندهید.
  • برای هر کاربر، کلید مستقل بسازید.
  • کلید مشترک میان اعضای تیم استفاده نکنید.
  • برای Production و محیط شخصی کلید جدا بسازید.
  • Permission پوشه .ssh را روی ۷۰۰ قرار دهید.
  • Permission کلید خصوصی را روی ۶۰۰ قرار دهید.
  • کلیدهای قدیمی و کاربران خارج‌شده از تیم را حذف کنید.
  • پس از تست کلید، ورود با رمز عبور را غیرفعال کنید.
  • ورود مستقیم root را ببندید و از کاربر sudo استفاده کنید.
  • SSH را با فایروال، Fail2Ban یا محدودسازی IP محافظت کنید.
  • تغییر Host Key سرور را بدون تأیید نپذیرید.
  • از کلید خصوصی در محل رمزنگاری‌شده بکاپ بگیرید.
  • برای دسترسی‌های بسیار حساس از Security Key سخت‌افزاری استفاده کنید.

اگر چند سرور یا سایت مهم دارید، بهتر است علاوه بر SSH Key، مانیتورینگ لاگ‌های ورود، محدودسازی IP و ثبت دسترسی مدیران را نیز اجرا کنید. کیفیت زیرساخت هم اهمیت دارد؛ برای پروژه‌های حساس می‌توانید از سرویس‌های سرور مجازی و اختصاصی با دسترسی مدیریتی استفاده کنید.

دستورات خلاصه ساخت SSH Key

# بررسی OpenSSH
ssh -V

# بررسی کلیدهای قبلی
ls -la ~/.ssh

# ساخت کلید Ed25519
ssh-keygen -t ed25519 -C "[email protected]"

# ساخت کلید با نام اختصاصی
ssh-keygen \
  -t ed25519 \
  -a 100 \
  -C "production-server" \
  -f ~/.ssh/id_ed25519_production

# ساخت RSA 4096 برای سازگاری
ssh-keygen \
  -t rsa \
  -b 4096 \
  -C "legacy-server"

# اصلاح Permission
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub

# راه‌اندازی SSH Agent
eval "$(ssh-agent -s)"

# افزودن کلید به Agent
ssh-add ~/.ssh/id_ed25519

# افزودن کلید به Keychain مک
ssh-add --apple-use-keychain ~/.ssh/id_ed25519

# نمایش کلیدهای Agent
ssh-add -l

# انتقال کلید عمومی
ssh-copy-id [email protected]

# انتقال کلید اختصاصی
ssh-copy-id \
  -i ~/.ssh/id_ed25519_production.pub \
  [email protected]

# اتصال معمول
ssh [email protected]

# اتصال با کلید اختصاصی
ssh \
  -i ~/.ssh/id_ed25519_production \
  [email protected]

# عیب‌یابی اتصال
ssh -vvv [email protected]

# نمایش Fingerprint
ssh-keygen -lf ~/.ssh/id_ed25519.pub

# تغییر Passphrase
ssh-keygen -p -f ~/.ssh/id_ed25519

# بازیابی Public Key
ssh-keygen -y \
  -f ~/.ssh/id_ed25519 \
  > ~/.ssh/id_ed25519.pub

سوالات متداول درباره ساخت SSH Key

SSH Key چیست؟

SSH Key یک جفت کلید عمومی و خصوصی برای احراز هویت امن در SSH است. کلید خصوصی روی کامپیوتر کاربر باقی می‌ماند و کلید عمومی روی سرور قرار می‌گیرد.

چطور در مک SSH Key بسازیم؟

Terminal را باز کنید و دستور زیر را اجرا کنید:

ssh-keygen -t ed25519 -C "[email protected]"

برای استفاده ساده‌تر از Passphrase، کلید را با ssh-add --apple-use-keychain به Keychain اضافه کنید.

چطور در Linux SSH Key بسازیم؟

در Terminal این دستور را اجرا کنید:

ssh-keygen -t ed25519 -C "[email protected]"

سپس Public Key را با ssh-copy-id به سرور منتقل کنید.

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

برای سیستم‌های جدید، Ed25519 معمولاً انتخاب پیشنهادی است؛ زیرا کلید کوتاه‌تر، عملکرد مناسب و امنیت بالایی دارد. RSA ۴۰۹۶ برای سازگاری با سیستم‌ها و ابزارهای قدیمی مناسب است.

آیا Public Key محرمانه است؟

خیر. Public Key برای قرار گرفتن روی سرورها و سرویس‌ها ساخته شده است. فقط Private Key باید محرمانه بماند.

فایل Private Key کدام است؟

فایل بدون پسوند .pub کلید خصوصی است؛ برای مثال:

~/.ssh/id_ed25519

فایل Public Key کدام است؟

فایل دارای پسوند .pub کلید عمومی است:

~/.ssh/id_ed25519.pub

آیا می‌توان از یک SSH Key برای چند سرور استفاده کرد؟

بله، می‌توانید یک Public Key را روی چند سرور قرار دهید. بااین‌حال، در محیط‌های حساس بهتر است برای پروژه‌ها، سازمان‌ها یا نقش‌های متفاوت کلید جداگانه بسازید.

آیا SSH Key بدون Passphrase امن است؟

کلید بدون Passphrase همچنان از رمز حساب قوی‌تر است، اما اگر فایل Private Key سرقت شود، مانع اضافی برای استفاده از آن وجود ندارد. برای کلیدهای مدیریتی استفاده از Passphrase توصیه می‌شود.

ssh-agent چه کاری انجام می‌دهد؟

SSH Agent کلید رمزگشایی‌شده را موقتاً در حافظه نگه می‌دارد تا لازم نباشد Passphrase را در هر اتصال دوباره وارد کنید.

چرا SSH Key کار نمی‌کند؟

دلایل رایج شامل نام کاربری اشتباه، Permission نامناسب، نبود Public Key در authorized_keys، استفاده از کلید اشتباه، غیرفعال بودن Public Key Authentication یا مالکیت نادرست پوشه .ssh است.

چطور بفهمم SSH از کدام کلید استفاده می‌کند؟

ssh -vvv username@server

در خروجی عبارت Offering public key نشان می‌دهد کدام کلیدها امتحان شده‌اند.

چطور کلید عمومی را از کلید خصوصی بسازیم؟

ssh-keygen -y \
  -f ~/.ssh/id_ed25519 \
  > ~/.ssh/id_ed25519.pub

آیا بعد از ساخت SSH Key باید رمز سرور را غیرفعال کنیم؟

پس از اینکه ورود با کلید را در یک Session جدید کاملاً تست کردید، غیرفعال کردن Password Authentication می‌تواند امنیت سرور را افزایش دهد. قبل از این کار باید دسترسی کنسول اضطراری داشته باشید.

جمع‌بندی

ساخت SSH Key یکی از مهم‌ترین اقدامات برای افزایش امنیت دسترسی به سرور لینوکس است. در این روش، کلید خصوصی روی سیستم شخصی باقی می‌ماند و فقط Public Key در فایل authorized_keys سرور قرار می‌گیرد. سرور بدون دریافت Private Key یا رمز حساب، مالکیت کلید را بررسی می‌کند.

برای کلیدهای جدید در macOS و Linux، الگوریتم Ed25519 انتخاب مناسبی است. در صورت نیاز به سازگاری با تجهیزات یا نرم‌افزارهای قدیمی می‌توان از RSA ۴۰۹۶ استفاده کرد. همچنین باید پوشه .ssh مجوز ۷۰۰ و Private Key مجوز ۶۰۰ داشته باشد.

استفاده از Passphrase، SSH Agent، Keychain در macOS، فایل SSH Config و کلید جداگانه برای محیط Production، مدیریت اتصال‌ها را امن‌تر و ساده‌تر می‌کند. پس از تست کامل ورود با کلید نیز می‌توان Password Authentication و ورود مستقیم root را غیرفعال کرد.

اگر برای میزبانی سایت، اپلیکیشن یا سرویس‌های سازمانی به زیرساختی با دسترسی کامل SSH نیاز دارید، می‌توانید متناسب با موقعیت کاربران از VPS ایران، VPS آلمان یا سایر سرویس‌های سرور مجازی و اختصاصی استفاده کنید.

منابع پیشنهادی برای مطالعه بیشتر