تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

    نحوه حفاظت از SSH با استفاده از Fail2Ban در Ubuntu


    ۲۲ دی ۱۴۰۳

    مقدمه

    SSH روشی استاندارد (de facto) برای اتصال به سرورهای مجازی است. این پروتکل، پایدار (durable) و قابل گسترش (extensible) است. با توسعه استانداردهای جدید رمزنگاری، می‌توان از آنها برای تولید کلیدهای جدید SSH استفاده کرد و اطمینان حاصل کرد که پروتکل اصلی، امن باقی می‌ماند. با این حال، هیچ پروتکل یا مجموعه نرم‌افزاری، به طور کامل بدون نقص نیست، و از آنجا که SSH به طور گسترده در اینترنت استفاده می‌شود، به عنوان یک attack surface یا attack vector ظاهر می‌شود و ممکن است افراد بتوانند از طریق آن، به سرور مجازی، دسترسی پیدا کنند.

    هر سرویسی که به شبکه متصل باشد، به این روش می‌تواند هدف حمله قرار گیرد. اگر لاگ‌های مربوط به سرویس SSH سرور مجازی خود را بررسی کنید، اغلب تلاش‌های ورود مکرر و سیستماتیکی را خواهید دید که نمایانگر حملات brute force توسط کاربران و ربات‌ها هستند. با وجود اینکه می‌توانید با بهینه‌سازی تنظیمات سرویس SSH، احتمال موفقیت این حملات را تقریباً به صفر برسانید — مثلاً با غیرفعال کردن احراز هویت با رمز عبور (password authentication) و استفاده از کلیدهای SSH به جای آن — این حملات همچنان می‌توانند یک خطر جزئی و مداوم باشند.

    برای استقرارهای بزرگ در محیط بهره‌برداری (large-scale production deployments) که این خطر به هیچ وجه قابل قبول نیست، معمولاً یک پروتکل مانند WireGuard در مقابل سرویس SSH پیاده‌سازی می‌شود. این کار باعث می‌شود که اتصال مستقیم به پورت پیش‌فرض SSH یعنی 22 از اینترنت خارجی، بدون نرم‌افزار یا gatewayهای اضافی، غیرممکن شود. راه‌حل‌های این شکلی، به طور گسترده‌ای مورد اعتماد هستند اما پیچیدگی‌های خاص خود را دارند و ممکن است برخی اتوماسیون‌ها یا هوک‌های نرم‌افزاری کوچک را، مختل کنند.

    در کنار این راه‌حل‌ها، می‌توانید از ابزاری به نام Fail2Ban استفاده کنید. Fail2Ban می‌تواند حملات brute force را به طور قابل توجهی کاهش دهد. این ابزار با ایجاد قوانینی که به صورت خودکار تنظیمات فایروال (firewall configuration) شما را تغییر می‌دهند، آی‌پی‌های خاص را پس از تعداد مشخصی تلاش ناموفق برای ورود، مسدود می‌کند. این قابلیت به سرور مجازی (VPS) شما این امکان را می‌دهد که بدون دخالت شما، در برابر این تلاش‌های دسترسی، مقاوم‌تر شود.

    در این مقاله، نحوه نصب و استفاده از Fail2Ban روی سرور Ubuntu را بررسی خواهیم کرد.

    پیش‌نیازها

    برای استفاده از این مقاله، به ابزارهای زیر، نیاز دارید:

    • یک سرور Ubuntu (ترجیحاً نسخه 22.04 به بعد) و یک کاربر غیر root یا non-root user با دسترسی‌های sudo.
    • یک سرور دوم، که از طریق آن بتوانید به سرور اول متصل شوید و آن را آزمایش کنید (این پیش‌نیاز اختیاری است).

    اگر که با SSH یا مفهوم سرور مجازی (VPS – Virtual Private Server)، آشنایی ندارید؛ توصیه می‌شود که برای درک کامل این مقاله، در ابتدا، مقاله‌های زیر را، مطالعه کنید:

    مرحله اول — نصب Fail2ban

    Fail2ban در repositoryهای نرم‌افزاری Ubuntu موجود است. برای شروع، به‌عنوان یک کاربر غیر root، دستورات زیر را اجرا کنید تا لیست بسته‌ها (package listings) را به‌روزرسانی کرده و Fail2ban را نصب کنید:

    sudo apt update
    sudo apt install fail2ban

    Fail2ban پس از نصب، به صورت خودکار، در سرور، یک سرویس پس‌زمینه (background service) راه‌اندازی می‌کند. با این حال، این سرویس به طور پیش‌فرض غیرفعال است، زیرا برخی از تنظیمات دیفالت آن، ممکن است باعث ایجاد اثرات ناخواسته شوند. می‌توانید این موضوع را با استفاده از دستور systemctl بررسی کنید:

    systemctl status fail2ban.service

    خروجی دستور فوق، مانند شکل زیر است:

    ○ fail2ban.service - Fail2Ban Service
         Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled)
         Active: inactive (dead)
           Docs: man:fail2ban(1)

    می‌توانید Fail2ban را بلافاصله فعال کنید، اما ابتدا بهتر است برخی از ویژگی‌های آن را بررسی کنید.

    مرحله دوم – پیکربندی Fail2ban

    سرویس Fail2ban فایل‌های پیکربندی خود را در دایرکتوری /etc/fail2ban نگهداری می‌کند. یک فایل پیش‌فرض به نام jail.conf در این دایرکتوری وجود دارد. به آن دایرکتوری بروید و با استفاده از دستور head -20، بیست خط اول این فایل را چاپ کنید:

    cd /etc/fail2ban
    head -20 jail.conf

    خروجی دستور فوق، مانند شکل زیر است:

    #
    # WARNING: heavily refactored in 0.9.0 release.  Please review and
    #          customize settings for your setup.
    #
    # Changes:  in most of the cases you should not modify this
    #           file, but provide customizations in jail.local file,
    #           or separate .conf files under jail.d/ directory, e.g.:
    #
    # HOW TO ACTIVATE JAILS:
    #
    # YOU SHOULD NOT MODIFY THIS FILE.
    #
    # It will probably be overwritten or improved in a distribution update.
    #
    # Provide customizations in a jail.local file or a jail.d/customisation.local.
    # For example to change the default bantime for all jails and to enable the
    # ssh-iptables jail the following (uncommented) would appear in the .local file.
    # See man 5 jail.conf for details.
    #
    # [DEFAULT]

    همان‌طور که مشاهده کردید، چند خط اول فایل jail.conf کامنت شده‌است. این چند خط با کاراکتر # آغاز می‌شوند که نشان می‌دهد به عنوان مستندات خوانده می‌شوند و نه به عنوان تنظیمات. همچنین، در این کامنت‌ها ذکر شده است که نباید این فایل را مستقیماً تغییر دهید.

    به جای آن، دو گزینه در اختیار دارید:

    • ایجاد پروفایل‌های جداگانه برای Fail2ban در چندین فایل، داخل دایرکتوری jail.d/.
    • ایجاد و جمع‌آوری تمام تنظیمات local خود در یک فایل به نام jail.local.

    فایل jail.conf به‌صورت دوره‌ای با به‌روزرسانی Fail2ban به‌روز می‌شود و به‌عنوان منبع تنظیمات پیش‌فرض، برای مواردی که جایگزینی برای آنها ایجاد نکرده‌اید، استفاده خواهد شد.

    در این آموزش، فایل jail.local را ایجاد خواهیم کرد. برای این کار، کافیست تا فایل jail.conf را کپی کنید:

    sudo cp jail.conf jail.local

    اکنون می‌توانید تغییرات پیکربندی را شروع کنید. فایل را با استفاده از ویرایشگر متن nano یا ویرایشگر مورد علاقه خود باز کنید:

    sudo nano jail.local

    هنگامی که این فایل را اسکرول می‌کنید، می‌توانید برخی از گزینه‌هایی را که ممکن است بخواهید به‌روزرسانی کنید بررسی کنید. تنظیماتی که در بخش [DEFAULT] در بالای فایل قرار دارند، برای تمام سرویس‌هایی که توسط Fail2ban پشتیبانی می‌شوند اعمال می‌شوند. در سایر بخش‌های فایل، هدرهایی مانند [sshd] و دیگر سرویس‌ها وجود دارند که شامل تنظیمات مخصوص هر سرویس هستند. این تنظیمات خاص، بر روی تنظیمات پیش‌فرض اعمال می‌شوند و در صورت تضاد با تنظیمات دیفالت، اولویت خواهند داشت.

    پارامتر bantime

    پارامتر bantime مدت‌زمانی را تعیین می‌کند که یک کلاینت پس از تلاش ناموفق برای احراز هویت (authentication) مسدود می‌شود. این مقدار بر حسب ثانیه اندازه‌گیری می‌شود. به طور پیش‌فرض، این مقدار روی 10 دقیقه تنظیم شده است.

    
    [DEFAULT]
    . . .
    bantime = 10m
    . . .

    پارامترهای findtime و maxretry

    دو پارامتر بعدی، findtime و maxretry هستند که با هم کار می‌کنند تا شرایطی را بررسی کنند که در آن، یک کلاینت به عنوان یک کاربر غیرمجاز شناخته شده و باید مسدود شود.

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

    با تنظیمات پیش‌فرض، سرویس Fail2ban یک کلاینت را که 5 بار تلاش ناموفق برای ورود در بازه زمانی 10 دقیقه‌ای داشته باشد، مسدود می‌کند.

    [DEFAULT]
    . . .
    findtime = 10m
    maxretry = 5
    . . .

    دریافت اعلان‌های ایمیل هنگام عملکرد Fail2ban

    اگر نیاز دارید که هنگام عملکرد Fail2ban، اعلان‌های ایمیل دریافت کنید، باید پارامترهای destemail و sendername و mta را تنظیم کنید.

    • پارامتر destemail آدرس ایمیلی را که باید پیام‌های مسدودسازی را دریافت کند، تعیین می‌کند.
    • پارامتر sendername مقدار فیلد “From” در ایمیل را تنظیم می‌کند که همان فرستنده است.
    • پارامتر mta سرویس پستی که برای ارسال ایمیل استفاده خواهد شد را پیکربندی می‌کند. به طور پیش‌فرض، این مقدار sendmail است، اما ممکن است بخواهید از Postfix یا راه‌حل‌های پستی دیگری استفاده کنید.
    [DEFAULT]
    . . .
    destemail = root@localhost
    sender = root@<fq-hostname>
    mta = sendmail
    . . .

    پارامتر action_

    این پارامتر اقداماتی را که Fail2ban هنگام اعمال یک مسدودسازی انجام می‌دهد، تنظیم می‌کند:

    [DEFAULT]
    . . .
    action = $(action_)s
    . . .

    مقدار action_ کمی قبل از این پارامتر در فایل تعریف شده است. عمل پیش‌فرض این است که تنظیمات فایروال شما، به‌روزرسانی شود و میزبان متخلف، تا زمانی که مدت مسدودسازی‌اش (ban time) به پایان برسد، مسدود بماند. چندین اسکریپت دیگر به صورت پیش‌فرض برای action_ ارائه شده‌اند که می‌توانید مقدار $(action_) را با آن‌ها جایگزین کنید:

    …
    # ban & send an e-mail with whois report to the destemail.
    action_mw = %(action_)s
                %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
    
    # ban & send an e-mail with whois report and relevant log lines
    # to the destemail.
    action_mwl = %(action_)s
                 %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
    
    # See the IMPORTANT note in action.d/xarf-login-attack for when to use this action
    #
    # ban & send a xarf e-mail to abuse contact of IP address and include relevant log lines
    # to the destemail.
    action_xarf = %(action_)s
                 xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]
    
    # ban IP on CloudFlare & send an e-mail with whois report and relevant log lines
    # to the destemail.
    action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
                    %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
    …

    به عنوان مثال، action_mw علاوه بر اقدام فوق، یک ایمیل نیز، ارسال می‌کند. action_mwl علاوه بر اقدام و ارسال ایمیل، لاگ‌ها را نیز در ایمیل ضمیمه می‌کند. action_cf_mwl، همه موارد گفته شده را انجام می‌دهد و همچنین یک به‌روزرسانی به Cloudflare API مرتبط با حساب شما ارسال می‌کند تا کاربر متخلف در Cloudflare نیز، مسدود شوند.

    تنظیمات مربوط به Individual Jail

    در بخش بعدی فایل پیکربندی، تنظیمات مربوط به سرویس‌های جداگانه ارائه شده است. این تنظیمات با هدرهای مشخصی، (مانند [sshd]) تعریف می‌شوند. برای فعال‌سازی هر یک از این بخش‌ها، باید عبارت enabled = true را در زیر هدر مربوطه اضافه کنید:

    [jail_to_enable]
    . . .
    enabled = true
    . . .

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

    • filter: فیلتری که تعیین می‌کند آیا یک خط در لاگ، تلاش ناموفق برای احراز هویت را نشان می‌دهد یا خیر.
    • logpath: مسیری که به Fail2ban می‌گوید لاگ‌های یک سرویس، در کجا قرار دارند.

    مقدار filter در واقع به فایلی در دایرکتوری /etc/fail2ban/filter.d اشاره می‌کند، که پسوند .conf آن حذف شده است. این فایل‌ شامل عبارات منظم (Regular Expressions) هست که تعیین می‌کند آیا یک خط در لاگ، نشان‌دهنده یک تلاش ناموفق است یا خیر. این مقاله به جزئیات این فایل نمی‌پردازد زیرا این تنظیمات پیچیده هستند. با این حال، برای مشاهده فیلترهای موجود، می‌توانید دایرکتوری زیر را بررسی کنید:

    ls /etc/fail2ban/filter.d

    اگر فایلی مرتبط با سرویسی که استفاده می‌کنید در دایرکتوری /etc/fail2ban/filter.d پیدا کردید، بهتر است آن را با یک ویرایشگر متنی باز کنید. اکثر این فایل‌ها به‌خوبی با کامنت‌ها، توضیح داده شده‌اند و می‌توانید متوجه شوید که هر اسکریپت برای مقابله با چه نوع شرایطی طراحی شده است. بیشتر این فیلترها دارای بخش‌های از پیش تعریف‌شده (و غیرفعال) در فایل jail.conf هستند که در صورت نیاز می‌توانید آن‌ها را در فایل jail.local فعال کنید.

    فرض کنید وب‌سایتی را با Nginx میزبانی می‌کنید و بخشی از سایت که رمزدار است تحت حملات متعدد برای ورود قرار گرفته است. در این حالت، می‌توانید به Fail2ban بگویید از فایل nginx-http-auth.conf برای بررسی این وضعیت در فایل لاگ /var/log/nginx/error.log استفاده کند.

    این پیکربندی از پیش در بخشی به نام [nginx-http-auth] در فایل /etc/fail2ban/jail.conf تعریف شده است. تنها کافی است پارامتر enabled را به این شکل اضافه کنید:

    . . .
    [nginx-http-auth]
    
    enabled = true
    . . .

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

    sudo systemctl enable fail2ban

    سپس؛ برای بار اول به صورت دستی، fail2ban را با دستور زیر، اجرا کنید:

    sudo systemctl start fail2ban

    برای اطمینان از اجرای صحیح سرویس، از دستور زیر استفاده کنید:

    sudo systemctl status fail2ban

    اگر سرویس به‌درستی اجرا شده باشد، خروجی مشابه زیر نمایش داده می‌شود:

    Output
    ● fail2ban.service - Fail2Ban Service
         Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enab>
         Active: active (running) since Mon 2022-06-27 19:25:15 UTC; 3s ago
           Docs: man:fail2ban(1)
       Main PID: 39396 (fail2ban-server)
          Tasks: 5 (limit: 1119)
         Memory: 12.9M
            CPU: 278ms
         CGroup: /system.slice/fail2ban.service
                 └─39396 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
    
    Jun 27 19:25:15 fail2ban22 systemd[1]: Started Fail2Ban Service.
    Jun 27 19:25:15 fail2ban22 fail2ban-server[39396]: Server ready

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

    همچنین بخوانید: نحوه نصب و استفاده از mosh روی سرور مجازی (VPS)

    مرحله ۳ – تست سیاست‌های مسدودسازی (اختیاری)

    برای آزمایش عملکرد Fail2ban، می‌توانید با استفاده از یک سرور مجازی (VPS) دیگر (که در آینده نیازی به دسترسی به سرور Fail2ban شما نخواهد داشت)، قوانین مسدودسازی را بررسی کنید. در ابتدا از سرور مجازی دوم خود به سرور مجازی شامل Fail2ban متصل شوید و یک نام کاربری غیرواقعی وارد کنید:

    ssh blah@your_server

    هنگام درخواست رمز عبور، کاراکترهای تصادفی وارد کنید و این کار را چندین بار تکرار کنید. پس از چند بار تلاش ناموفق، پیام خطا از Permission denied به Connection refused تغییر می‌کند. این پیام نشان‌دهنده این است که سرور مجازی دوم شما توسط Fail2ban از دسترسی به سرور مجازی Fail2ban مسدود شده است.

    روی سرور Fail2ban، می‌توانید قوانین جدید مسدودسازی را با استفاده از دستور iptables مشاهده کنید:

    sudo iptables -S

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

    -P INPUT DROP
    -P FORWARD DROP
    -P OUTPUT ACCEPT
    -N f2b-sshd
    -N ufw-after-forward
    -N ufw-after-input
    -N ufw-after-logging-forward
    -N ufw-after-logging-input
    -N ufw-after-logging-output
    -N ufw-after-output
    -N ufw-before-forward
    -N ufw-before-input
    -N ufw-before-logging-forward
    -N ufw-before-logging-input
    -N ufw-before-logging-output

    برای مشاهده قوانینی که Fail2ban به فایروال اضافه کرده است، می‌توانید خروجی دستور iptables -S را با دستور grep ترکیب کنید تا به‌طور خاص دنبال رشته‌ی f2b بگردید. این رشته نشان‌دهنده قوانینی است که Fail2ban برای مسدودسازی تنظیم کرده است:

    sudo iptables -S | grep f2b

    در خروجی، قطعه کدی شبیه به موارد زیر نمایش داده خواهد شد:

    -N f2b-sshd
    -A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
    -A f2b-sshd -s 134.209.165.184/32 -j REJECT --reject-with icmp-port-unreachable
    -A f2b-sshd -j RETURN

    خطی که حاوی REJECT --reject-with icmp-port-unreachable است، توسط Fail2ban اضافه شده است و باید شامل آدرس IP سرور دوم شما باشد. این خط نشان‌دهنده این است که Fail2ban درخواست‌های ورودی از آدرس IP مسدود شده را رد کرده است و به جای پاسخ به درخواست، پیامی با نوع icmp-port-unreachable ارسال می‌کند تا از دسترسی غیرمجاز جلوگیری کند.

    نتیجه‌گیری

    حالا باید بتوانید سیاست‌های مسدودسازی را، برای خدمات خود پیکربندی کنید. Fail2ban ابزاری مفید برای محافظت از هر نوع سرویسی است که از احراز هویت استفاده می‌کند.

    همچنین، شما می‌توانید از سرویس VPS (سرور مجازی) لیارا، استفاده کنید. سرور مجازی لیارا، با ارائه زیر ساخت منعطف و مقیاس‌پذیر، با آخرین به‌روزرسانی‌های نرم‌افزاری و سخت‌افزاری، این امکان را به شما می‌دهد تا در سریع‌ترین زمان ممکن و به ساده‌ترین روش‌های موجود، برنامه‌های خود را توسعه دهید.

    همچنین بخوانید: ۵۰ دستور برتر لینوکس Linux که باید بدانید

    ســــــــــــــــــــــال‌هاست که هستیم

    ۶ سال در کنار شما تجربه جمع کردیم. تازه در ابتدای مسیر هستیم، مسیر ساخت آینده.

    sixth

    جمع‌مـــــــــــان، جمع است

    بیش از ۴۰ هزار توسعه‌دهنده و صاحبان کسب و کار در جمع ما هستند. جای شما خالی‌ست...

    usersnumberusers

    خدمات رایگان لیارا

    ۲.۵ گیگابایت فضای ذخیره‌سازی ابری رایگان۲.۵ گیگابایت فضای ذخیره‌سازی ابری رایگان

    ۲.۵ گیگابایت Object Storage سازگار با پروتکل S3 با دیسک‌های SSD به‌صورت رایگان دریافت کنید.

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

    دیتابیس‌های MariaDB، PostgreSQL و Redis را فقط با یک کلیک و به‌صورت رایگان تهیه کنید.

    سرویس DNS رایگانسرویس DNS رایگان

    به سادگی دامنه‌تان را اضافه کنید و به صورت رایگان رکورد‌های آن را مدیریت کنید.

    ۱۰۰ هزار تومان اعتبار اولیه۱۰۰ هزار تومان اعتبار اولیه

    بعد از ثبت نام در لیارا مبلغ ۱۰۰ هزار تومان اعتبار هدیه دریافت می‌کنید که با توجه به ساعتی بودن هزینه سرویس‌ها، می‌توانید تمامی خدمات پولی را برای چندین هفته رایگان استفاده کنید.

    ارسال ۱۰۰ ایمیل تراکنشی رایگان در هر ماهارسال ۱۰۰ ایمیل تراکنشی رایگان در هر ماه

    در سرویس ایمیل لیارا شما می‌توانید تا ۱۰۰ ایمیل رایگان در هر ماه ارسال کنید. (به‌همراه دسترسی SMTP)

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

    تفاوتی ندارد برای وبسایت خود از Node استفاده می‌کنید یا Laravel و Django، در لیارا می‌توانید به صورت کاملا رایگان آن را میزبانی کنید.

    همراه شما هستیم

    در خصوص سفارش یا استفاده از سرویس‌ها سوالی دارید؟
    تلفن واحد فروش:
    ۰۲۵-۳۳۵۵۷۶۱۹ (روزهای کاری ۹ الی ۱۷)
    call
    تلفن واحد فروش: ۳۳۵۵۷۶۱۹-۰۲۵ (روزهای کاری ۹ الی ۱۷)