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

چگونه SSH را امن کنیم؟ آموزش کامل امن‌سازی SSH در لینوکس از حذف Root Login تا SSH Key و Fail2Ban

چگونه SSH را امن کنیم؟ آموزش کامل امن‌سازی SSH در لینوکس از حذف Root Login تا SSH Key و Fail2Ban اگر یک سرور مجازی لینوکس دارید، یکی از اولین سرویس‌هایی که باید برای امنیت…

چگونه SSH را امن کنیم؟ آموزش کامل امن‌سازی SSH در لینوکس از حذف Root Login تا SSH Key و Fail2Ban
خلاصه سریع این آموزش

چگونه SSH را امن کنیم؟ آموزش کامل امن‌سازی SSH در لینوکس از حذف Root Login تا SSH Key و Fail2Ban اگر یک سرور مجازی لینوکس دارید، یکی از اولین سرویس‌هایی…

۳۰ دقیقه مطالعه ۰ دیدگاه ۲۵ شهریور ۱۴۰۵ آخرین به‌روزرسانی

فهرست مطالب

چگونه SSH را امن کنیم؟ آموزش کامل امن‌سازی SSH در لینوکس از حذف Root Login تا SSH Key و Fail2Ban

اگر یک سرور مجازی لینوکس دارید، یکی از اولین سرویس‌هایی که باید برای امنیت آن جدی بگیرید SSH است. تقریباً تمام مدیریت سرورهای لینوکسی از طریق SSH انجام می‌شود و به همین دلیل، اگر تنظیمات آن به شکل مناسبی انجام نشده باشد، می‌تواند یکی از نقاطی باشد که مهاجمان برای دسترسی به سرور بررسی می‌کنند.

در بسیاری از سرورهای تازه نصب‌شده، SSH با تنظیمات پیش‌فرض اجرا می‌شود؛ یعنی سرویس SSH روی پورت مشخصی در دسترس است، امکان ورود با نام کاربری و رمز عبور وجود دارد و در بعضی سیستم‌ها حتی ورود مستقیم کاربر root نیز امکان‌پذیر است.

این موضوع لزوماً به معنی ناامن بودن خود لینوکس نیست، اما باعث می‌شود سرور شما هدف مناسبی برای حملات خودکار، Password Spraying و Brute Force باشد.

در این آموزش قرار نیست فقط چند دستور را پشت سر هم اجرا کنیم. ابتدا وضعیت امنیتی سرور را بررسی می‌کنیم، سپس یک کاربر مدیریتی ایجاد می‌کنیم، ورود با SSH Key را راه‌اندازی می‌کنیم، دسترسی Root را محدود می‌کنیم، ورود با رمز عبور را در صورت مناسب بودن شرایط غیرفعال می‌کنیم، Fail2Ban را فعال می‌کنیم و در نهایت روش بررسی کاربران ناشناس، کلیدهای SSH مشکوک و لاگ‌های ورود را یاد می‌گیریم.

نکته مهم: این مقاله برای سرورهای مجازی لینوکس نوشته شده است و فرض می‌کند به SSH و همچنین کنسول یا VNC سرور دسترسی دارید. داشتن دسترسی کنسول بسیار مهم است؛ چون اگر در هنگام تغییر تنظیمات SSH اشتباهی رخ دهد، می‌توانید از طریق کنسول وارد سرور شوید و تنظیمات را اصلاح کنید.


SSH چیست و چرا باید آن را امن کنیم؟

SSH مخفف Secure Shell است و یکی از مهم‌ترین روش‌های مدیریت سیستم‌های لینوکسی از راه دور محسوب می‌شود.

با SSH می‌توانید کارهایی مانند موارد زیر را انجام دهید:

  • ورود به سرور
  • اجرای دستورات لینوکس
  • نصب و حذف نرم‌افزار
  • مدیریت سرویس‌ها
  • انتقال فایل
  • مدیریت کاربران
  • مدیریت فایروال
  • مشاهده لاگ‌ها
  • مدیریت سرویس‌های وب
  • مدیریت دیتابیس
  • انجام عملیات مدیریتی با سطح دسترسی Root

OpenSSH امکان احراز هویت با روش‌هایی مانند رمز عبور و کلیدهای عمومی/خصوصی را فراهم می‌کند و فایل اصلی تنظیمات سرور معمولاً /etc/ssh/sshd_config است؛ البته در توزیع‌های جدید ممکن است تنظیمات اضافی از مسیر /etc/ssh/sshd_config.d/ نیز خوانده شوند.

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


آیا باز بودن پورت SSH به معنی هک شدن سرور است؟

خیر.

باز بودن پورت SSH به خودی خود نشانه هک شدن سرور نیست.

اگر یک سرور مجازی برای مدیریت از راه دور استفاده می‌شود، طبیعی است که SSH در شبکه قابل دسترسی باشد.

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

  • رمز عبور ضعیف باشد.
  • ورود مستقیم Root فعال باشد.
  • ورود با Password بدون محدودیت در اینترنت باز باشد.
  • نرم‌افزارهای سیستم قدیمی باشند.
  • کلیدهای SSH ناشناس در سیستم وجود داشته باشند.
  • کاربران ناشناس یا غیرضروری ایجاد شده باشند.
  • سرویس‌های غیرضروری روی اینترنت باز باشند.
  • لاگ‌های ورود بررسی نشوند.
  • دسترسی کاربران بیش از نیازشان باشد.

بنابراین هدف ما این نیست که SSH را کورکورانه خاموش کنیم؛ هدف این است که مسیر مدیریت سرور را محدود و قابل کنترل کنیم.


قبل از شروع امن‌سازی SSH چه چیزهایی لازم داریم؟

قبل از اجرای دستورات این آموزش بهتر است موارد زیر را در اختیار داشته باشید:

  1. IP سرور مجازی
  2. نام کاربری فعلی SSH
  3. رمز عبور فعلی
  4. دسترسی SSH
  5. دسترسی Console یا VNC
  6. دسترسی Root یا کاربری که بتواند sudo اجرا کند
  7. یک کامپیوتر برای ساخت SSH Key

اگر ارائه‌دهنده سرور مجازی شما امکان Console یا VNC در پنل سرویس ارائه می‌کند، حتماً مطمئن شوید که می‌توانید از آن استفاده کنید.

این موضوع بسیار مهم است.

فرض کنید دستور زیر را اجرا کنید:

PermitRootLogin no

اما هنوز کاربر دیگری برای ورود ایجاد نکرده باشید.

اگر نشست SSH فعلی قطع شود، ممکن است دیگر نتوانید از راه دور وارد سرور شوید.

وجود Console یا VNC در چنین شرایطی می‌تواند نجات‌دهنده باشد.


مهم‌ترین قانون: قبل از تغییر SSH خودتان را قفل نکنید!

یکی از مهم‌ترین اصول Hardening این است:

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

برای مثال اگر الان با root وارد سرور شده‌اید، ابتدا یک کاربر مدیریتی بسازید، SSH Key را برای او تنظیم کنید و در یک پنجره ترمینال جدید ورود با آن کاربر را آزمایش کنید.

بعد از اینکه مطمئن شدید ورود جدید کار می‌کند، سراغ غیرفعال کردن Root Login بروید.


مرحله اول: تشخیص نوع لینوکس

قبل از اجرای دستورات باید بدانیم روی چه توزیعی هستیم.

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

cat /etc/os-release

خروجی ممکن است چیزی شبیه این باشد:

NAME="Ubuntu"
VERSION="24.04 LTS"

یا:

NAME="Debian GNU/Linux"
VERSION="13"

یا:

NAME="AlmaLinux"
VERSION="9"

یا:

NAME="Rocky Linux"
VERSION="9"

یا:

NAME="CentOS Stream"

در ادامه هر جا تفاوتی بین Debian/Ubuntu و RHEL/AlmaLinux/Rocky/CentOS وجود داشته باشد، دستور مناسب همان خانواده را معرفی می‌کنیم.


مرحله دوم: بررسی وضعیت فعلی SSH

ابتدا ببینید سرویس SSH در چه وضعیتی قرار دارد.

در Ubuntu و Debian معمولاً:

systemctl status ssh

در AlmaLinux، Rocky، RHEL و CentOS معمولاً:

systemctl status sshd

اگر سرویس فعال باشد، چیزی شبیه این خواهید دید:

Active: active (running)

فایل تنظیمات SSH کجاست؟

فایل اصلی تنظیمات SSH معمولاً:

/etc/ssh/sshd_config

است.

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

/etc/ssh/sshd_config.d/

برای همین اگر تنظیمی را در sshd_config پیدا نکردید، حتماً فایل‌های داخل این پوشه را هم بررسی کنید.

در Ubuntu نیز مستندات رسمی استفاده از sshd_config.d را در کنار فایل اصلی پیکربندی توضیح می‌دهد.


قبل از تغییر تنظیمات SSH از فایل پشتیبان بگیرید

این کار ساده است اما در مواقع خطا بسیار مفید خواهد بود.

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup

اگر Root هستید:

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup

اکنون یک نسخه از تنظیمات فعلی دارید.


مرحله سوم: بررسی تنظیمات واقعی SSH

گاهی اوقات فقط نگاه کردن به /etc/ssh/sshd_config کافی نیست؛ زیرا ممکن است تنظیمات دیگری از فایل‌های Include روی نتیجه نهایی تأثیر بگذارند.

برای مشاهده تنظیمات مؤثر SSH می‌توانید از:

sshd -T

استفاده کنید.

برای بررسی چند گزینه مهم:

sshd -T | grep -E 'permitrootlogin|passwordauthentication|pubkeyauthentication|port'

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

port 22
permitrootlogin yes
passwordauthentication yes
pubkeyauthentication yes

این یعنی SSH در حال حاضر اجازه ورود Root و احراز هویت با Password را می‌دهد.


مرحله چهارم: ایجاد یک کاربر مدیریتی جدید

اگر اکنون با Root وارد شده‌اید، بهتر است یک حساب مدیریتی جداگانه داشته باشید.

نام کاربر می‌تواند مثلاً:

admin

باشد.

Ubuntu و Debian

adduser admin

در ادامه لینوکس از شما رمز عبور می‌خواهد.

سپس کاربر را به گروه sudo اضافه کنید:

usermod -aG sudo admin

برای بررسی:

id admin

ساخت کاربر در AlmaLinux، Rocky، RHEL و CentOS

ابتدا:

useradd admin

سپس رمز عبور:

passwd admin

و برای اضافه کردن دسترسی مدیریتی:

usermod -aG wheel admin

در سیستم‌های خانواده RHEL معمولاً گروه wheel برای دسترسی sudo استفاده می‌شود.


آیا بهتر است نام کاربر را admin بگذاریم؟

ضرورتی ندارد.

می‌توانید نامی مانند:

sysadmin
serveradmin
operator

انتخاب کنید.

اما نباید تصور کنید تغییر نام root یا انتخاب یک نام عجیب به تنهایی امنیت SSH را بالا می‌برد.

امنیت اصلی از ترکیب چند لایه ایجاد می‌شود:

  • SSH Key
  • غیرفعال کردن Root Login
  • محدود کردن کاربران
  • رمز عبور مناسب
  • Fail2Ban
  • Firewall
  • به‌روزرسانی سیستم
  • بررسی لاگ‌ها
  • کم کردن سرویس‌های غیرضروری

مرحله پنجم: ساخت SSH Key

یکی از مهم‌ترین بخش‌های این آموزش همین قسمت است.

در SSH Key به جای اینکه صرفاً به یک رمز عبور متکی باشیم، از یک جفت کلید استفاده می‌کنیم:

  • Private Key
  • Public Key

کلید خصوصی باید فقط نزد شما باقی بماند.

کلید عمومی روی سرور قرار می‌گیرد.

OpenSSH از روش‌های مختلف کلید پشتیبانی می‌کند و مستندات رسمی Ubuntu استفاده از Ed25519 را به دلیل اندازه کوتاه‌تر کلید و هزینه محاسباتی کمتر توصیه می‌کند؛ RSA با اندازه 4096 بیت نیز به عنوان گزینه جایگزین مطرح شده است.


ساخت SSH Key در ویندوز

اگر روی ویندوز 10 یا 11 هستید، در بسیاری از سیستم‌ها می‌توانید PowerShell یا Windows Terminal را باز کنید.

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

ssh-keygen -t ed25519

سپس چیزی شبیه این خواهید دید:

Enter file in which to save the key:

اگر مسیر پیش‌فرض مناسب است، Enter بزنید.

بعد از آن:

Enter passphrase:

از شما یک Passphrase می‌خواهد.

پیشنهاد می‌شود برای Private Key یک Passphrase مناسب تعیین کنید.


تفاوت Password و Passphrase چیست؟

Password معمولاً برای ورود به حساب کاربری استفاده می‌شود.

Passphrase از کلید خصوصی شما محافظت می‌کند.

فرض کنید Private Key شما به هر دلیلی از کامپیوترتان کپی شود.

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

اما اگر Private Key با Passphrase محافظت شده باشد، یک لایه امنیتی دیگر نیز وجود دارد.

بنابراین:

Private Key را مانند رمز عبور بسیار حساس در نظر بگیرید و آن را در اختیار دیگران قرار ندهید.


فایل‌های SSH Key کجا ذخیره می‌شوند؟

در ویندوز معمولاً چیزی شبیه:

C:\Users\USERNAME\.ssh\

خواهید داشت.

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

id_ed25519
id_ed25519.pub

فایل بدون .pub کلید خصوصی است.

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

بسیار مهم

این فایل را هرگز عمومی نکنید:

id_ed25519

اما محتوای:

id_ed25519.pub

کلید عمومی است و برای قرار گرفتن روی سرور استفاده می‌شود.


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

اگر روی سیستم شما ssh-copy-id وجود داشته باشد، می‌توانید از آن استفاده کنید:

ssh-copy-id admin@SERVER-IP

اما در ویندوز همیشه این ابزار در دسترس نیست.

در چنین شرایطی می‌توانیم Public Key را به صورت دستی روی سرور قرار دهیم.


ساخت پوشه SSH برای کاربر

ابتدا با کاربر جدید وارد سرور شوید یا از Root این دستورات را اجرا کنید.

mkdir -p /home/admin/.ssh

سپس:

chmod 700 /home/admin/.ssh

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

touch /home/admin/.ssh/authorized_keys

و:

chmod 600 /home/admin/.ssh/authorized_keys

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

chown -R admin:admin /home/admin/.ssh

اکنون محتوای فایل:

id_ed25519.pub

را در:

/home/admin/.ssh/authorized_keys

قرار دهید.

برای مثال:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI............. user@computer

کلید عمومی معمولاً در یک خط قرار می‌گیرد.


چرا Permission های SSH مهم هستند؟

اگر دسترسی فایل‌های SSH اشتباه باشد، OpenSSH ممکن است کلید را قبول نکند.

برای مثال:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

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

Ubuntu نیز در مستندات خود روی بررسی Permission فایل authorized_keys تأکید کرده است.


مرحله هفتم: تست ورود با SSH Key

این مرحله را جدی بگیرید.

هنوز Password Authentication را غیرفعال نکنید.

یک پنجره ترمینال جدید باز کنید و با کاربر جدید وارد شوید:

ssh admin@SERVER-IP

اگر همه چیز درست باشد، سیستم باید از SSH Key استفاده کند.

در صورت نیاز می‌توانید کلید مشخصی را معرفی کنید:

ssh -i ~/.ssh/id_ed25519 admin@SERVER-IP

در ویندوز مسیر ممکن است متفاوت باشد.


اگر SSH Key کار نکرد چه کنیم؟

فعلاً تنظیمات قبلی SSH را تغییر ندهید.

اول لاگ SSH را بررسی کنید.

در Ubuntu و Debian:

sudo journalctl -u ssh -n 50

در سیستم‌های RHEL:

sudo journalctl -u sshd -n 50

همچنین می‌توانید وضعیت Permission را بررسی کنید:

ls -la /home/admin/.ssh/

باید چیزی شبیه این داشته باشید:

drwx------ admin admin .ssh
-rw------- admin admin authorized_keys

اگر مالکیت اشتباه است:

chown -R admin:admin /home/admin/.ssh

مرحله هشتم: غیرفعال کردن ورود مستقیم Root

وقتی مطمئن شدید کاربر جدید با SSH Key می‌تواند وارد سرور شود، می‌توانیم Root Login را محدود کنیم.

فایل:

/etc/ssh/sshd_config

را باز کنید.

مثلاً با nano:

nano /etc/ssh/sshd_config

به دنبال:

PermitRootLogin

بگردید.

اگر وجود ندارد، می‌توانید اضافه کنید:

PermitRootLogin no

با این تنظیم، ورود مستقیم Root از طریق SSH غیرفعال می‌شود.

گزینه PermitRootLogin مشخص می‌کند که آیا حساب Root می‌تواند از طریق SSH وارد شود یا خیر. مقدار no ورود Root را از طریق SSH ممنوع می‌کند.


آیا بعد از PermitRootLogin no دسترسی Root کاملاً از بین می‌رود؟

خیر.

این نکته برای کاربران تازه‌کار مهم است.

وقتی می‌نویسیم:

PermitRootLogin no

منظور این است که ورود مستقیم Root از طریق SSH ممنوع می‌شود.

اگر کاربر admin دسترسی sudo داشته باشد، می‌تواند پس از ورود اجرا کند:

sudo -i

و در صورت داشتن مجوز مناسب وارد محیط Root شود.

بنابراین ساختار بهتر این است:

SSH
 ↓
admin
 ↓
sudo
 ↓
root

به جای:

SSH
 ↓
root

مرحله نهم: غیرفعال کردن ورود با Password

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

در:

/etc/ssh/sshd_config

قرار دهید:

PasswordAuthentication no

همچنین:

PubkeyAuthentication yes

را فعال نگه دارید.

در مستندات Debian نیز استفاده از SSH Key و غیرفعال کردن Password Authentication به عنوان یکی از روش‌های Hardening SSH مطرح شده است.

Red Hat نیز در مستندات خود نمونه‌ای از تنظیم SSH با:

PermitRootLogin: no
PasswordAuthentication: no

ارائه می‌کند.


یک هشدار بسیار مهم قبل از PasswordAuthentication no

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

PasswordAuthentication no

و SSH Key شما درست کار نکند، ممکن است دیگر نتوانید با رمز عبور وارد شوید.

بنابراین قبل از اعمال این تغییر:

  1. اتصال SSH فعلی را باز نگه دارید.
  2. Console یا VNC را باز نگه دارید.
  3. از یک پنجره جدید ورود با SSH Key را آزمایش کنید.
  4. مطمئن شوید کاربر جدید sudo دارد.
  5. سپس Password Authentication را غیرفعال کنید.

مرحله دهم: تست صحت تنظیمات SSH قبل از Restart

این یکی از مهم‌ترین مراحل مقاله است.

قبل از Restart یا Reload کردن SSH، تنظیمات را بررسی کنید.

sshd -t

اگر هیچ خروجی نمایش داده نشد، معمولاً یعنی Syntax فایل تنظیمات مشکلی ندارد.

اما اگر خطایی دیدید، هنوز SSH را Restart نکنید.

ابتدا خطا را اصلاح کنید.


Reload یا Restart؟

برای اعمال تنظیمات SSH معمولاً بهتر است ابتدا از Reload استفاده کنید:

Ubuntu/Debian:

systemctl reload ssh

RHEL/AlmaLinux/Rocky/CentOS:

systemctl reload sshd

در صورت نیاز می‌توان از Restart نیز استفاده کرد، اما Reload در بسیاری از تغییرات تنظیماتی، بدون قطع کردن Sessionهای موجود مناسب‌تر است.


مرحله یازدهم: بررسی پورت SSH

پورت پیش‌فرض SSH معمولاً:

22

است.

برای مشاهده پورت در تنظیمات:

sshd -T | grep '^port'

مثلاً:

port 22

آیا تغییر پورت SSH امنیت را زیاد می‌کند؟

تغییر پورت می‌تواند حجم اسکن‌ها و تلاش‌های خودکار روی پورت استاندارد را کاهش دهد، اما نباید آن را جایگزین روش‌های امنیتی اصلی بدانیم.

یعنی این کار:

22 → 2222

به تنهایی سرور را امن نمی‌کند.

اگر:

PasswordAuthentication yes
PermitRootLogin yes

باشد، تغییر پورت مشکل اصلی را حل نکرده است.

امنیت واقعی باید بر اساس احراز هویت قوی، محدود کردن کاربران، Firewall، به‌روزرسانی و مانیتورینگ انجام شود.


اگر خواستید پورت SSH را تغییر دهید

مثلاً:

Port 2222

را در تنظیمات قرار دهید.

اما یک نکته بسیار مهم وجود دارد:

اگر Firewall دارید، ابتدا مطمئن شوید پورت جدید اجازه عبور دارد.

همچنین اگر از سرویس VPS استفاده می‌کنید، ممکن است Firewall در دو سطح وجود داشته باشد:

Firewall داخل Linux
+
Firewall سمت پنل/شبکه ارائه‌دهنده VPS

بنابراین تغییر پورت بدون توجه به Firewall می‌تواند باعث قطع دسترسی شود.


مرحله دوازدهم: بررسی کاربران لینوکس

حالا که SSH را تا حد زیادی امن کرده‌ایم، باید بررسی کنیم چه حساب‌های کاربری روی سیستم وجود دارند.

دستور:

cat /etc/passwd

فهرست کاربران را نمایش می‌دهد.

اما همه کاربران موجود در /etc/passwd انسان نیستند.

لینوکس برای سرویس‌ها نیز حساب‌هایی مانند:

www-data
mysql
nginx
daemon
nobody

دارد.

بنابراین دیدن تعداد زیادی User لزوماً به معنی هک شدن نیست.


چگونه کاربران دارای Shell را پیدا کنیم؟

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

grep -E '/bin/(bash|sh|zsh)$' /etc/passwd

استفاده کرد.

این دستور کمک می‌کند حساب‌هایی را که Shell تعاملی دارند راحت‌تر ببینید.

مثلاً:

root:x:0:0:root:/root:/bin/bash
admin:x:1000:1000::/home/admin:/bin/bash

حالا سؤال مهم این است:

آیا همه این کاربران را می‌شناسید؟

اگر کاربری را نمی‌شناسید، بلافاصله آن را حذف نکنید.

ابتدا بررسی کنید چرا ایجاد شده است.

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


بررسی UID کاربران

در لینوکس UID صفر اهمیت ویژه‌ای دارد.

کاربری که UID آن 0 باشد عملاً سطح دسترسی Root دارد.

برای بررسی:

awk -F: '$3 == 0 {print $1}' /etc/passwd

در حالت عادی انتظار دارید:

root

را ببینید.

اگر User دیگری با UID صفر وجود داشت، باید با دقت بسیار بیشتری بررسی شود.


بررسی گروه‌های مدیریتی

در Ubuntu و Debian:

getent group sudo

در AlmaLinux، Rocky، RHEL و CentOS:

getent group wheel

بررسی کنید چه کاربرانی دسترسی مدیریتی دارند.

هر کاربری که بتواند:

sudo

اجرا کند، باید برای شما شناخته‌شده و ضروری باشد.


بررسی کلیدهای SSH کاربران

یکی از مهم‌ترین قسمت‌های بررسی امنیتی همین بخش است.

برای کاربر Root:

cat /root/.ssh/authorized_keys

برای کاربر admin:

cat /home/admin/.ssh/authorized_keys

اگر کاربران دیگری وجود دارند، مسیر Home آنها را نیز بررسی کنید.

مثلاً:

find /home -name authorized_keys -type f -print

اگر یک کلید ناشناس پیدا کردید، فوراً آن را پاک نکنید.

ابتدا بررسی کنید:

  • متعلق به چه کاربری است؟
  • چه زمانی ایجاد شده؟
  • آیا یکی از اعضای تیم آن را اضافه کرده؟
  • آیا مربوط به پنل یا نرم‌افزار خاصی است؟
  • آیا اخیراً کسی برای مدیریت سرور کلید اضافه کرده است؟

اگر مطمئن شدید کلید متعلق به فرد یا سرویس مجاز نیست، آن را غیرفعال یا حذف کنید و سپس علت ایجاد آن را بررسی کنید.


آیا تغییر رمز Root یعنی سرور امن شده است؟

خیر.

این یک اشتباه رایج است.

فرض کنید متوجه شدید رمز Root احتمالاً لو رفته و آن را تغییر داده‌اید.

تغییر رمز کار درستی است، اما اگر فرد دیگری قبلاً روی سرور:

  • SSH Key اضافه کرده باشد،
  • کاربر جدید ساخته باشد،
  • Cron Job ایجاد کرده باشد،
  • سرویس مخفی اجرا کرده باشد،
  • Script Startup اضافه کرده باشد،
  • یا Backdoor ایجاد کرده باشد،

تغییر رمز به تنهایی مشکل را حل نمی‌کند.

به همین دلیل اگر احتمال می‌دهید رمز قبلی در اختیار فرد دیگری قرار گرفته، باید فرض کنید احتمال دسترسی غیرمجاز وجود داشته و سرور را بررسی کنید.


اگر فکر می‌کنیم سرور هک شده چه کار کنیم؟

اول از همه وحشت نکنید.

همچنین بدون بررسی، فایل‌ها و لاگ‌ها را پاک نکنید.

اگر احتمال جدی نفوذ وجود دارد:

  1. دسترسی غیرضروری را محدود کنید.
  2. حساب‌های ناشناس را بررسی کنید.
  3. کلیدهای SSH را بررسی کنید.
  4. Login Log ها را بررسی کنید.
  5. Processهای مشکوک را بررسی کنید.
  6. Cron Jobها را بررسی کنید.
  7. سرویس‌های جدید را بررسی کنید.
  8. بسته‌های سیستم را بررسی و به‌روزرسانی کنید.
  9. رمزهای حساس را تغییر دهید.
  10. در صورت اطمینان از Compromise، نصب مجدد سیستم‌عامل را به عنوان گزینه جدی در نظر بگیرید.

اگر سرور اطلاعات مهمی دارد، قبل از پاک کردن شواهد بهتر است از متخصص امنیت کمک بگیرید.


مرحله سیزدهم: بررسی Login های موفق و ناموفق

در Ubuntu و Debian معمولاً می‌توانید از:

last

استفاده کنید.

برای مشاهده تلاش‌های ناموفق:

lastb

ممکن است خروجی شامل IPهایی مانند:

root     ssh:notty    192.0.2.10
admin    pts/0        198.51.100.20

باشد.


بررسی لاگ SSH با Journalctl

در سیستم‌های جدید که از systemd استفاده می‌کنند:

Ubuntu/Debian:

journalctl -u ssh

RHEL/AlmaLinux/Rocky:

journalctl -u sshd

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

journalctl -u ssh --since "24 hours ago"

یا:

journalctl -u sshd --since "24 hours ago"

در Debian و Ubuntu لاگ SSH کجاست؟

بسته به تنظیمات سیستم، اطلاعات احراز هویت معمولاً در:

/var/log/auth.log

قرار می‌گیرد.

برای مثال:

grep ssh /var/log/auth.log

و برای مشاهده تلاش‌های ناموفق:

grep "Failed password" /var/log/auth.log

در RHEL، AlmaLinux و Rocky لاگ‌ها کجا هستند؟

در سیستم‌های خانواده RHEL معمولاً می‌توانید از:

journalctl -u sshd

استفاده کنید.

در برخی سیستم‌ها نیز اطلاعات احراز هویت در:

/var/log/secure

وجود دارد.

مثلاً:

grep sshd /var/log/secure

Failed password به معنی هک شدن است؟

خیر.

اگر چنین چیزی مشاهده کردید:

Failed password for root from 203.0.113.50

این فقط نشان می‌دهد یک تلاش ناموفق برای ورود انجام شده است.

سرورهای متصل به اینترنت دائماً توسط Botها و Scannerها بررسی می‌شوند.

چیزی که باید جدی‌تر بررسی شود:

Accepted password
Accepted publickey

برای IP یا کاربری است که آن را نمی‌شناسید.


چگونه Login موفق را پیدا کنیم؟

برای SSH می‌توانید از:

grep "Accepted" /var/log/auth.log

در Ubuntu/Debian استفاده کنید.

در سیستم‌های RHEL:

grep "Accepted" /var/log/secure

یا:

journalctl -u sshd | grep "Accepted"

اگر مثلاً می‌بینید:

Accepted publickey for admin from 198.51.100.10

باید بررسی کنید آیا IP مربوط به خودتان است یا خیر.


اگر IP ناشناخته بود چه؟

ناشناخته بودن IP به تنهایی اثبات نفوذ نیست.

ممکن است:

  • IP اینترنت شما تغییر کرده باشد.
  • از VPN استفاده کرده باشید.
  • از شبکه شرکت وارد شده باشید.
  • از یک سرور واسط استفاده کرده باشید.
  • ISP شما IP دیگری اختصاص داده باشد.

اما اگر Login موفقی را مشاهده کردید که واقعاً متعلق به شما یا تیم شما نیست، موضوع باید جدی بررسی شود.


مرحله چهاردهم: بررسی Session های فعلی

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

who

یا:

w

می‌توانید استفاده کنید.

مثلاً:

USER     TTY      FROM
admin    pts/0    198.51.100.20

اگر Session ناشناسی مشاهده کردید، ابتدا بررسی کنید متعلق به چه کسی است.


بررسی Process های در حال اجرا

برای مشاهده Processها:

ps aux

یا:

top

و در سیستم‌هایی که نصب شده باشد:

htop

اگر Process ناشناسی با مصرف غیرطبیعی CPU یا RAM مشاهده کردید، بدون بررسی آن را Kill نکنید.

نام Process، PID، مسیر فایل و کاربری که Process را اجرا کرده بررسی کنید.


پیدا کردن مسیر یک Process

فرض کنید PID برابر:

1234

است.

می‌توانید بزنید:

readlink -f /proc/1234/exe

و:

ps -fp 1234

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


مرحله پانزدهم: بررسی Cron Job ها

یکی از مکان‌هایی که در بررسی امنیتی باید توجه ویژه‌ای به آن داشته باشید Cron است.

Cron برای اجرای خودکار دستورات استفاده می‌شود.

برای کاربر فعلی:

crontab -l

برای Root:

sudo crontab -l

همچنین:

ls -la /etc/cron.d/

و:

ls -la /etc/cron.daily/

و:

ls -la /etc/cron.hourly/

را بررسی کنید.

وجود یک Cron Job ناشناس می‌تواند نیازمند بررسی بیشتر باشد.


مرحله شانزدهم: نصب Fail2Ban

حالا که SSH را با Key امن‌تر کرده‌ایم، بهتر است یک لایه دیگر نیز برای مقابله با تلاش‌های مکرر ورود اضافه کنیم.

اینجا Fail2Ban وارد می‌شود.

Fail2Ban لاگ‌های سرویس‌ها را بررسی می‌کند و در صورت مشاهده الگوهای مشخصی از تلاش‌های ناموفق، می‌تواند IP مربوطه را برای مدت مشخصی مسدود کند.

Debian نیز Fail2Ban را به عنوان ابزاری برای شناسایی تلاش‌های متعدد ناموفق و Ban کردن IPها معرفی می‌کند.


نصب Fail2Ban در Ubuntu و Debian

ابتدا:

sudo apt update

سپس:

sudo apt install fail2ban -y

فعال کردن سرویس:

sudo systemctl enable --now fail2ban

بررسی:

sudo systemctl status fail2ban

نصب Fail2Ban در AlmaLinux، Rocky، RHEL و CentOS Stream

ابتدا مخزن مناسب سیستم را بررسی کنید.

در سیستم‌های مبتنی بر RHEL ممکن است بسته Fail2Ban از مخازن فعال سیستم در دسترس باشد.

در صورت در دسترس بودن:

sudo dnf install fail2ban -y

سپس:

sudo systemctl enable --now fail2ban

و:

sudo systemctl status fail2ban

تنظیم Fail2Ban برای SSH

بهتر است فایل اصلی:

jail.conf

را مستقیماً تغییر ندهید.

یک فایل Local بسازید:

/etc/fail2ban/jail.local

برای مثال:

sudo nano /etc/fail2ban/jail.local

سپس می‌توان تنظیماتی مانند این قرار داد:

[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5

[sshd]
enabled = true

بعد:

sudo systemctl restart fail2ban

و بررسی:

sudo fail2ban-client status

برای Jail مربوط به SSH:

sudo fail2ban-client status sshd

Fail2Ban دقیقاً چه کاری انجام می‌دهد؟

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

findtime = 10m
maxretry = 5
bantime = 1h

یعنی Fail2Ban در یک بازه زمانی مشخص، تلاش‌های ناموفق را بررسی می‌کند و اگر تعداد آنها از مقدار تعیین‌شده عبور کند، IP مربوطه را برای مدت مشخصی Ban می‌کند.

اما باید توجه داشت:

Fail2Ban جایگزین SSH Key، Firewall، به‌روزرسانی سیستم و تنظیمات صحیح SSH نیست.

همچنین Fail2Ban در برابر تمام انواع حملات مناسب نیست و در برابر حملات توزیع‌شده که از تعداد زیادی IP استفاده می‌کنند محدودیت دارد.


مرحله هفدهم: بررسی وضعیت Fail2Ban

برای مشاهده Jailها:

sudo fail2ban-client status

مثلاً:

Jail list: sshd

سپس:

sudo fail2ban-client status sshd

ممکن است اطلاعاتی مانند:

Currently failed:
Total failed:
Currently banned:
Total banned:

نمایش داده شود.


اگر IP خودمان Ban شد چه کنیم؟

این اتفاق ممکن است رخ دهد.

اگر به اشتباه IP خودتان Ban شد، ابتدا از Console یا یک IP مجاز دیگر وارد سرور شوید.

سپس:

sudo fail2ban-client set sshd unbanip YOUR-IP

البته نام Jail باید با تنظیمات سیستم شما مطابقت داشته باشد.


مرحله هجدهم: محدود کردن کاربران SSH

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

مثلاً:

AllowUsers admin

در این حالت فقط کاربر مشخص‌شده مجاز خواهد بود.

می‌توانید چند کاربر را نیز مشخص کنید:

AllowUsers admin operator

این قابلیت می‌تواند به محدود کردن حساب‌های مجاز برای SSH کمک کند. Debian نیز گزینه‌های AllowUsers و AllowGroups را در تنظیمات SSH معرفی می‌کند.


آیا AllowUsers همیشه ضروری است؟

خیر.

اگر فقط یک یا دو کاربر مدیریتی دارید، می‌تواند مفید باشد.

اما اگر سرور شما برای چند کاربر یا چند سرویس استفاده می‌شود، قبل از اعمال آن باید مطمئن شوید که حساب‌های موردنیاز حذف نمی‌شوند.


مرحله نوزدهم: بررسی SSH بعد از Hardening

بعد از انجام تغییرات:

sshd -T | grep -E 'permitrootlogin|passwordauthentication|pubkeyauthentication|port'

مثلاً وضعیت هدف می‌تواند چیزی شبیه این باشد:

permitrootlogin no
passwordauthentication no
pubkeyauthentication yes
port 22

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


وضعیت ایده‌آل SSH برای یک VPS شخصی

برای یک سرور مجازی که فقط خود مدیر آن را مدیریت می‌کند، معماری معمول می‌تواند این باشد:

Internet
   |
   v
SSH
   |
   +---- SSH Key
   |
   +---- Fail2Ban
   |
   +---- Firewall
   |
   v
admin user
   |
   v
sudo
   |
   v
root

در این ساختار، Root مستقیماً از اینترنت Login نمی‌کند و کاربر مدیریتی با کلید SSH احراز هویت می‌شود.


مرحله بیستم: بررسی Firewall

امنیت SSH بدون Firewall کامل نیست.

در Ubuntu ممکن است UFW استفاده کنید.

بررسی:

sudo ufw status

اگر SSH روی پورت 22 است:

sudo ufw allow 22/tcp

اگر SSH روی پورت دیگری است، همان پورت را مجاز کنید.

سپس:

sudo ufw enable

هشدار

اگر قبل از Enable کردن Firewall دسترسی SSH خود را مجاز نکرده باشید، ممکن است ارتباط شما قطع شود.

بنابراین ابتدا Ruleهای موردنیاز را بررسی کنید.


اگر از پورت غیر استاندارد استفاده می‌کنیم

فرض کنید SSH روی:

2222

است.

باید:

sudo ufw allow 2222/tcp

را قبل از فعال کردن Firewall در نظر بگیرید.


آیا تغییر پورت SSH ضروری است؟

خیر.

این کار اختیاری است.

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

  • SSH Key
  • حذف Root Login مستقیم
  • غیرفعال کردن Password Authentication در صورت امکان
  • Firewall
  • Fail2Ban
  • به‌روزرسانی
  • بررسی لاگ‌ها
  • حذف حساب‌های غیرضروری
  • بررسی کلیدهای SSH

تغییر پورت می‌تواند نویز و تعداد زیادی از اسکن‌های خودکار را کم کند، اما نباید به عنوان یک راهکار امنیتی اصلی معرفی شود.


مرحله بیست‌ویکم: به‌روزرسانی سیستم‌عامل

امنیت SSH فقط مربوط به فایل sshd_config نیست.

خود OpenSSH و سایر نرم‌افزارهای سرور نیز باید به‌روز باشند.

در Ubuntu و Debian:

sudo apt update
sudo apt upgrade

در سیستم‌های RHEL:

sudo dnf update

Debian نیز توصیه می‌کند به‌روزرسانی‌های امنیتی OpenSSH در اسرع وقت نصب شوند.


آیا بعد از تغییر SSH باید سیستم را Reboot کنیم؟

معمولاً برای تغییر تنظیمات SSH نیازی به Reboot کامل سیستم نیست.

بعد از بررسی Syntax:

sshd -t

می‌توانید سرویس SSH را Reload کنید.

Ubuntu/Debian:

sudo systemctl reload ssh

RHEL/AlmaLinux/Rocky:

sudo systemctl reload sshd

اگر SSH خراب شد و دیگر نمی‌توانیم وصل شویم چه کنیم؟

اینجا همان جایی است که Console یا VNC اهمیت پیدا می‌کند.

از طریق Console وارد سرور شوید.

ابتدا:

sshd -t

را اجرا کنید.

اگر خطا داشت، فایل:

/etc/ssh/sshd_config

را بررسی کنید.

اگر لازم بود Backup قبلی را برگردانید:

cp /etc/ssh/sshd_config.backup /etc/ssh/sshd_config

سپس:

sshd -t

و بعد سرویس را Reload کنید.


اگر Password Authentication را اشتباهی خاموش کردیم چه؟

اگر هنوز یک Session باز دارید، آن را نبندید.

با همان Session تنظیمات را اصلاح کنید.

اگر هیچ Session فعالی ندارید، از Console یا VNC وارد شوید.

سپس:

nano /etc/ssh/sshd_config

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

این دقیقاً یکی از دلایلی است که توصیه می‌شود هنگام Hardening SSH، دسترسی Console را در اختیار داشته باشید.


بررسی Backdoor های رایج در SSH

اگر شک دارید سرور قبلاً در معرض دسترسی غیرمجاز قرار گرفته، بررسی را فقط به sshd_config محدود نکنید.

موارد زیر را بررسی کنید:

/etc/passwd
/etc/shadow
/etc/sudoers
/etc/sudoers.d/
/root/.ssh/
/home/*/.ssh/
/etc/cron.d/
/etc/systemd/system/
/etc/rc.local

همچنین Processهای در حال اجرا، سرویس‌ها و فایل‌های Startup را بررسی کنید.


بررسی سرویس‌های فعال

برای مشاهده سرویس‌های فعال:

systemctl --type=service --state=running

اگر سرویس ناشناسی دیدید، نام آن را بررسی کنید.

مثلاً:

systemctl status SERVICE-NAME

و:

systemctl cat SERVICE-NAME

می‌تواند اطلاعات بیشتری درباره نحوه اجرای سرویس نشان دهد.


بررسی پورت‌های باز

برای مشاهده Socketهای Listening:

ss -tulpn

مثلاً:

LISTEN 0 128 0.0.0.0:22
LISTEN 0 128 0.0.0.0:80
LISTEN 0 128 0.0.0.0:443

اگر پورتی را نمی‌شناسید، باید بررسی کنید کدام سرویس آن را باز کرده است.


آیا دیدن پورت ناشناس یعنی Backdoor داریم؟

نه.

ممکن است آن پورت متعلق به:

  • Docker
  • Web Server
  • Database
  • Control Panel
  • Monitoring
  • DNS
  • Mail Server
  • VPN
  • نرم‌افزار دیگری که خودتان نصب کرده‌اید

باشد.

اما هر Port ناشناخته باید شناسایی شود.


بررسی مالک یک Port

اگر مثلاً Port خاصی باز است، می‌توانید با:

ss -lntp

اطلاعات Process مربوط به آن را مشاهده کنید.

سپس PID را بررسی کنید:

ps -fp PID

بررسی فایل‌های تغییر یافته اخیر

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

find /etc -type f -mtime -7

استفاده کرد.

این دستور فایل‌هایی را که در ۷ روز گذشته تغییر کرده‌اند نشان می‌دهد.

البته این روش به تنهایی ابزار تشخیص نفوذ نیست؛ فقط می‌تواند برای بررسی اولیه مفید باشد.


اگر رمز Root لو رفته باشد چه چیزهایی را باید تغییر دهیم؟

اگر احتمال می‌دهید رمز Root افشا شده، فقط رمز Root را تغییر ندهید.

بسته به وضعیت سرور، این موارد نیز باید بررسی شوند:

  • رمز کاربران مدیریتی
  • SSH Keys
  • کلیدهای API
  • رمز دیتابیس
  • رمز پنل‌ها
  • رمز FTP/SFTP
  • رمز ایمیل‌های مدیریتی
  • Tokenهای سرویس‌ها
  • Credentialهای Docker
  • فایل‌های .env
  • Secretهای نرم‌افزارها

چون ممکن است مهاجم به اطلاعات دیگری نیز دسترسی پیدا کرده باشد.


آیا بعد از تغییر رمز می‌توانیم مطمئن باشیم مهاجم بیرون رفته است؟

نه، صرفاً تغییر رمز چنین تضمینی نمی‌دهد.

اگر مهاجم قبلاً دسترسی گرفته باشد، ممکن است مکانیزم دیگری برای دسترسی مجدد ایجاد کرده باشد.

برای همین در صورت وجود شواهد واقعی از نفوذ باید یک بررسی کامل امنیتی انجام شود.

در مواردی که اطمینان حاصل شود سیستم Compromise شده، نصب مجدد سیستم‌عامل از یک Image معتبر و سپس Restore کردن اطلاعات بررسی‌شده، می‌تواند از ادامه آلودگی جلوگیری کند.


آیا باید همیشه Root Login را کاملاً ببندیم؟

برای بسیاری از سرورهای عمومی، جلوگیری از ورود مستقیم Root و استفاده از یک حساب مدیریتی + sudo رویکرد مناسبی است.

اما زیرساخت‌ها و نیازها متفاوت هستند.

برای مثال:

  • بعضی سیستم‌های Automation
  • بعضی Backupها
  • برخی نرم‌افزارهای مدیریت زیرساخت
  • برخی محیط‌های خاص

ممکن است نیازهای متفاوتی داشته باشند.

بنابراین قبل از:

PermitRootLogin no

وابستگی‌های مدیریتی سرور را بررسی کنید.


SSH Key بهتر است یا Password؟

برای مدیریت سرور، SSH Key معمولاً انتخاب مناسب‌تری نسبت به اتکا به Password است، به‌خصوص وقتی کلید خصوصی با Passphrase محافظت شود.

اما امنیت SSH Key نیز به نگهداری صحیح Private Key وابسته است.

اگر لپ‌تاپ شما آلوده باشد و Private Key در اختیار مهاجم قرار بگیرد، SSH Key به تنهایی مشکل را حل نمی‌کند.

پس امنیت واقعی یک زنجیره است:

Secure Computer
+
Protected Private Key
+
SSH Key Authentication
+
No Direct Root Login
+
Firewall
+
Fail2Ban
+
Updates
+
Monitoring

آیا باید Password کاربر را هم حذف کنیم؟

اگر:

PasswordAuthentication no

باشد، احراز هویت Password از طریق SSH غیرفعال می‌شود.

اما این موضوع با حذف Password خود حساب لینوکس یکی نیست.

برای مثال ممکن است کاربر همچنان Password داشته باشد و برای sudo به آن نیاز داشته باشد.

بنابراین بین این دو تفاوت قائل شوید:

Password Authentication over SSH

و:

Linux account password

اشتباهات رایج هنگام امن‌سازی SSH

۱. خاموش کردن Root قبل از ساخت کاربر جدید

اشتباه خطرناک.

ابتدا کاربر جدید بسازید.


۲. خاموش کردن Password قبل از تست SSH Key

اشتباه بسیار رایج.

اول:

ssh admin@SERVER-IP

را در یک پنجره جدید تست کنید.

بعد Password Authentication را خاموش کنید.


۳. بستن پورت SSH در Firewall

اگر SSH روی پورت 22 است:

ufw allow 22/tcp

یا Rule معادل در Firewall خود را قبل از اعمال محدودیت‌ها تنظیم کنید.


۴. تصور اینکه تغییر Port یعنی امنیت کامل

تغییر Port فقط یکی از اقدامات جانبی است.


۵. حذف کاربران ناشناس بدون بررسی

ممکن است User مربوط به یک سرویس باشد.

ابتدا بررسی کنید.


۶. حذف کلیدهای SSH بدون بررسی

کلید ممکن است متعلق به مدیر دیگری باشد.


۷. Restart کردن SSH بدون Syntax Check

قبل از اعمال تغییرات:

sshd -t

۸. نداشتن Console یا VNC

قبل از Hardening مطمئن شوید در صورت Lockout راه برگشت دارید.


چک‌لیست نهایی امن‌سازی SSH

اگر می‌خواهید سریع وضعیت سرور خود را بررسی کنید، این چک‌لیست می‌تواند مفید باشد:

دسترسی

  • Console یا VNC در دسترس است.
  • کاربر مدیریتی غیر Root ایجاد شده است.
  • کاربر مدیریتی sudo دارد.
  • SSH Key ساخته شده است.
  • Private Key در محل امن نگهداری می‌شود.
  • Private Key دارای Passphrase است.

SSH

  • ورود مستقیم Root غیرفعال شده است.
  • SSH Key Authentication فعال است.
  • Password Authentication در صورت امکان غیرفعال شده است.
  • sshd -t بدون خطا اجرا می‌شود.
  • پورت SSH مشخص و مستند شده است.
  • کاربران مجاز SSH مشخص هستند.

سیستم

  • سیستم‌عامل به‌روز است.
  • OpenSSH به‌روز است.
  • کاربران ناشناس بررسی شده‌اند.
  • کاربران دارای UID 0 بررسی شده‌اند.
  • گروه sudo/wheel بررسی شده است.
  • کلیدهای authorized_keys بررسی شده‌اند.
  • Cron Jobها بررسی شده‌اند.
  • سرویس‌های ناشناس بررسی شده‌اند.
  • Portهای Listening بررسی شده‌اند.

مانیتورینگ

  • لاگ SSH بررسی می‌شود.
  • Loginهای موفق بررسی شده‌اند.
  • Loginهای ناموفق بررسی شده‌اند.
  • Fail2Ban نصب شده است.
  • Jail مربوط به SSH فعال است.
  • Firewall تنظیم شده است.

تنظیمات پیشنهادی نهایی برای یک VPS معمولی

برای بسیاری از VPSهای شخصی یا سرورهای مدیریتی، یک وضعیت منطقی می‌تواند به شکل زیر باشد:

PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no

و در کنار آن:

Fail2Ban
+
Firewall
+
SSH Key
+
Non-root administrative user
+
sudo
+
System updates
+
Log monitoring

البته قبل از اعمال این تنظیمات باید مطمئن شوید که نرم‌افزارها و فرآیندهای مدیریتی شما به Login با Password یا Root مستقیم وابسته نیستند.


یک سناریوی کامل از صفر تا سرور امن

فرض کنیم یک VPS تازه با Ubuntu یا Debian دارید.

در ابتدا:

root
+
password
+
SSH port 22

فعال است.

مراحل پیشنهادی:

مرحله ۱

وارد SSH شوید.

مرحله ۲

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

apt update
apt upgrade

مرحله ۳

کاربر جدید ایجاد کنید:

adduser admin

مرحله ۴

sudo بدهید:

usermod -aG sudo admin

مرحله ۵

SSH Key بسازید.

مرحله ۶

Public Key را در:

/home/admin/.ssh/authorized_keys

قرار دهید.

مرحله ۷

Permissionها را اصلاح کنید:

chmod 700 /home/admin/.ssh
chmod 600 /home/admin/.ssh/authorized_keys
chown -R admin:admin /home/admin/.ssh

مرحله ۸

از یک پنجره جدید ورود را تست کنید:

ssh admin@SERVER-IP

مرحله ۹

تنظیمات SSH را تغییر دهید:

PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no

مرحله ۱۰

Syntax را بررسی کنید:

sshd -t

مرحله ۱۱

SSH را Reload کنید.

مرحله ۱۲

در یک پنجره جدید دوباره Login کنید.

مرحله ۱۳

Fail2Ban نصب کنید.

مرحله ۱۴

Firewall را تنظیم کنید.

مرحله ۱۵

کاربران، کلیدها و لاگ‌ها را بررسی کنید.

در پایان دیگر معماری ورود شما به شکل:

root + password

نیست.

بلکه:

admin + SSH Key
       |
       v
      sudo
       |
       v
      root

خواهد بود.


یک نکته مهم برای سرورهای فروش هاست و VPS

اگر سرور شما فقط یک VPS شخصی نیست و روی آن سرویس‌هایی مانند:

  • وب‌سایت
  • WHMCS
  • cPanel
  • DirectAdmin
  • Docker
  • دیتابیس
  • Mail Server
  • DNS
  • پنل مدیریت
  • سرویس‌های API
  • نرم‌افزارهای مانیتورینگ

اجرا می‌شوند، Hardening SSH فقط یکی از بخش‌های امنیت سرور است.

ممکن است SSH کاملاً امن باشد اما یک نرم‌افزار وب آسیب‌پذیر باشد.

بنابراین امنیت سرور باید به صورت چندلایه انجام شود.


جمع‌بندی

امن کردن SSH یک کار تک‌مرحله‌ای نیست.

اینکه فقط پورت SSH را تغییر دهید یا رمز Root را قوی‌تر کنید، به تنهایی به معنی امن شدن سرور نیست.

برای یک VPS لینوکسی بهتر است امنیت SSH را به صورت مرحله‌ای پیاده کنید:

بررسی وضعیت فعلی
        ↓
ساخت کاربر مدیریتی
        ↓
ساخت SSH Key
        ↓
تست ورود با Key
        ↓
محدود کردن Root Login
        ↓
غیرفعال کردن Password Authentication
        ↓
بررسی Syntax
        ↓
Reload SSH
        ↓
Firewall
        ↓
Fail2Ban
        ↓
بررسی کاربران
        ↓
بررسی authorized_keys
        ↓
بررسی Login Logs
        ↓
بررسی Process و Portها
        ↓
به‌روزرسانی و مانیتورینگ

مهم‌ترین نکته این است که هیچ‌وقت قبل از آزمایش روش ورود جدید، روش قبلی را غیرفعال نکنید.

اگر SSH Key را به درستی راه‌اندازی کنید، ورود مستقیم Root را ببندید، Password Authentication را در شرایط مناسب غیرفعال کنید، Firewall را درست تنظیم کنید، Fail2Ban را فعال کنید و به شکل دوره‌ای Loginها و کاربران سیستم را بررسی کنید، سطح امنیت SSH سرور شما نسبت به یک نصب ساده و بدون Hardening به شکل قابل توجهی بهتر خواهد شد.

و در نهایت، اگر بعد از تغییر رمز یا مشاهده Loginهای مشکوک احتمال می‌دهید شخص دیگری قبلاً وارد سرور شده است، موضوع را صرفاً با «تغییر رمز» تمام‌شده فرض نکنید؛ باید کلیدهای SSH، کاربران، Cronها، سرویس‌ها، Processها و لاگ‌ها بررسی شوند و در صورت وجود شواهد واقعی از Compromise، اقدامات Incident Response جدی‌تری انجام شود.

اشتراک‌گذاری مقاله
گفت‌وگو درباره آموزش

دیدگاه‌ها (۰)

هنوز دیدگاهی ثبت نشده است.

دیدگاه یا سؤال خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *