برای مدیریت یک سرور لینوکسی از راه دور، معمولاً از پروتکل 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 چگونه کار میکند؟
- تفاوت Public Key و Private Key
- چرا SSH Key از رمز عبور امنتر است؟
- تفاوت Ed25519 و RSA؛ کدام کلید بهتر است؟
- پیشنیازهای ساخت SSH Key
- بررسی کلیدهای SSH موجود
- ساخت کلید Ed25519 در macOS و Linux
- معنی گزینههای دستور ssh-keygen
- ساخت کلید RSA ۴۰۹۶ بیتی
- Passphrase کلید SSH چیست؟
- تنظیم Permission فایلهای SSH
- اضافه کردن کلید به SSH Agent در Linux
- ذخیره کلید SSH در Keychain مک
- انتقال Public Key به سرور
- انتقال دستی کلید عمومی
- تست ورود به سرور با SSH Key
- مدیریت اتصالها با فایل SSH Config
- مدیریت چند SSH Key
- غیرفعال کردن ورود با رمز عبور
- مشاهده، تغییر و بازیابی کلیدها
- ساخت کلید SSH سختافزاری
- رفع خطاهای رایج SSH Key
- بهترین روشهای امنیتی SSH Key
- دستورات خلاصه ساخت SSH Key
- سوالات متداول
- جمعبندی
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، کلید خصوصی شما به سرور ارسال نمیشود. فرایند احراز هویت بهصورت خلاصه چنین است:
- کلاینت SSH به سرور اعلام میکند یک Public Key مشخص در اختیار دارد.
- سرور بررسی میکند آیا آن Public Key در فایل
authorized_keysکاربر وجود دارد یا خیر. - کلاینت با کلید خصوصی خود دادهای را امضا میکند.
- سرور امضا را با Public Key ذخیرهشده بررسی میکند.
- اگر امضا معتبر باشد، دسترسی کاربر تأیید میشود.
در این فرایند، کلید خصوصی فقط روی دستگاه شما باقی میماند. به همین دلیل مهاجم نمیتواند صرفاً با شنود ارتباط SSH به کلید خصوصی دسترسی پیدا کند.
تفاوت Public Key و Private Key
| ویژگی | Private Key | Public Key |
|---|---|---|
| نمونه نام فایل | id_ed25519 | id_ed25519.pub |
| محل نگهداری | فقط روی سیستم شخصی | روی سرور مقصد |
| قابل اشتراکگذاری | هرگز | بله |
| Permission پیشنهادی | 600 | 644 |
| نقش | اثبات هویت و امضای رمزنگاریشده | بررسی امضای کلید خصوصی |
هشدار مهم: فایل بدون پسوند، مثل 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 هستند.
| ویژگی | Ed25519 | RSA |
|---|---|---|
| انتخاب پیشنهادی برای کلید جدید | بله | برای سازگاری با سیستمهای قدیمی |
| اندازه کلید | کوتاه و ثابت | معمولاً ۳۰۷۲ یا ۴۰۹۶ بیت |
| سرعت | سریع | کندتر از 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_ed25519Permission فایل را محدود کنید:
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'این دستور:
- محتوای Public Key را میخواند.
- با رمز حساب به سرور متصل میشود.
- پوشه
~/.sshرا در صورت نبود ایجاد میکند. - کلید را به انتهای
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 yesPermission فایل 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 yesSSH کلید اشتباه را انتخاب میکند
کلید موردنظر را مستقیم وارد کنید:
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_ed25519ssh-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 آلمان یا سایر سرویسهای سرور مجازی و اختصاصی استفاده کنید.
