Future ForgeFuture ForgeFuture ForgeFuture Forge
ServicesWorkPackagesFree toolsNotesAboutContact
Start
  1. Home
  2. /Notes
Future ForgeFuture Forge

Product engineering studio — design, build, and deploy software.

Discuss your project

Contact

hello@futureforge.ir09128464105
Future ForgeFuture Forge

Product engineering studio — design, build, and deploy software.

Services

Product engineeringFull-stack engineeringEngineering auditArchitecture consultingInfrastructure and deploymentAI in the product

Explore

WorkNotesFAQPackages

Free tools

Engineering auditArchitecture advisorProject estimatorPrompt tool

Company

AboutContactPrivacyTerms of use

Discuss your project

Describe the problem and the constraints. If there is a fit, we will schedule a conversation.

Discuss your project

Contact

hello@futureforge.ir09128464105
GitHubLinkedIn

© 2026 FutureForge. All rights reserved.

HomeServicesFree toolsStart
Operations

سخت‌سازی SSH روی سرور لینوکس: از مستندات OpenSSH و اوبونتو

راهنمای پژوهشی سخت‌سازی OpenSSH: PermitRootLogin، PasswordAuthentication، sshd_config.d، تست sshd -t و جلوگیری از قفل‌شدن.

SE
Soheil Ebrahimpour

Founder & product engineer

·Sep 20, 2026·6 min read
سخت‌سازی SSHsshd_configPasswordAuthenticationPermitRootLoginUbuntu OpenSSHsshd -TMaxAuthTries
ترمینال SSH و استیکی Disable Password و PermitRoot no

باز بودن پورت ۲۲ به اینترنت یعنی ربات‌ها همین حالا برای root و password حدس می‌زنند. سخت‌سازی SSH کاهش سطح حملهٔ همان دروازه‌ای است که خودتان برای مدیریت لازم دارید. این کار باید روی شواهد مستندات رسمی OpenSSH و راهنمای OpenSSH سرور اوبونتو باشد — نه کپی کور یک چک‌لیست وبلاگی که سرویس را از کار بیندازد.

اوبونتو هشدار می‌دهد: اگر تنها راه دسترسی SSH باشد و پیکربندی را خراب کنید، ممکن است قفل شوید؛ قبل از restart حتماً `sshd -t` و نشست دوم آزمایشی داشته باشید. همچنین به‌خاطر `Include /etc/ssh/sshd_config.d/*.conf` در ابتدای sshd_config، اولین مقدار برنده‌است — فایل cloud-init می‌تواند PasswordAuthentication yes را دوباره روشن کند اگر drop-in شما دیرتر لود شود.

چک‌لیست Key Auth No Root Fail2ban Port

پاسخ کوتاه

ابتدا ورود با کلید را پایدار کنید. سپس در یک فایل drop-in زود‌حرف (مثلاً `/etc/ssh/sshd_config.d/00-hardening.conf`) حداقل این‌ها را هدف بگیرید: `PermitRootLogin no`، `PasswordAuthentication no`، `KbdInteractiveAuthentication no`، `PubkeyAuthentication yes`. با `sshd -t` اعتبارسنجی، با `sshd -T` پیکربندی مؤثر را ببینید، سرویس را reload/restart کنید، از ترمینال دوم تست کنید، و تازه نشست اول را ببندید. پورت غیراستاندارد اختیاری و کم‌اثر در برابر مهاجم هدفمند است؛ کلید و بستن رمز اثر اصلی را دارند.

هیچ‌گاه تنها نشست SSH را قبل از اثبات ورود با تنظیمات جدید قطع نکنید.

پیش‌نیازها و ایمنی عملیاتی

  1. دسترسی console/سریال ابر یا کاربر دوم با کلید معتبر.
  2. بکاپ از پیکربندی: اوبونتو پیشنهاد کپی فقط‌خواندنی از sshd_config اصلی را می‌دهد.
  3. کلید ed25519 نصب‌شده و تست‌شده (مقالهٔ کلیدها).
  4. پنجرهٔ نگهداری کوتاه و همکار آگاه در صورت قفل.

bash

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.original sudo chmod a-w /etc/ssh/sshd_config.original sudo ls -la /etc/ssh/sshd_config.d/

مدل پیکربندی اوبونتو: Include و اولین مقدار

طبق مستندات رسمی اوبونتو، به‌طور پیش‌فرض خط Include برای `sshd_config.d/*.conf` بالای فایل اصلی است. OpenSSH برای بیشتر کلیدها اولین مقدار دیده‌شده را استفاده می‌کند؛ بنابراین تنظیمات داخل drop-in بر مقادیر بعدی فایل اصلی می‌چربد. ابرتصویرها اغلب `50-cloud-init.conf` با `PasswordAuthentication yes` دارند. اگر سخت‌سازی را در `99-hardening.conf` بگذارید ممکن است دیر برسد و اثر نکند؛ پیشوند `00-` معمولاً زودتر مرتب می‌شود.

bash

grep -n Include /etc/ssh/sshd_config sudo grep -Rni password /etc/ssh/sshd_config /etc/ssh/sshd_config.d/

ساخت drop-in سخت‌سازی

bash

sudo tee /etc/ssh/sshd_config.d/00-hardening.conf >/dev/null << 'EOF' # FutureForge hardening baseline — review before production PermitRootLogin no PasswordAuthentication no KbdInteractiveAuthentication no PubkeyAuthentication yes PermitEmptyPasswords no X11Forwarding no MaxAuthTries 3 LoginGraceTime 30 ClientAliveInterval 300 ClientAliveCountMax 2 EOF

توضیح بر اساس sshd_config(5):

  • PermitRootLogin no: ورود مستقیم root را می‌بندد؛ با کاربر عادی وارد شوید و sudo کنید. مقدار پیش‌فرض مدرن اغلب prohibit-password است؛ no سخت‌گیرانه‌تر است.
  • PasswordAuthentication no: مسیر رمز را می‌بندد تا بروت‌فورس چیزی برای حدس نداشته باشد.
  • KbdInteractiveAuthentication no: مسیر تعاملی صفحه‌کلید (جایگزین ChallengeResponseAuthentication قدیمی) را می‌بندد تا رمز از مسیر دوم برنگردد.
  • PubkeyAuthentication yes: اطمینان از روشن بودن کلید.
  • MaxAuthTries / LoginGraceTime: هزینهٔ تلاش ناموفق و زمان نشست ناتمام را کم می‌کند.
  • ClientAlive*: تشخیص کلاینت مرده از کانال رمزشده (متفاوت از TCPKeepAlive).

AllowUsers یا AllowGroups را فقط وقتی فهرست پایدار دارید اضافه کنید؛ اشتباه تایپی قفل می‌سازد.

bash

# مثال اختیاری — فقط پس از تأیید نام‌ها # AllowUsers deploy alice

اعتبارسنجی و مشاهدهٔ پیکربندی مؤثر

bash

sudo sshd -t sudo sshd -T | grep -Ei 'passwordauthentication|kbdinteractiveauthentication|permitrootlogin|pubkeyauthentication|maxauthtries'

`sshd -t` نحو را بدون اعمال کامل چک می‌کند (اوبونتو همین را قبل از restart توصیه می‌کند). `sshd -T` پیکربندی نهایی را چاپ می‌کند تا ببینید آیا cloud-init هنوز password را yes کرده یا نه.

اعمال و آزمایش بدون قفل شدن

bash

sudo systemctl reload ssh.service # یا در برخی نسخه‌ها: # sudo systemctl restart ssh.service

نشست فعلی را باز نگه دارید. از ماشین دیگر یا ترمینال دیگر:

bash

ssh -o PreferredAuthentications=publickey -o PasswordAuthentication=no user@server ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no user@server

انتظار: اولی وارد شود، دومی Permission denied. ورود root باید شکست بخورد. اگر کلید شکست خورد، از نشست اول تنظیمات را برگردانید.

bash

sudo journalctl -u ssh.service -e --no-pager | tail -n 40

بنر و افشای نسخه

اوبونتو نشان می‌دهد قبل از احراز هویت، بنر پروتکل ممکن است تکهٔ OS را لو دهد. با `DebianBanner no` در drop-in می‌توان افشای OS در آن بنر را کم کرد — امنیت عمیق نیست ولی سطح اطلاعات را کم می‌کند.

bash

echo 'DebianBanner no' | sudo tee -a /etc/ssh/sshd_config.d/00-hardening.conf sudo sshd -t && sudo systemctl reload ssh

پورت غیر۲۲، فایروال و fail2ban — مرز انتظار

عوض کردن Port اسکنرهای تنبل را کم می‌کند اما جایگزین احراز هویت قوی نیست. روی برخی نسخه‌های جدید اوبونتو با socket activation، پورت ممکن است از unit سوکت کنترل شود نه فقط از sshd_config — قبل از تغییر، مستند همان نسخه را بخوانید. فایروال (ufw/nftables) باید منبع‌های مدیریتی را محدود کند. fail2ban یا مشابه می‌تواند تکرار شکست را جریمه کند؛ با PerSourcePenalties در OpenSSHهای جدیدتر هم سازوکار جریمهٔ داخلی وجود دارد. هیچ‌کدام مجوز دادن password روی اینترنت را «درست» نمی‌کنند.

جدول اولویت اقدامات

اقداماثر امنیتیریسک عملیاتی
ورود فقط با کلیدبالامتوسط اگر بدون تست
PermitRootLogin noبالاکم اگر sudo آماده باشد
بستن password و kbd-interactiveبالابالا بدون کلید پشتیبان
AllowUsers محدودبالابالا در صورت غلط املایی
MaxAuthTries پایینمتوسطکم
پورت غیر۲۲کم در برابر هدفمندمتوسط (مستندسازی/اسکن)
DebianBanner noکم (کاهش لو رفتن)خیلی کم

آنچه این مقاله عمداً نمی‌گوید

  • دستور تخریبی یا دور زدن دسترسی سیستم دیگران.
  • تضمین امنیت مطلق؛ سخت‌سازی لازم است نه کافی (پچ، کاربر، sudo، شبکه).
  • کپی کور الگوریتم‌های cipher بدون فهم سازگاری کلاینت‌ها.

چک‌لیست پایانی

  • کلیدها برای همهٔ آدم‌های مجاز نصب و تست شده‌اند.
  • sshd -T نشان می‌دهد password و root مطابق سیاست‌اند.
  • ورود رمز در تست منفی شکست می‌خورد.
  • console ابر در نشانه‌های اضطراری در دسترس است.
  • تغییرات در کنترل پیکربندی/مستند تیم ثبت شده است.

خلاصه

سخت‌سازی SSH یعنی بستن مسیرهای حدس‌زدنی و محدود کردن هویت، با احترام به مدل Include اوبونتو و قاعدة اولین مقدار OpenSSH. drop-in زودهنگام، تست sshd -t/-T، و تأیید از نشست دوم سه ستون جلوگیری از قفل‌اند. بعد از این پایه، فایروال، به‌روزرسانی و مدیریت کلید سازمانی را جدی بگیرید.

سوالات متداول

چرا PasswordAuthentication no گذاشتم ولی هنوز رمز می‌پرسد؟

احتمالاً فایل دیگری زودتر yes کرده، یا KbdInteractiveAuthentication باز است، یا Match بلاک استثنا ساخته. `sshd -T` و محتویات sshd_config.d را ببینید.

reload کافی است یا restart؟

اغلب reload برای اعمال بسیاری تنظیمات کافی است؛ اگر شک دارید و نشست امن دارید، restart سرویس ssh طبق نام واحد توزیع (ssh.service در اوبونتو).

آیا باید Protocol 2 را صریح بنویسم؟

OpenSSHهای مدرن فقط SSH2 را پشتیبانی می‌کنند؛ تمرکز روی authentication و دسترسی مفیدتر از کلیدهای تاریخی است.

منابع و مراجع

  • Ubuntu Server documentation — OpenSSH server: https://documentation.ubuntu.com/server/how-to/security/openssh-server/
  • sshd_config(5) OpenBSD/OpenSSH: https://man.openbsd.org/sshd_config.5
  • OpenSSH manuals index: https://www.openssh.com/manual.html
  • sshd(8): https://man.openbsd.org/sshd.8
  • systemd service control (reload/restart context): https://www.freedesktop.org/software/systemd/man/latest/systemctl.html

Author

SE

Soheil Ebrahimpour is the founder of FutureForge. He works on product design, architecture, and getting custom software into production.

Related notes

Related notes

Categories

Related services

From note to project

If this topic is close to your product or system, we can talk about the real scope.

If you are unsure about architecture or the build path, we can talk about the project.

Describe the problem and the constraints. If there is a fit, we will schedule a conversation.

Soheil Ebrahimpour
Notes
Logging چیست؟ ثبت رویداد برای تشخیص و پاسخ به حادثه
تعیین اندازهٔ سرور: RAM، CPU و Storage بر اساس Workload
Docker در برابر Kubernetes؛ مقایسهٔ دقیق نه شعار
چرا همیشه به Kubernetes نیاز ندارید؟
Kubernetes چیست؟ اجرای مقاوم workloadهای کانتینری

Operations

Logging چیست؟ ثبت رویداد برای تشخیص و پاسخ به حادثه

Sep 20, 2026

Operations

تعیین اندازهٔ سرور: RAM، CPU و Storage بر اساس Workload

Sep 20, 2026

Operations

Docker در برابر Kubernetes؛ مقایسهٔ دقیق نه شعار

Sep 20, 2026

Operations

چرا همیشه به Kubernetes نیاز ندارید؟

Sep 20, 2026

Operations

Kubernetes چیست؟ اجرای مقاوم workloadهای کانتینری

Sep 20, 2026
All notes219
Software architecture13
Glossary37
Operations87
Product engineering74
Web guide8
Product engineering
Full-stack engineering
Engineering audit
Architecture consulting
Infrastructure and deployment
Discuss your project
Free tools
Discuss your project