امن‌سازی SSH با fail2ban و key-based login

امنیت سرور یکی از حیاتی‌ترین دغدغه‌های هر مدیر سیستم یا توسعه‌دهنده‌ای است. پروتکل SSH (Secure Shell) دروازه اصلی دسترسی به سرورهای لینوکسی و انجام عملیات مدیریتی است. به دلیل اهمیت این پروتکل، همواره هدف حملات سایبری، به‌ویژه حملات Brute-force قرار می‌گیرد. در این مقاله جامع، به شما نشان خواهیم داد که چگونه با پیاده‌سازی ترکیبی از بهترین روش‌های امنیتی، شامل احراز هویت مبتنی بر کلید و استفاده از ابزار قدرتمند Fail2ban، امنیت SSH سرور خود را به سطحی بی‌سابقه ارتقا دهید. این راهکارها نه تنها در برابر حملات رایج محافظت می‌کنند، بلکه تجربه کاربری امن‌تر و مطمئن‌تری را نیز فراهم می‌آورند.

چرا امن‌سازی SSH اینقدر اهمیت دارد؟

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

۱. تغییر پورت پیش‌فرض SSH

اولین گام در کاهش حملات خودکار، تغییر پورت پیش‌فرض SSH از ۲۲ به یک پورت دیگر (مثلاً عددی بین ۱۰۲۴ تا ۶۵۵۳۵) است. این کار حملات Brute-force عمومی را به میزان قابل توجهی کاهش می‌دهد، زیرا مهاجمان دیگر نمی‌دانند سرور شما روی کدام پورت در حال گوش دادن است.

  • فایل پیکربندی SSH را باز کنید: sudo nano /etc/ssh/sshd_config
  • خط #Port 22 را پیدا کرده و کامنت آن را بردارید (علامت # را حذف کنید).
  • عدد ۲۲ را به پورت دلخواه خود (مثلاً ۴۵۶۷۸) تغییر دهید: Port 45678
  • فایل را ذخیره و ببندید (Ctrl+O, Enter, Ctrl+X).
  • سرویس SSH را مجدداً راه‌اندازی کنید: sudo systemctl restart sshd
  • مهم: حتماً پورت جدید را در فایروال خود باز کنید (در ادامه توضیح داده می‌شود) پیش از اینکه از ترمینال فعلی خارج شوید. در غیر این صورت، دسترسی شما به سرور قطع خواهد شد.

۲. غیرفعال کردن ورود مستقیم با کاربر ریشه (Root)

ورود مستقیم با کاربر ریشه (root) به دلیل داشتن بالاترین سطح دسترسی، بسیار خطرناک است. بهتر است همیشه با یک کاربر عادی وارد شده و در صورت نیاز از دستور sudo برای عملیات‌های نیازمند دسترسی ریشه استفاده کنید.

  • فایل /etc/ssh/sshd_config را دوباره باز کنید.
  • خط #PermitRootLogin prohibit-password را پیدا کرده و آن را به PermitRootLogin no تغییر دهید. (یا PermitRootLogin yes را به no تبدیل کنید)
  • فایل را ذخیره کرده و سرویس SSH را مجدداً راه‌اندازی کنید.

۳. احراز هویت مبتنی بر کلید (Key-based Login) – راهکار امنیتی برتر

احراز هویت با کلیدهای SSH، جایگزینی امن‌تر و قوی‌تر برای رمزهای عبور است. در این روش، یک جفت کلید (کلید عمومی و کلید خصوصی) ایجاد می‌کنید. کلید عمومی روی سرور ذخیره می‌شود و کلید خصوصی روی سیستم محلی شما باقی می‌ماند. بدون کلید خصوصی تطبیق‌یافته، ورود به سرور امکان‌پذیر نیست.

مراحل پیاده‌سازی Key-based Login:

  1. تولید جفت کلید SSH در سیستم محلی (Local Machine):یک ترمینال در سیستم محلی خود باز کرده و دستور زیر را اجرا کنید:
    ssh-keygen -t rsa -b 4096

    این دستور از شما محل ذخیره کلید و یک passphrase (رمز عبور برای کلید خصوصی) می‌پرسد. توصیه می‌شود یک passphrase قوی تنظیم کنید، حتی اگر کلید خصوصی شما به دست افراد غیرمجاز بیفتد، باز هم نیاز به رمز عبور برای استفاده از آن دارند. این کار دو لایه امنیتی ایجاد می‌کند.

    کلید خصوصی در ~/.ssh/id_rsa و کلید عمومی در ~/.ssh/id_rsa.pub ذخیره می‌شوند.

  2. کپی کردن کلید عمومی به سرور:ساده‌ترین و امن‌ترین راه برای کپی کردن کلید عمومی به سرور، استفاده از دستور ssh-copy-id است. این دستور کلید عمومی شما را به فایل ~/.ssh/authorized_keys کاربر مورد نظر در سرور اضافه می‌کند.
    ssh-copy-id -i ~/.ssh/id_rsa.pub user@your_server_ip -p your_new_ssh_port

    به جای user نام کاربری خود در سرور، به جای your_server_ip آدرس IP سرور و به جای your_new_ssh_port پورت جدید SSH خود را وارد کنید.

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

    می‌توانید با دستور ssh user@your_server_ip -p your_new_ssh_port تلاش برای ورود کنید. اگر passphrase برای کلید خود تنظیم کرده باشید، از شما خواسته می‌شود.

  3. غیرفعال کردن ورود با رمز عبور در سرور:پس از اطمینان از اینکه می‌توانید با کلید SSH وارد سرور شوید، زمان آن رسیده که ورود با رمز عبور را غیرفعال کنید تا امنیت به حداکثر برسد.
    • فایل /etc/ssh/sshd_config را دوباره باز کنید.
    • خط #PasswordAuthentication yes را پیدا کرده و آن را به PasswordAuthentication no تغییر دهید.
    • همچنین، مطمئن شوید خط ChallengeResponseAuthentication no و UsePAM yes (یا no بسته به نیاز PAM) به درستی تنظیم شده باشند.
    • فایل را ذخیره و سرویس SSH را مجدداً راه‌اندازی کنید: sudo systemctl restart sshd

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

۴. پیکربندی فایروال (UFW/Firewalld)

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

برای سیستم‌های مبتنی بر Debian/Ubuntu (با UFW):

sudo ufw allow your_new_ssh_port/tcp  # باز کردن پورت جدید SSH
sudo ufw allow http                    # اگر وب‌سرور دارید
sudo ufw allow https                   # اگر وب‌سرور دارید
sudo ufw enable                        # فعال کردن فایروال (با احتیاط)
sudo ufw status verbose                # بررسی وضعیت

برای سیستم‌های مبتنی بر CentOS/RHEL (با Firewalld):

sudo firewall-cmd --permanent --add-port=your_new_ssh_port/tcp # باز کردن پورت جدید SSH
sudo firewall-cmd --permanent --add-service=http              # اگر وب‌سرور دارید
sudo firewall-cmd --permanent --add-service=https             # اگر وب‌سرور دارید
sudo firewall-cmd --reload                                    # اعمال تغییرات
sudo firewall-cmd --list-all                                  # بررسی وضعیت

می‌توانید دسترسی به SSH را به IPهای خاص نیز محدود کنید. مثلاً برای UFW:

sudo ufw allow from your_trusted_ip to any port your_new_ssh_port

۵. Fail2ban – سد دفاعی هوشمند در برابر حملات Brute-force

Fail2ban یک ابزار قدرتمند است که لاگ‌های سرور را مانیتور می‌کند و IPهایی را که تلاش‌های ناموفق مکرر برای ورود دارند، به صورت موقت یا دائم در فایروال مسدود می‌کند. این کار به شکل چشمگیری حملات Brute-force را خنثی می‌کند.

مراحل نصب و پیکربندی Fail2ban:

  1. نصب Fail2ban:برای Debian/Ubuntu:
    sudo apt update
    sudo apt install fail2ban

    برای CentOS/RHEL:

    sudo yum install epel-release
    sudo yum install fail2ban
  2. پیکربندی Fail2ban برای SSH:Fail2ban دارای یک فایل پیکربندی پیش‌فرض /etc/fail2ban/jail.conf است. اما برای انجام تغییرات، توصیه می‌شود یک کپی از آن به نام jail.local ایجاد کنید و تغییرات خود را در این فایل اعمال کنید تا در به‌روزرسانی‌های آینده مشکلی پیش نیاید.
    sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

    فایل jail.local را باز کنید:

    sudo nano /etc/fail2ban/jail.local

    در این فایل، به بخش [DEFAULT] بروید و پارامترهای زیر را تنظیم کنید:

    • bantime: مدت زمان مسدود شدن IP بر حسب ثانیه (مثلاً 1h برای یک ساعت یا 1d برای یک روز). مقدار پیش‌فرض 10 دقیقه است.
    • findtime: مدت زمانی که Fail2ban تلاش‌های ناموفق را دنبال می‌کند. اگر تعداد تلاش‌ها در این بازه از maxretry بیشتر شود، IP مسدود می‌شود.
    • maxretry: حداکثر تعداد تلاش‌های ناموفق پیش از مسدود شدن IP (مثلاً 3).
    • ignoreip: لیستی از IPها یا ساب‌نت‌هایی که Fail2ban نباید آن‌ها را مسدود کند (مثلاً IP خانگی یا شبکه شرکت شما).
    [DEFAULT]
    bantime  = 1h
    findtime = 10m
    maxretry = 3
    ignoreip = 127.0.0.1/8 ::1 your_trusted_ip

    سپس، به بخش مربوط به SSH (معمولاً [sshd] یا [sshd-port]) بروید. اطمینان حاصل کنید که فعال (enabled = true) باشد و پورت صحیح (پورت جدید SSH شما) در آن تنظیم شده باشد.

    [sshd]
    enabled = true
    port = your_new_ssh_port
    filter = sshd
    logpath = /var/log/auth.log # یا /var/log/secure در CentOS/RHEL
    maxretry = 3

    فایل را ذخیره و ببندید.

  3. راه‌اندازی و بررسی وضعیت Fail2ban:پس از اعمال تغییرات، سرویس Fail2ban را فعال و راه‌اندازی مجدد کنید:
    sudo systemctl enable fail2ban
    sudo systemctl restart fail2ban

    برای بررسی وضعیت Fail2ban و مشاهده فعال بودن Jails:

    sudo fail2ban-client status

    برای مشاهده وضعیت Jails خاص (مثلاً sshd):

    sudo fail2ban-client status sshd

نکات تکمیلی برای امنیتی فولادین

  • محدود کردن کاربران مجاز:

    اگر تنها کاربران خاصی مجاز به ورود از طریق SSH هستند، می‌توانید این را در sshd_config تعریف کنید:

    AllowUsers user1 user2

    یا برای گروه‌ها:

    AllowGroups sshusers

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

  • احراز هویت دو مرحله‌ای (2FA):

    برای نهایت امنیت، می‌توانید 2FA را نیز به SSH اضافه کنید. این کار نیاز به رمز عبور یک‌بار مصرف (OTP) از طریق اپلیکیشن‌هایی مانند Google Authenticator دارد و لایه‌ی امنیتی بسیار قوی را اضافه می‌کند. (مبحثی جداگانه و پیشرفته‌تر)

  • تنظیم محدودیت زمان برای Session و Timeout:

    می‌توانید زمان inactivity کاربران را محدود کنید تا پس از مدتی عدم فعالیت، ارتباط SSH قطع شود. در sshd_config:

    ClientAliveInterval 300 # ارسال پیام به کلاینت هر 300 ثانیه (5 دقیقه)
    ClientAliveCountMax 2   # حداکثر تعداد پیام‌های بدون پاسخ قبل از قطع ارتباط (10 دقیقه در مجموع)

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

  • مانیتورینگ و هشدار ورود:

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

جمع‌بندی

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

به یاد داشته باشید، امنیت مقوله‌ای ایستا نیست، بلکه فرآیندی پویا و مستمر است که نیازمند به‌روزرسانی و تطبیق با تهدیدات جدید است. غفلت از این نکته می‌تواند تمام تلاش‌های انجام شده را بی‌اثر کند. آیا ما در عصر دیجیتال، به اندازه کافی برای حفاظت از دارایی‌های خود جدی هستیم؟

دیدگاه

دیدگاهتان را بنویسید

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