آموزش محافظت از وب سرور Nginx توسط Fail2ban

رضا فرخندگان ۱۸ اردیبهشت ۱۳۹۸ ۰ دیدگاه

قصد داریم تو این بخش آموزش محافظت از وب سرور Nginx توسط Fail2ban رو آموزش بدیم. وقتی بحث استفاده از وب سرور باشه، من خودم همواره استفاده از Nginx رو ترجیح دادم. شاید بیشتر به خاطر اینکه سرعتش فوق العاده ست و کانفیگ راحتش باعث می‌شه که خیلیا ازش راضی باشن، ولی بهرحال واقعاً نمیشه قدرت آپاچی رو به هیچ عنوان انکار کرد.

آموزش محافظت از وب سرور Nginx توسط Fail2ban

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

Fail2ban چیست؟

Fail2ban یه سرویس نرم‌افزاریه که با پایتون نوشته شده و به‌عنوان یه حفاظ عمل می‌کنه و از سرورها در مقابل یک سری حملات brute-force مراقبت می‌کنه. کار این حملات اینه که بر اساس آزمون و خطا (Trial and Error) عمل می‌کنن و خیلی بیشتر می‌تونن با این روش سرورها رو به زانو در بیارن و اطلاعات کاربران رو بدزدند.

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

fail2ban حتی می‌تونه مانع از حملات DDOS هم بشه و اگر مثلاً تعداد درخواست‌های http بیشتر از یه حدی از سمت یه ip خاص بالاتر بره، شروع می‌کنه به ban کردن اون ip های درخواست دهنده که از یه محدودیت set شده بالاتر رفتن.

شاید بگین ایمن کردن وبسایت‌ها و اپلیکیشن‌هاتون با فایروال‌های نرم‌افزاری و محدود کردن دسترسی‌ها که خوبه، پس چرا باید ازFail2ban  استفاده کنیم؟

در جواب باید بگیم که اون فقط یه شروع برای ایمن کردن سیستم‌ها و وبسایت‌هاتون بوده و هر سرویسی که به صورت عمومی سیستم login داشته باشه و نام کاربری و رمز عبور بخواد، قطعاً پتانسیل اینو داره که همچین حملاتی رو جذب کنه و شما باید براش آماده باشید و در این راه fail2ban به‌عنوان یک برنامه آزاد/متن باز که هم سبک، ساده و بدون دردسره، خیلی می‌تونه کمکتون کنه و تقریباً دست این دوستان بات و نرم‌افزارهای اتوماتیک رو از وب‌سایت و وب سرور و سرویس ssh و غیره کوتاه کنه.

Fail2ban چیست؟

نحوه عملکرد Fail2ban

همونطور که از اسم این سرویس معلومه، میگه fail کنید تا ban بشید. مثلاً اگر یه کاربر که می‌خواد login کنه و به تکرار در ۳۰ دقیقه ۵ بار نام کاربریش رو با چند رمز مختلف حتی به اشتباه و غیر عمد وارد کنه، fail2ban به سرعت در مرحله اول برای یه مدتی که خودتون هم (به‌عنوان Admin) می‌تونید تعریفش کنید، دست اون کاربر رو از وب‌سایت شما کوتاه می‌کنه و دیگه نمی‌تونه حتی نام کاربری و رمز عبور خودش رو امتحان کنه.

حتی اگر یه کاربر بخواد کارای مشکوک انجام بده و مثلاً توی یک ساعت بیشتر از ۱۰ بار login و logout کنه هم می‌تونه شامل این قوانین بشه. با توجه به توضیحاتی که دادیم، حملات brute-force هم از همین جنس هستن و یه بات اگر بخواد هی مداوم تلاش کنه و تلاش کنه، به‌راحتی ban شده و دیگه نمی‌تونه از اون آی‌پی خاص استفاده کنه.

داخل fail2ban یک سری فایل کانفیگ وجود داره که عزیزان سازنده‌اش اسمی بس برازنده براش انتخاب کردن بنام ” jail ” یا همون زندان که این تنظیمات بر مبنای فایل‌هایlog  سرویس‌های مختلف، تنظیم و اجرا می‌شن و همونطور که می‌دونید همه لاگ‌ها رو می‌شه داخل /var/log  پیدا کرد که nginx هم از این قاعده مستثنی نیست.

اگر کاربری تلاش کنه که وارد سیستم بشه و نتونه، قطعاً براش یه لاگ وجود خواهد داشت که با توجه به همین فایل لاگ، fail2ban می‌تونه اونارو بررسی کرده و اگر مشکوک بود، بعد از چند تلاش ناموفق اون کاربر یا بات یا هر کسی که هست رو بر اساس آی‌پی، ban می‌کنه و برای مدت کوتاهی زندانی شده و دسترسیش قطع می‌شه و اگر بیشتر تکرار کنه، برای همیشه می‌تونه ban بشه.

پیش نیازها

کافیه فقط یک سرور یا دسکتاپ (Debian base) اوبونتو ۱۸.۰۴ (یا Debian) آماده داشته باشید که البته این آموزش می‌تونه برای نسخه ۱۴ به بالای اوبونتو کاملاً جوابگو باشه. همچنین کاربری شما باید دسترسی Sudo داشته باشه و به اینترنت متصل باشید.

نصب Nginx

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

sudo apt update && sudo apt upgrade
sudo apt install nginx

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

همونطور که گفتیم fail2ban بر اساس فایل‌های لاگ که خطای ورود و خروج رو ثبت می‌کنن، کار می‌کنه. در حالت عادی سرور nginx سیستم ورود و خروج نداره و  نام کاربری و رمز عبور نمی‌خواد و باید براش راه‌اندازی کنید.

برای این کار اول باید فایلی رو بسازید که ترکیب رمزنگاری شده‌ی نام کاربری و کلمه عبور شما رو در خودش داشته باشه به نام “.htpasswd”. روش‌های مختلفی وجود داره که یکیش از طریق Apache-utils انجام می‌شه، و یکی دیگه استفاده ازOpenSSL هست که ما اینجا روش دوم رو توضیح می‌دیم؛ چون معمولاً OpenSSL روی سرورها و توزیع۲های لینوکس به صورت پیش‌فرض نصب شده و در دسترس کاربران قرار گرفته.

ساختن فایل htpasswd. (سیستم ورود/خروج برای nginx)

ساختن فایل .htpasswd

فایل htpasswd. رو با استفاده از OpenSSL می‌سازیم و داخل مسیر /etc/nginx قرار می‌دیم تا ترکیب Hash شده نام کاربری و کلمه عبور مورد نظرمون رو در اون ذخیره کنیم و ازش داخل تنظیمات Virtual host مربوطه استفاده کنیم.

با استفاده از دستور زیر می‌تونید فایل htpasswd. رو بسازید و نام کاربری رو داخلش قرار بدید، ما اینجا از نام کاربری ali استفاده کردیم و شما می‌تونید نام کاربری مورد نظر خودتون رو بجای اون قرار بدید:

sudo sh -c “echo -n ‘ali:’ >> /etc/nginx/.htpasswd”

حالا باید با استفاده از OpenSSL کلمه رمز رو تولید کنید و اون رو به‌صورت رمزنگاری شده با نام کاربری ترکیب کنید و داخل فایل htpasswd. قرار بدید. وقتی دستور زیر رو اجرکنید ازتون رمز عبور رو برای خط hash شده (که شامل نام ali هست) میپرسه و شما باید بهش رمز عبور مد نظرتون رو بدید:

sudo sh -c “openssl passwd -apr1 >> /etc/nginx/.htpasswd”

یادتون نره که می‌تونید هر چند تا نام کاربری و کلمه عبور می‌خواهید با همین روش تولید کنید و برای سرویس‌های مختلف ازش استفاده کنید و همشون رو داخل همین فایل htpasswd. قرار بدید. فقط کافیه داخل تنظیمات Virtual Host مربوط به اون سرویس مد نظرتون، به nginx بگید که قبل از دسترسی نام کاربری و کلمه عبور رو بپرسه.

اگر فایل htpasswd. رو بررسی کنید، یه همچین چیزی میبینید:

cat /etc/nginx/.htpasswd

Output
ali:$apr1$wI1/T0nB$jEKuTJHkTOOWkopnXqC1d1

تنظیمات Nginx برای سیستم احراز هویت کاربران

در اینجا باید تنظیماتی انجام بدیم که وب سرور Nginx قبل از ارائه‌ی محتوای مد نظر ما که میخواهیم محافظت بشه، این فایل رو بررسی کنه و تایید کنه که کاربری که نام و کلمه عبورش رو وارد می‌کنه اصلاً می‌تونه دسترسی داشته باشه یا نه؟

برای این کار لازمه ما تنظیمات مد نظر رو در مورد اون فایل Virtual host انجام بدیم. حالا اگر فرض کنیم که فایل ما همون فایل default داخل آدرس /etc/nginx/sites-available باشه، با این دستور می‌تونید محتوای داخل فایل تنظیمات default رو ببینید و تغییر بدید:

sudo vi /etc/nginx/sites-enabled/default

نکته: یادتون نره که اگر نمی‌خواهید از این فایل default استفاده کنید، بهتره ازش کپی بگیرید و جای دیگه‌ای یه نسخه ازش داشته باشید.این تنظیمات رو کپی کنید تا فایل اصلی دست نخورده بمونه یا کلاً اون رو Unlink کنید.

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

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.html index.htm;
    server_name localhost;

    location / {
       try_files $uri $uri/ =404;

    }
}

حالا بسته به نوع محدودیت دسترسی که می‌خواهید اعمال کنید، می‌تونید انواع مختلفی از تنظیمات رو انجام بدید تا دسترسی به محتوا رو محدود کنید. تنظیمات مربوط به این کار می‌تونه در مرحله server یا روی location ها انجام بشه.

تنظیمات سیستم ورود و خروج

در این مورد ما تصمیم داریم فقط برای نشون دادن اینکه این روش چطور کار می‌کنه، محتوای root تعریف شده برای سرور رو محدود کنیم تا فقط به هدفمون برسیم. برای محدود کردن location های مختلف می‌تونید از دستور auth_basic در تنظیمات هاست مجازی، برای فعال کردن سیستم احراز هویت، و یک نام برای نمایش اینکه چه نوع محدودیتی قرار دادیم، استفاده کنید. در خط بعد از دستوری استفاده می‌کنیم که نشون بده فایل مربوط به نام‌های کاربری و رمز هاشون کجا قرار داره با عنوان auth_basic_user_file .

با اضافه کردن این تنظیمات فایل virtual host ما این شکلی می‌شه (می‌تونید کل نوشته‌های داخل default رو پاک کنید و اینارو کپی/پیست کنید):

server {
     listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.html index.htm;
    server_name localhost;

    location / {
       try_files $uri $uri/ =404;
      auth_basic “Restricted Content”;
      auth_basic_user_file /etc/nginx/.htpasswd;
    }
}

بعد از تموم شدن کار تنظیمات فایل رو ذخیره کنید و خارج بشید. سرویس nginx رو restart یا reload (که reload کردن همیشه بهتره( کنید تا تغییرات انجام شده رو فعال کنه:

sudo service nginx reload

اگر مرورگرتون رو باز کنید و اون آدرس مد نظرتون رو وارد کنید، باید ازتون نام کاربری و رمز عبور بخواد که در این مورد ما نام server رو localhost قرار دادیم: 

http://localhost

تا اینجا ما تونستیم به وب سرور بگیم که سیستم احراز هویت رو برقرار کنه و اگر از این به بعد کسی نتونه وارد این صفحه بشه و یا اشتباهی نام کاربری و رمزش رو بده، میشه داخل فایل /var/log/nginx/error.log/ موارد ثبت شده رو پیدا کرد که برنامه fail2ban هم دقیقاً از همین log ها استفاده می‌کنه. مثلاً روی ubuntu 18.04 لاگ این error ها میره داخل فایل var/log/nginx/error.log.1/.

نصب Fial2Ban

خب همه چی آماده ست که نصب رو شروع کنیم:

sudo apt update
sudo apt install fail2ban

این دستور fail2ban رو نصب می‌کنه، اما لازمه بدونید که در حالت پیش‌فرض fail2ban فقط تلاش‌های ناموفق روی ssh رو ban می‌کنه و برای کارهای دیگه باید تنظیمات خاص خودشون رو انجام بدیم.

تنظیمات Fail2Ban

همونطور که گفتیم باید تنظیمات خاصی رو انجام بدیم تا بتونیم وظایف مشخصی رو بهش بدیم. فایلی که fail2ban تنظیماتش رو داخل اون نگه می‌داره رو می‌تونید داخل مسیر /etc/fail2ban/jail.conf پیدا کنید.

برای اینکه ما تغییرات خودمون رو اعمال کنیم، اصلاً لازم نیست این فایل رو تغییر بدیم و فقط کافیه این فایل رو کپی کنید به اسم jail.local و داخل فایل جدید تغییرات رو انجام بدیم. fail2ban همچنان این فایل رو هم خواهد فهمید:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

حالا فایل رو باز کنید و بیایید یه نگاهی به تنظیمات پیش‌فرض اون بندازیم:

sudo vi /etc/fail2ban/jail.local

بررسی فایل jail.local و اعمال تغییرات

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

یکی از اولین چیزهایی که باید بهش توجه کنید، بخش [DEFAULT] هست.

شاید ما نیاز داشته باشیم کاربران خاصی رو از این قوانین set شده مستثنی کنیم. این نوع Policy  ها با دستور ignoreip مشخص می‌شن.

مثلاً خیلی‌ها حتماً ip local خودشون رو در این قسمت وارد می‌کنن که هیچوقت شامل این قوانین نشن و اگر یه وقت کلمه عبور یادشون رفت، دسترسی شون به سیستم خودشون قطع نشه:

بررسی فایل jail.local و اعمال تغییرات

/etc/fail2ban/jail.local

[DEFAULT]
ignoreip = 127.0.0.1/8    # آی پی شما

آیتم دیگه ای که ممکنه شما بخواهید تغییرش بدید، بخش bantime هست که مشخص می‌کنه یه کاربر تا چند ثانیه (s) (دقیقه m یا ساعت h) باید دسترسیش از سیستم قطع یا ban بشه.

توجه: این فایل رو خوب مطالعه کنید چون در هر قسمت از تنظیمات، توضیحات خوبی ارائه داده که شک و شبهه‌ای در مورد دستورات داخل این فایل به جا نمی‌گذاره. اگر باز هم مشکلی داشتید حتماً man page ، fail2ban رو بخونید.

از موارد دیگه در این فایل findtime و maxretry هستن. در اینجا این دو دستور با هم کار می‌کنن و findtime معمولاً به ثانیه تعریف می‌شه (می‌تونه دقیقه و ساعت هم باشه) و maxretry همونطور که از اسمش پیداست نشون می‌ده که هر کاربر چند بار می‌تونه ورود به سیستم رو دوباره امتحان کنه. حالا این دوتا با هم نشون می‌دن که یک کاربر کلاً در یک بازه زمانی مشخص چند بار می‌تونه login رو دوباره و دوباره امتحان یا همون retry کنه. مثلاً داخل فایل می‌تونه این شکلی باشه:

etc/fail2ban/jail.local/

[DEFAULT]
. . .

findtime = 3600   # این دو خط باهم میتونن به این شکل ترکیب بشن دقت کنید که حالت پیش فرض این فایل بر ثانیه محاسبه میشه

maxretry = 6     

# با توجه به مقدار این قسمت میشه تعیین کرد هر کاربر در بازه زمانی بالا چند بار میتونه تلاش کنه که وارد بشه و اگر
#بیشتر شد از ورودش ممانعت میشه

 

 

تنظیمات ایمیل

اگر به ادامه تنظیمات در فایل jail.local دقت کنید، می‌تونید ببینید که تنظیمات خاصی برای سیستم MTA هم وجود داره. یعنی اینکه اگر خواستید، می‌تونید مشخص کنید در صورتی که کسی نتونست وارد بشه و Ban شد یا به هر دلیل کسی تلاش کرد که به سیستم نفوذ کنه، به ما ایمیل ارسال بشه. برای ارسال ایمیل هم می‌تونید سیستم MTA رو روی سیستم خودتون نصب و راه‌اندازی کنید که برای اون می‌تونید به این مطلب مراجعه کنید.

تنظیمات مربوط به ایمیل در Jail.local

حالا که سیستم ایمیل شما فعال شده، می‌تونید باز هم یه سری تغییرات داخل بخش DEFAULT انجام بدید. اگر طبق مطلبی که برای نصب و راه‌اندازی Postfix گفتیم عمل کردید، داخل بخش [DEFAULT] مقدار mta رو مساوی mail قرار بدید و بعد مشخص کنید که در قسمت destmail ایمیل‌ها به چه کسی ارسال بشه و با تغییر مقدار sendername می‌تونید مشخص کنید که ایمیل از کجا و از طرف چه کسی ارسال می‌شه.

در تنظیمات fail2ban ، از اصطلاح action در موارد مختلف استفاده میشه. action در واقع به پروسه‌ای گفته می‌شه که وقتی یک کاربر تلاش‌های زیادی می‌کنه اما نمی‌تونه وارد سیستم بشه و ip ban می‌شه، بر اساس اون سیستم تصمیم (action) می‌گیره باید چیکار بکنه. حالا action به‌صورت default اینه که اون کاربر با ip مشخص روی اون پورت مشخص ban بشه؛ اما اگر سیستم MTA رو راه‌اندازی کرده باشید می‌تونید از روش‌های دیگه هم استفاده کنید.

مثلاً  از action_mw استفاده کنید تا fail2ban بعد از ban کردن اون ip، یه پیام به ایمیلی که شما مشخص کردید با یک گزارش وقایع ارسال کنه تا شما بتونید در موردش تصمیم بگیرید. شما حتی می‌تونید از action_mwl استفاده کنید تا بهتون log مربوط به این اتفاق رو هم ارسال کنه و شما متوجه بشید چه لاگی باعث این ban شده. چند مورد بالا رو داخل فایل به این شکل می‌تونید تغییر بدید:

etc/fail2ban/jail.local/

[default]
. . .
mta = mail
destemail = youraccount@email.com
sendername = fail2banalerts
action = %(action_mwl)s

تنظیمات fail2ban برای نظارت به log های Nginx

خب حالا که یک سری از تنظیمات کلی fail2ban رو دیدیم، می‌تونیم روی تنظیمات خاص nginx برای jail ها تمرکز کنیم و ببینیم اصلاً اینها چطوری وب سرور ما رو زیرنظر دارن و به چه رفتارهایی روی log ها حساس هستن.

اگر فایل jail.local رو به دقت نگاه کنید، متوجه می‌شید که هر بخش (به‌غیر از بخش [DEFAULT] )، یک jail هست با یک سری مشخصات و یک نام مخصوص که این اسامی داخل براکت قرار دارن، و در حالت پیش‌فرض فقط زندان مربوط به ssh فعاله و بقیه اون بخش‌ها باید به دلخواه ما تغییر داده بشن.

برای اینکه fail2ban به log های nginx نظارت کنه، باید بخش (زندان) مربوط به خودش یعنی [nginx-http-auth] رو تغییر بدیم، تنظیماتش رو عوض کنیم و فعالش کنیم. البته ممکنه این تنظیمات به صورت پیش‌فرض وجود نداشته باشن که خودتون می‌تونید مثل من تغییرش بدید و مقدار enabled رو مساوی true قرار بدید تا این زندان فعال بشه. می‌تونید به این شکل تغییرش بدید:

etc/fail2ban/jail.local/

[nginx-http-auth]
enabled  = true
filter   = nginx-http-auth\
port     = http,https
logpath  = /var/log/nginx/error.log

شاید براتون سوال بشه که اینها رو از کجا آوردیم؟ می‌تونید نحوه ایجاد تغییرات در این فایل رو در وب‌سایت اصلی fail2ban در اینجا  ببینید که شامل بخش Nginx هم می‌شه. فقط یادتون نره که این تنظیمات برای زندان مخصوص nginx در بسته قابل نصب fail2ban مربوط به ubuntu انجام شده ولی ما درواقع می‌تونیم حتی زندان‌های خاص خودمون رو طراحی کنیم و براشون تنظیمات خاصی هم در نظر بگیریم.

انواع مختلف Jail

مثلاً می‌تونیم زندانی بسازیم به نام [nginx-noscript] که کاربرانی رو تحت نظر داشته باشه که بدنبال اسکریپت‌های نوشته شده به روی وب‌سایت هستن تا کارهایی باهاشون انجام بدن یا ازشون سوءاستفاده کنن. اگر از PHP یا زبان‌هایی که مستقیماً در ارتباط با وب سرور شما هستن “استفاده نمی‌کنید”، می‌تونید از این زندان استفاده کنید:

etc/fail2ban/jail.local/

[nginx-noscript]
enabled  = true
port     = http,https
filter   = nginx-noscript
logpath  = /var/log/nginx/access.log
maxretry = 6
. . .

دقت کنید که می‌تونید که زندان‌های مربوط به nginx رو بعد از خط jail ، [nginx-http-auth] به فایل اضافه کنید.

می‌تونید زندان مربوط به [nginx-badbots] رو استفاده کنید که درخواست‌های ارسالی از bot های شناخته شده رو ban می‌کنه.

اگر nginx رو طوری تنظیم کردید که کاربران به محتوای وب روی مسیر home خودشون دسترسی نداشته باشن، می‌تونید کاربرانی رو که این درخواست‌ها رو ارسال می‌کنن هم با استفاده از زندان [nginx-nohome] ban کنید.

etc/fail2ban/jail.local/

[nginx-badbots]
enabled  = true
port     = http,https
filter   = nginx-badbots
logpath  = /var/log/nginx/access.log
maxretry = 2

[nginx-nohome]
enabled  = true
port     = http,https
filter   = nginx-nohome
logpath  = /var/log/nginx/access.log
maxretry = 2

در حالت عادی شما نباید اجازه بدید هیچ کاربری از وب سرور شما به‌عنوان یک پروکسی ” باز و در دسترس ” استفاده کنه. برای اینکه مانع از اینکار بشید از زندان [nginx-noproxy]  استفاده کنید.

etc/fail2ban/jail.local/

[nginx-noproxy]
enabled  = true
port     = http,https
filter   = nginx-noproxy
logpath  = /var/log/nginx/access.log
maxretry = 2

پس از اعمال تغییرات، اون رو ذخیره کنید. حالا باید با اضافه کردن یک سری فیلتر به jail هایی که در داخل فایل /etc/fail2ban/jail.local ساختیم، محدودیت‌های مد نظرمون رو اعمال کنیم.

اضافه کردن فیلترها به زندان های اضافه شده برای Nginx

تا به اینجا ما فایل etc/fail2ban/jail.local/ رو به‌روزرسانی کردیم و در اون زندان‌هایی (خطوط تنظیمات jail ها) رو اضافه کردیم که رفتارهای مختلفی که مشکوک یا خطرناک هستن رو ban کنن. حالا باید برای این jail هایی که ساختیم یک سری فیلتر تعریف کنیم. این فایل‌های فیلتر در واقع به‌دنبال رفتارهای خاص داخل log های nginx خواهند بود. اول باید وارد مسیر فیلترها بشید:

cd  /etc/fail2ban/filter.d

مرحله اول

ما در مرحله اول می‌خواهیم فایلی رو بسازیم که pattern فیلترینگ خود nginx رو برای سیستم احراز هویت دستکاری کنه تا یک حالت دیگه‌ای از خطاهای کاربرانی که نتونستن وارد سیستم بشن رو هم بشناسه و log فایل‌ها رو بررسی کنه. این فایل رو باز کنید:

sudo vi nginx-http-auth.conf

با اضافه کردن این failregex به ادامه فایل ما درواقع نوعی از رفتار رو تعریف می‌کینم که در اون اگر کاربری تلاش کرد بدون وارد کردن نام کاربری یا کلمه عبور(یعنی بدون هر دو) وارد سیستم بشه، رو هم شناسایی کنیم (خط قرمز رو کپی/پیست کنید):

etc/fail2ban/filter.d/nginx-http-auth.conf/

[DEFINITION]

failregex = ^ \[error\] \d+#\d+: \*\d+ user “\S+”:? (password mismatch|was not found in “.*”), client: , server: \S+, request: “\S+ \S+ HTTP/\d+\.\d+”, host: “\S+”\s*$

            ^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: , server: \S+, request: “\S+ \S+ HTTP/\d+\.\d+”, host: “\S+”\s*$

ignoreregex =

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

مرحله دوم

 در مرحله ۲ میریم سراغban  کردن bot ها که می‌تونیم از تنظیمات apache برای این کار استفاده کنیم.

فقط کافیه که فایل apache-badbots.conf رو برای فیلتر بعدی استفاده کنیم و ازش یه کپی با اسم nginx بسازیم:

sudo cp apache-badbots.conf nginx-badbots.conf

حالا با ساختن فیلتر nginx-badbots.conf این فیلتر هم با تنظیمات apache برای وب سرور ما هم کار خواهد کرد.

  • دقت کنید که فقط کپی کردن این فایل به نام فایل جدید کافیه و نیازی به اضافه و کم کردن تنظیمات خاصی نیست مگر اینکه خودتون بخواهید تغییرات مختل اعمال کنید.

مرحله سوم

مرحله ۳ ساختن فیلتر برای زندان [nginx-noscript]  ، که اول باید فایل فیلترینگ رو براش بسازیم:

sudo vi nginx-noscript.conf

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

etc/fail2ban/filter.d/nginx-noscript.conf/

[DEFINITION]

failregex = ^ -.*get.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)

ignoreregex =

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

مرحله چهارم

مرحله ۴ ساختن فیلتر برای [nginx-nohome] ، اول فایل رو باز کنید و بعد محتوای زیر رو اضافه کنید:

sudo vi nginx-nohome.conf

etc/fail2ban/filter.d/nginx-nohome.conf/

[Definition]

failregex = ^ -.*GET .*/~.*

ignoreregex =

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

مرحله پنجم

در مرحله آخر این بخش باید یک فایل فیلتر دیگه برای زندان [nginx-noproxy] بسازیم.

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

sudo vi nginx-noproxy.conf

etc/fail2ban/filter.d/nginx-noproxy.conf/

[Definition]

failregex = ^ -.*GET http.*

ignoreregex =

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

 برای فعال‌سازی این تغییرات انجام شده باید سرویس fail2ban رو restart کنید:

sudo service fail2ban restart

زندان های فعال شده در fail2ban

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

sudo fail2ban-client status

یه همچین خروجی نمایش میده:


-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-nginx-badbots
-N fail2ban-nginx-http-auth
-N fail2ban-nginx-nohome
-N fail2ban-nginx-noproxy
-N fail2ban-nginx-noscript
-N fail2ban-ssh
-A INPUT -p tcp -m multiport –dports 80,443 -j fail2ban-nginx-noproxy
-A INPUT -p tcp -m multiport –dports 80,443 -j fail2ban-nginx-nohome
-A INPUT -p tcp -m multiport –dports 80,443 -j fail2ban-nginx-badbots
-A INPUT -p tcp -m multiport –dports 80,443 -j fail2ban-nginx-noscript

بعد از اجرای این دستور شما باید یک لیستی از زندان‌های فعال شده رو ببینید. شما می‌تونید به iptables نگاهی بندازید و ببینید چطور fail2ban قوانین فایروال شما رو تغییر داده تا یک چهارچوب رو تعریف کنه برای ban کردن. جالب اینجاست که حتی اگر شما قبلاً قوانینی برای firewall تعریف نکرده باشید، خواهید دید که fail2ban این قوانین رو کاملاً هدف‌دار برای شما روی iptable پیاده کرده:

sudo iptables -S

حالا اگر بخواهید جزئیات ban های اتفاق افتاده توسط fail2ban و زندان‌هاش رو ببینید، احتمالاً راحت‌ترین کار بررسی کردن وضعیت fail2ban-client باشه:

sudo fail2ban-client status nginx-http-auth

یه خروجی به این شکل خواهد داشت:

Status for the jail: nginx-http-auth

|- filter

|  |- File list:        /var/log/nginx/error.log

|  |- Currently failed: 0

|  `- Total failed:     ۰

`- action

   |- Currently banned: 0

   |  `- IP list:

تست قوانین وضع شده توسط fail2ban

دوستان این خیلی مهمه که قوانین وضع شده خودتون رو حتماً امتحان کنید و مطمئن بشید که کار می‌کنه یا نه. مثلاً اگر سیستم احراز هویت روی nginx گذاشتید، می‌تونید چند بار به‌صورت عمدی اطلاعات رو اشتباهی وارد کنید و ببینید که آیا شما روban  می‌کنه یا نه.

اگر email رو فعال کردید تا بهتون اطلاع بده در مورد ban شده‌ها آیا بهتون ایمیل رسیده یا نه، به fail2ban-client نگاهی بندازید. باید یه آی‌پی ban شده ببینید.

مثلاً یه خروجی به این شکل خواهد داشت:

Status for the jail: nginx-http-auth

|- filter

|  |- File list:        /var/log/nginx/error.log

|  |- Currently failed: 0

|  `- Total failed:     ۱۲

`- action

   |- Currently banned: 1

   |  `- IP list:       ۱۱۱.۱۱۱.۱۱۱.۱۱۱

   `- Total banned:     ۱

حالا اگر بخواهید اینها رو بصورت دستی از ban خارج کنید، چیکار می‌تونید بکنید؟ مثلاً اگر ip موردنظر ۱۱۱.۱۱۱.۱۱۱.۱۱۱ باشه، می‌تونید اینطوری اونا رو از ban خارج کنید:

sudo fail2ban-client set nginx-http-auth unbanip 111.111.111.111

 

نتیجه‌گیری

دوستان عزیز در این آموزش دیدید که چطور fail2ban می‌تونه با یک سری تنظیمات اولیه و ساده یک امنیت بسیار مناسب رو براتون فراهم کنه. هر چند که fail2ban یک framwork ساده به‌حساب میاد ولی تنظیمات بسیار زیادی داره و می‌شه خیلی در موردش مانور داد. 

اگر خودتون هم کمی داخل فایل‌های اصلی تنظیمات اشاره شده مثل jail.local ، filter.d و action.d کمی چرخ بزنید، می‌تونید کارای جالبی رو برای امنیت بیشتر انجام بدید.

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

جمع آوری شده توسط: حمید نبی زاده

فناوران شبکه سینداد (آهنگ نوآوری)

سینداد یعنی هدیه‌ی سیمرغ، یا فرزند سیمرغ؛ به عبارتی یعنی خود سیمرغ، با همه ی شگفتی هایش، اما جوانتر و سرزنده تر. و این چیزی است که ما سعی می کنیم در سینداد باشیم. از سال ۱۳۸۵ دانش مان را به صورت خدماتی در حوزه ی هاستینگ، شبکه و تولید نرم افزار در اختیار مشتریان مان قرار داده ایم و به این افتخار می کنیم که تک تک آنها تا به امروز همراه ما مانده اند. باور داریم که سینداد صرفاً یک شرکت نیست، بلکه نوعی باور است به ارائه ی شگفت انگیز از هر چیز.