یکی از رایجترین روشهای ورود به یک سرور لینوکسی، استفاده از Username و Password است:
ssh user@SERVER_IPاما روی سروری که مستقیماً از اینترنت در دسترس است، SSH معمولاً با تعداد زیادی تلاش خودکار برای حدس Username و Password روبهرو میشود.
یکی از روشهای مناسب برای کاهش این سطح حمله، استفاده از SSH Key Authentication و غیرفعال کردن ورود با Password است.
در این مدل:
Password Login ==> ✗
SSH Key ==> ✓یعنی حتی اگر شخصی Password کاربر را بداند، SSH Server آن را بهعنوان روش ورود قبول نمیکند و برای ورود باید Private Key معتبر در اختیار داشته باشد.
اما یک هشدار جدی وجود دارد:
تا زمانی که ورود با SSH Key را در یک Terminal جداگانه با موفقیت تست نکردهاید، Password Login را غیرفعال نکنید.
اگر Key اشتباه باشد و همزمان Password Authentication را هم ببندید، ممکن است دسترسی Remote خودتان به سرور را از دست بدهید.
در این آموزش روش امن انجام این کار را قدمبهقدم بررسی میکنیم.
Password Authentication در SSH چگونه کار میکند؟
OpenSSH از چند روش مختلف Authentication پشتیبانی میکند.
برای مثال:
Public Key
Password
Keyboard Interactive
GSSAPI
Host-basedوقتی Password Authentication فعال باشد، SSH Server میتواند Password مربوط به User را برای ورود بررسی کند.
Directive اصلی مرتبط با آن:
PasswordAuthenticationاست.
اگر مقدار آن:
PasswordAuthentication ==> yesباشد، Password Authentication مجاز است.
اگر:
PasswordAuthentication ==> noباشد، این روش غیرفعال میشود.
طبق مستندات رسمی OpenSSH، PasswordAuthentication دقیقاً تعیین میکند آیا روش Password برای Authentication مجاز باشد یا نه. (OpenSSH sshd_config)
چرا استفاده از SSH Key بهتر از اتکا به Password است؟
یک Password ممکن است:
ضعیف انتخاب شود
دوباره در سرویس دیگری استفاده شده باشد
لو برود
توسط Phishing سرقت شود
هدف Brute Force قرار بگیرد
در مقابل SSH Key Authentication از یک جفت کلید استفاده میکند:
Private Key + Public KeyPublic Key روی Server قرار میگیرد و Private Key روی دستگاه کاربر باقی میماند.
در نتیجه Server برای Login بهدنبال اثبات در اختیار داشتن Private Key متناظر است.
این یعنی غیرفعال کردن Password Login میتواند یکی از مسیرهای رایج حمله به SSH را حذف کند.
اما SSH Key هم باید درست مدیریت شود:
Private Key نباید منتشر شود
بهتر است Key شخصی Passphrase داشته باشد
Keyهای قدیمی باید از Server حذف شوند
دسترسی Userها باید محدود باشد
Backup امن از Keyها در صورت نیاز وجود داشته باشد
پس SSH Key جایگزین «مدیریت امنیت» نیست؛ فقط Authentication قویتری در اختیار ما قرار میدهد.
قبل از شروع: Session فعلی را نبندید
این مهمترین قانون مقاله است.
فرض کنید همین حالا با SSH داخل Server هستید:
ssh deploy@SERVER_IPاین Terminal را تا پایان کار باز نگه دارید.
یک Terminal دوم برای تست Login جدید باز کنید.
ساختار امن کار:
Session فعلی
↓
باز میماند
Configuration تغییر میکند
↓
Key Login تست میشود
Terminal دوم
↓
Login موفق؟
بله → ادامه
نه → اصلاح از Session قبلی
حواستون باشه :
اگر Provider VPS شما Web Console، VNC، Serial Console یا Recovery Console دارد، بهتر است قبل از تغییر تنظیمات حساس SSH مطمئن شوید به آن دسترسی دارید.
قدم اول: مطمئن شوید SSH Key واقعاً کار میکند
قبل از غیرفعال کردن Password باید ورود با Key را تست کنیم.
از کامپیوتر خودتان در Terminal دوم اجرا کنید:
ssh -i ~/.ssh/id_ed25519 user@SERVER_IPدر Windows PowerShell:
ssh -i "$env:USERPROFILE\.ssh\id_ed25519" user@SERVER_IPاگر SSH روی Port دیگری اجرا میشود:
ssh -p 2222 -i ~/.ssh/id_ed25519 user@SERVER_IPهدف این است که بتوانید بدون استفاده از Password حساب Server وارد شوید.
اگر Private Key شما Passphrase دارد، درخواست Passphrase خود Key طبیعی است و با Password Account روی Server فرق دارد.
چگونه مطمئن شویم SSH واقعاً از Public Key استفاده کرده است؟
برای تست دقیقتر میتوانید Password Authentication را فقط در Client همین اتصال غیرفعال کنید:
ssh \
-o PreferredAuthentications=publickey \
-o PasswordAuthentication=no \
-i ~/.ssh/id_ed25519 \
user@SERVER_IPاگر Login موفق شد، میدانیم Public Key Authentication واقعاً کار میکند.
برای Debug بیشتر:
ssh -vvv -i ~/.ssh/id_ed25519 user@SERVER_IPو در خروجی به دنبال خطوط مربوط به Public Key Authentication بگردید.
اگر هنوز SSH Key ندارید، ابتدا مقاله «آموزش ساخت SSH Key در ویندوز و اتصال امن به سرور لینوکس» را انجام دهید و بعد به این آموزش برگردید.
قدم دوم: Public Key Authentication را روی Server بررسی کنید
این را روی Server اجرا کنید:
sudo sshd -T | grep -i pubkeyauthenticationو خروجی مورد انتظار باید این شود:
pubkeyauthentication yesدر OpenSSH، PubkeyAuthentication مشخص میکند آیا Public Key Authentication مجاز است یا خیر و مقدار پیشفرض آن yes است. (OpenSSH)
همچنین میتوانید مسیر Keyهای مجاز را ببینید:
sudo sshd -T | grep -i authorizedkeysfileمعمولاً چیزی شبیه:
authorizedkeysfile .ssh/authorized_keys .ssh/authorized_keys2خواهید دید.
Public Key کاربر معمولاً در:
~/.ssh/authorized_keysقرار دارد.
قدم سوم: وضعیت فعلی Password Authentication را ببینید
قبل از تغییر، Configuration مؤثر Server را بررسی کنید:
sudo sshd -T | grep -Ei '^(pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication|authenticationmethods)'ممکن است خروجی چیزی شبیه این باشد:
pubkeyauthentication yes
passwordauthentication yes
kbdinteractiveauthentication no
authenticationmethods anyنکته مهم اینجاست:
فقط به چیزی که داخل
/etc/ssh/sshd_configنوشته شده اعتماد نکنید؛ خروجیsshd -Tنشان میدهد OpenSSH در نهایت چه Configuration مؤثری میبیند.
این موضوع مخصوصاً روی Cloud Serverها مهم است، چون Configuration ممکن است از چند فایل مختلف خوانده شود.
قدم چهارم: یک فایل جدا برای Hardening SSH بسازید
در Ubuntu و بسیاری از نصبهای جدید OpenSSH میتوان Configurationهای اختصاصی را داخل:
/etc/ssh/sshd_config.d/قرار داد.
بهجای تغییر مستقیم فایل اصلی میتوانیم یک Snippet بسازیم:
sudo nano /etc/ssh/sshd_config.d/00-disable-password-login.confو داخل آن بنویسیم:
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication noسپس فایل را Save کنید.
این Configuration سه کار انجام میدهد:
Public Key =============> ✓
Password =============> ✗
Keyboard Interactive ===> ✗چرا باید تنظیم KbdInteractiveAuthentication را هم بررسی کنیم؟
این نکته مهم است.
غیرفعال کردن:
PasswordAuthentication noروش Authentication با نام password را میبندد.
اما در بعضی سیستمها، PAM میتواند از مسیر:
keyboard-interactiveبرای Authentication تعاملی استفاده کند.
به همین دلیل اگر هدف شما واقعاً حذف Login مبتنی بر Password است، باید وضعیت:
KbdInteractiveAuthenticationرا هم بررسی کنید.
Cloud-init نیز در مستندات خودش هشدار میدهد که روی Distributionهایی که PAM و Keyboard Interactive Authentication فعال است، PasswordAuthentication no بهتنهایی ممکن است برای حذف تمام Authenticationهای مبتنی بر Password کافی نباشد.
یک استثنای مهم
اگر از مواردی مثل:
OTP
Duo
PAM MFA
Keyboard-interactive MFAاستفاده میکنید، کورکورانه:
KbdInteractiveAuthentication => noقرار ندهید.
چون ممکن است مکانیزم MFA شما دقیقاً به همین Authentication Method وابسته باشد.
در چنین زیرساختی باید سیاست Authentication مخصوص خودتان را طراحی کنید.
آیا باید UsePAM را روی no قرار دهیم؟
خیر؛ صرفاً برای غیرفعال کردن Password Login این کار را انجام ندهید.
ممکن است ببینید:
UsePAM yesو تصور کنید برای بستن Password باید آن را به:
UsePAM noتغییر دهید.
اما PAM فقط برای گرفتن Password استفاده نمیشود و میتواند در مدیریت Account و Session نیز نقش داشته باشد.
برای هدف این مقاله تمرکز ما روی:
PasswordAuthentication no
KbdInteractiveAuthentication noاست.
UsePAM را بدون شناخت دقیق Stack احراز هویت Server تغییر ندهید.
قدم پنجم: Configuration را قبل از اعمال تست کنید
قبل از Reload یا Restart سرویس SSH اجرا کنید:
sudo sshd -tاگر هیچ خروجیای مشاهده نکردید، Syntax Configuration معتبر است.
اگر خطا وجود داشته باشد، مثلاً:
Bad configuration optionابتدا همان مشکل را برطرف کنید.
هیچوقت با Config دارای خطا سرویس SSH را Restart نکنید.
Ubuntu نیز در مستندات رسمی OpenSSH درباره خطر Lockout در اثر Configuration اشتباه هشدار میدهد. (Ubuntu OpenSSH Server)
قدم ششم: Effective Configuration را دوباره بررسی کنید
قبل از اعمال نهایی:
sudo sshd -T | grep -Ei '^(pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication)'هدف ما چیزی شبیه این است:
pubkeyauthentication yes
passwordauthentication no
kbdinteractiveauthentication noاگر هنوز میبینید:
passwordauthentication yesیعنی Configuration دیگری روی نتیجه اثر گذاشته است.
در این شرایط تمام تعریفهای مرتبط را پیدا کنید:
sudo grep -RniE '^[[:space:]]*(PasswordAuthentication|KbdInteractiveAuthentication|PubkeyAuthentication)' \
/etc/ssh/sshd_config \
/etc/ssh/sshd_config.d/ممکن است فایل دیگری مثل Configuration ساختهشده توسط Cloud Image وجود داشته باشد.
نکته مهم درباره Cloud-init
بعضی VPSها و Cloud Imageها از cloud-init برای تنظیم اولیه SSH استفاده میکنند.
ممکن است فایلی شبیه:
/etc/ssh/sshd_config.d/50-cloud-init.confوجود داشته باشد.
و داخل آن مثلاً:
PasswordAuthentication yesیا:
PasswordAuthentication noقرار گرفته باشد.
به همین دلیل نام فایل پیشنهادی ما:
00-disable-password-login.confاست تا در Configurationهای معمول Ubuntu زودتر خوانده شود.
OpenSSH برای بسیاری از Keywordها اولین مقدار دریافتشده را استفاده میکند؛ بنابراین ترتیب فایلهای Configuration اهمیت دارد. (OpenSSH sshd_config)
اما دوباره تأکید میکنیم:
به نام فایل اعتماد نکنید؛ نتیجه واقعی را با
sshd -TVerify کنید.
قدم هفتم: Configuration جدید را اعمال کنید
در Ubuntu معمولاً میتوانید:
sudo systemctl reload sshرا اجرا کنید.
در صورت نیاز:
sudo systemctl restart sshنیز Configuration را دوباره اعمال میکند.
روی توزیعهای RHEL-based مانند AlmaLinux یا Rocky Linux نام Service معمولاً:
sudo systemctl reload sshdیا:
sudo systemctl restart sshdاست.
Session فعلی را همچنان نبندید.
قدم هشتم: ورود با SSH Key را در Terminal جدید تست کنید
از کامپیوتر خودتان یک Terminal کاملاً جدید باز کنید.
اجرا کنید:
ssh -i ~/.ssh/id_ed25519 user@SERVER_IPیا اگر Key در مسیر پیشفرض است:
ssh user@SERVER_IPLogin باید موفق شود.
بعد برای تست اینکه Server دیگر Password Authentication را ارائه نمیکند:
ssh \
-o PreferredAuthentications=password \
-o PubkeyAuthentication=no \
user@SERVER_IPاگر Password Login بهدرستی غیرفعال شده باشد، این روش نباید بتواند شما را وارد Server کند.
ممکن است خطایی مثل:
Permission denied (publickey).یا خروجی مشابهی ببینید که نشان دهد Password بهعنوان روش قابل استفاده پذیرفته نشده است.
قبل از بستن Session قدیمی این Checklist را انجام دهید
در Terminal جدید:
whoamiرا اجرا کنید.
سپس اگر User شما sudo دارد:
sudo whoamiباید:
rootبرگرداند.
یعنی هم:
SSH Key Login ✓و هم:
sudo Access ✓را Verify کردهاید.
فقط بعد از این تستها Session قبلی را ببندید.
آیا لازم است PermitRootLogin را هم تغییر دهیم؟
این یک سیاست جداگانه است.
وضعیت فعلی را ببینید:
sudo sshd -T | grep -i permitrootloginOpenSSH مقدار پیشفرض:
prohibit-passwordرا برای PermitRootLogin تعریف میکند؛ در این حالت Login مبتنی بر Password و Keyboard Interactive برای Root غیرفعال است، اما Public Key میتواند مجاز باشد. (OpenSSH)
اگر یک User مدیریتی با sudo دارید و اصلاً نمیخواهید Root مستقیم از طریق SSH Login کند، میتوانید در سیاست Hardening خود:
PermitRootLogin noرا هم در نظر بگیرید.
اما این تغییر را با موضوع اصلی مقاله قاطی نکنید.
ابتدا مطمئن شوید User معمولی شما:
SSH Key Login ✓
sudo ✓دارد.
آیا AuthenticationMethods publickey لازم است؟
در بیشتر Serverهای معمولی اگر اینها را دارید:
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication noعملاً Authenticationهای رایج مبتنی بر Password را حذف کردهاید.
اما OpenSSH گزینهای پیشرفتهتر به نام:
AuthenticationMethodsهم دارد.
مثلاً:
AuthenticationMethods publickeyیعنی برای Login باید Public Key Authentication موفق باشد.
این گزینه برای Policyهای سختگیرانهتر مفید است، اما پیشنهاد میکنم آن را فقط زمانی اضافه کنید که Configuration کامل Authentication Server را میشناسید.
Serverهای Enterprise ممکن است از:
GSSAPI
MFA
Certificate Authentication
PAMیا روشهای دیگری استفاده کنند.
بنابراین برای یک VPS معمولی، Configuration ساده و قابلفهم بهتر از Hardening پیچیدهای است که بعداً خودتان هم دلیلش را به یاد نمیآورید.
اگر بعد از تغییر هنوز Password کار میکند چه کنیم؟
اول Configuration مؤثر را ببینید:
sudo sshd -T | grep -Ei '^(passwordauthentication|kbdinteractiveauthentication|pubkeyauthentication)'اگر:
passwordauthentication yesمیبینید، Configuration شما Override نشده یا فایل دیگری زودتر مقدار را تعیین کرده است.
تمام فایلها را جستجو کنید:
sudo grep -RniE '^[[:space:]]*(PasswordAuthentication|KbdInteractiveAuthentication)' \
/etc/ssh/sshd_config \
/etc/ssh/sshd_config.d/بعد از هر تغییر:
sudo sshd -tو سپس:
sudo systemctl reload sshرا انجام دهید.
اگر بعد از تغییر Permission denied بگیریم چه؟
فرض کنید Terminal جدید:
Permission denied (publickey)نمایش میدهد.
Session قدیمی را نبندید.
از همان Session سالم بررسی کنید:
cat ~/.ssh/authorized_keysو Permissionها:
ls -ld ~/.ssh
ls -l ~/.ssh/authorized_keysیک تنظیم رایج:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keysاست.
سپس با:
ssh -vvv user@SERVER_IPبررسی کنید Client چه Keyی را ارائه میکند.
این همان جایی است که مقاله اختصاصی «رفع خطای Permission denied (publickey) در SSH» به کار میآید.
اگر خودمان را از Server Lock Out کردیم چه؟
اگر Session قبلی را بستهاید و هیچ SSH Key معتبری ندارید، باید از روش دسترسی خارج از SSH استفاده کنید.
بسته به Provider:
Web Console
Serial Console
VNC
Recovery Mode
Rescue Modeممکن است در دسترس باشد.
از Console وارد Server شوید و Configuration را اصلاح کنید.
مثلاً فایل:
/etc/ssh/sshd_config.d/00-disable-password-login.confرا موقتاً ویرایش کنید.
اگر نیاز اضطراری دارید Password Login را موقتاً برگردانید:
PasswordAuthentication yesسپس:
sudo sshd -t
sudo systemctl reload sshرا اجرا کنید.
بعد مشکل SSH Key را اصلاح کنید و دوباره Password Login را ببندید.
آیا غیرفعال کردن Password Login جلوی Brute Force را میگیرد؟
تا حد زیادی مسیر حمله مبتنی بر حدس Password را بیاثر میکند.
Bot هنوز میتواند به Port SSH متصل شود، اما Server Password Authentication را قبول نمیکند.
ممکن است همچنان Logهایی از:
Invalid user
Authentication attempt
Public key failureببینید.
پس هدف این نیست که Server دیگر هیچ Traffic مخربی نبیند.
هدف این است که یکی از روشهای رایج Authentication از دسترس مهاجم خارج شود.
Firewall، Rate Limiting، Fail2ban و محدودسازی Source IP همچنان میتوانند در معماری مناسب مفید باشند.
تغییر پورت SSH یا غیرفعال کردن Password؛ کدام مهمتر است؟
اگر بخواهیم بین این دو از نظر امنیت Authentication انتخاب کنیم:
غیرفعال کردن Password Login و استفاده صحیح از SSH Key اهمیت بیشتری از صرفاً تغییر Port دارد.
تغییر Port:
22 → 2222بیشتر میتواند Noise و Scanهای ساده را کاهش دهد.
اما:
PasswordAuthentication noیک Authentication Method را واقعاً حذف میکند.
بهترین رویکرد این است که اقدامات مختلف مکمل هم باشند:
SSH Key
+
Password Login Disabled
+
Firewall
+
Non-root Admin User
+
Updates
+
Monitoringچکلیست امن غیرفعال کردن Password Login
SSH Key معتبر ساختهام
Public Key روی User صحیح Server قرار دارد
Login با Key را در Terminal دوم تست کردهام
Session اصلی را باز نگه داشتهام
PubkeyAuthentication yesرا بررسی کردهامPasswordAuthentication noتنظیم شدهوضعیت
KbdInteractiveAuthenticationرا بررسی کردهامدر صورت استفاده از MFA، Keyboard Interactive را کورکورانه غیرفعال نکردهام
sshd -tبدون خطا اجرا شدهEffective Configuration را با
sshd -Tبررسی کردهامConfiguration Reload شده
Login جدید با SSH Key موفق است
Password Login دیگر کار نمیکند
User من دسترسی
sudoموردنیاز را داردبعد از همه این تستها Session قدیمی را بستهام
دستورات سریع برای Ubuntu
اگر SSH Key شما از قبل درست کار میکند، خلاصه فرایند به این شکل است.
ساخت Config:
sudo nano /etc/ssh/sshd_config.d/00-disable-password-login.confمحتوا:
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication noتست Syntax:
sudo sshd -tبررسی Configuration مؤثر:
sudo sshd -T | grep -Ei '^(pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication)'اعمال تنظیم:
sudo systemctl reload sshو در Terminal دوم:
ssh -i ~/.ssh/id_ed25519 user@SERVER_IPتست Password Authentication:
ssh \
-o PreferredAuthentications=password \
-o PubkeyAuthentication=no \
user@SERVER_IPفقط پس از موفقیت تست Key Login میتوانید Session قبلی را ببندید.
جمعبندی
برای غیرفعال کردن Password Login در SSH، مهمترین بخش خود Directive نیست؛ ترتیب انجام کار است.
اگر بدون تست SSH Key مستقیماً بنویسید:
PasswordAuthentication noو سرویس را Reload کنید، ممکن است راه ورود خودتان را ببندید.
روش امن:
Create / Install SSH Key
↓
Test Key Login
↓
Keep Old Session Open
↓
Disable Password
↓
sshd -t
↓
Verify with sshd -T
↓
Reload SSH
↓
Test New Session
↓
Verify sudo
↓
Close Old SessionConfiguration رایج برای Serverی که قرار است با Public Key وارد آن شوید:
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication noاست؛ البته اگر از MFA مبتنی بر Keyboard Interactive یا PAM استفاده میکنید باید Policy متناسب با همان زیرساخت را طراحی کنید.
و در نهایت:
SSH Key Only یک لایه مهم برای Hardening است، اما امنیت SSH فقط با یک Directive کامل نمیشود.
Firewall، Update، User Management، Monitoring و محدودکردن دسترسیها همچنان اهمیت دارند.
سوالات متداول
چگونه Password Login در SSH را غیرفعال کنیم؟
در Configuration OpenSSH مقدار:
PasswordAuthentication noرا تنظیم کنید، سپس Config را با sshd -t بررسی و سرویس را Reload کنید. قبل از این کار حتماً Login با SSH Key را در یک Terminal دیگر تست کنید.
آیا فقط PasswordAuthentication no کافی است؟
برای غیرفعال کردن روش password بله، اما اگر سیستم از Keyboard Interactive/PAM برای Authentication مبتنی بر Password استفاده کند باید KbdInteractiveAuthentication را هم بررسی کنید. در زیرساختهای دارای MFA نباید این گزینه را بدون بررسی غیرفعال کرد.
آیا باید UsePAM no قرار دهیم؟
خیر. برای غیرفعال کردن Password Login نیازی نیست UsePAM را کورکورانه غیرفعال کنید. PAM میتواند مسئولیتهای دیگری در Account و Session Management داشته باشد.
چطور مطمئن شویم Password Login واقعاً غیرفعال شده است؟
ابتدا:
sudo sshd -T | grep -Ei '^(passwordauthentication|kbdinteractiveauthentication)'را بررسی کنید. سپس از Client تلاش کنید فقط با Password وارد شوید:
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no user@SERVER_IPاین Login نباید موفق شود.
بعد از غیرفعال کردن Password، آیا sudo هنوز Password میخواهد؟
ممکن است بله. غیرفعال کردن PasswordAuthentication فقط روش ورود SSH را تغییر میدهد و بهصورت خودکار Password موردنیاز sudo را حذف نمیکند. این دو موضوع مستقل هستند.
آیا Root Login هم غیرفعال میشود؟
PasswordAuthentication no Password Login را بهصورت عمومی غیرفعال میکند، اما Policy مربوط به Root را باید با PermitRootLogin جداگانه بررسی کنید.
اگر بعد از تغییر دسترسی SSH قطع شد چه کنیم؟
اگر Session قبلی هنوز باز است، از همان Session Configuration را اصلاح کنید. در غیر این صورت باید از Console یا Recovery Access ارائهدهنده VPS استفاده کنید.




