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

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

پاسخ کوتاه
ابتدا ورود با کلید را پایدار کنید. سپس در یک فایل 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 را قبل از اثبات ورود با تنظیمات جدید قطع نکنید.
پیشنیازها و ایمنی عملیاتی
- دسترسی console/سریال ابر یا کاربر دوم با کلید معتبر.
- بکاپ از پیکربندی: اوبونتو پیشنهاد کپی فقطخواندنی از sshd_config اصلی را میدهد.
- کلید ed25519 نصبشده و تستشده (مقالهٔ کلیدها).
- پنجرهٔ نگهداری کوتاه و همکار آگاه در صورت قفل.
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
نویسنده
سهیل ابراهیمپور بنیانگذار FutureForge است. روی طراحی محصول، معماری و استقرار نرمافزار سفارشی کار میکند.
یادداشتهای مرتبط
اگر در انتخاب معماری یا مسیر توسعه مطمئن نیستید، میتوانید درباره پروژه صحبت کنیم.
مسئله و محدودیت را بنویسید. اگر تطابق داشته باشیم، برای گفتگو هماهنگ میکنیم.




