شعار همیشگی: حفظ مشتریان فعلی ، دعوت از مشتریان قبلی ، جذب مشتریان آتی.
جشنواره فروش
همواره تخفیف
مدیریت لیست سیاه با استفاده از ipset
مدیریت لیست سیاه با استفاده از ipset
با شما هستیم با مدیریت لیست سیاه با استفاده از ipset در خدمت شما خواهیم بود تا انتهای این مطلب ما را همراهی کنید. و یا با محیط آن آشنا گردید به مطالعه این مطللب بپردازید.
بکاپ منظم روزانه هفتگی ماهانه در یک سرور مجزا از مزیت نگارنوین نسبت به سایرین می باشد.
شرکت نگارنوین با همت بهترین کارشناس های قوی به شما کاربران و مشتریهای عزیز خدمت رسانی میکند تا هرچه آسان تر و بهتر به درخواست های خود برسید.
چرا باید از ipset استفاده کنیم؟
دوستان من به تازگی یک سرور تست راهاندازی کردم تا یک سری مسائل امنیتی رو در خصوص بعضی از سرویسها مثل mail-server بررسی کنم. خیلی جالب بود و قتی دیدم روی این سرور تست، تنها دو روز بعد از راهاندازی تعداد بالایی حملات مختلف داره انجام میشه و خب با توجه به آدرس آیپیها مشخص بود که کار نرمافزارهای خودکار و bot-net های دوستان عزیز در چین و یکی دو جای دیگه است.
بههرحال با fail2ban و یک سری کار دیگه تقریباً این حملات بی معنی شدن، اما به این فکر افتادم که چه کاریه که اصلاً اجازه بدیم این حملات به سرور ما برسن؟ وقتی اینها اینقدر شناخته شدهاند، پس آیا راهی داره که بتونیم این bot-netها رو کلا بلاکشون کنیم؟ با یکم گشت و گذار متوجه شدم که میشه با ipset تعداد زیادی از blacklist ها که شامل ip این حملهکنندگان عزیز هست رو بلاک کنیم و کار بهروزرسانی این ip ها رو به Cron بسپاریم و تا مقدار زیادی از شر این شیاطین اتوماتیک راحت بشیم.
حالا شاید یه عده بگن میشه از مثلاً وبسایتمون و سیستم ورود کاربران با گذاشتن CAPTCHA حفاظت کنیم، اما واقعیت اینه که این حملهکنندگان حتماً از چندین سرویس ارزان آنلاین برای حل پازلهای CAPTCHA استفاده میکنند.
از طرفی در پشت صحنهی این حملات گاهی اوقات یه تیم با نفرات زیاد وجود دارند (بههرحال شما فکر کنید این حملات وقتی از چین و هند میان دیگه مشکل منابع انسانی که ندارن!) و اونا کار حل این پازلهای CAPTCHA رو انجام میدن؛ پس وقت، انرژی و هزینه بیشتر برای پیچیدهتر کردن این پازلها، تقریباً برای ما یه کار بیهودهست. بنابراین ipset میتونه یه راه مناسب و بدون هزینه باشه.
ارتباط Ipset با Netfilter و iptables
خب میرسیم به داستان اینکه این blacklist ها اصلاً از کجا میان؟ میشه اینطوری گفت که وقتی این دوستان شروع به حمله میکنن، این کار رو در یک حجم عظیمی یعنی با تعداد بسیار بالا و معمولاً در نقاط مختلف و بهصورت پراکنده انجام میدن تا قابل ردیابی نباشن. مثلاً اگر به یک گروه آیپی در ایران داره حمله میشه، احتمال اینکه این حمله به چند نقطه دیگه در خاورمیانه هم شده باشه بالاست.
معمولاً اگر وبسایتهای شرکتهای امنیتی رو چک کنیم که بخشی از کارشون بررسی این حملات در پهنهی وب هست، ممکنه ببینیم که در ترکیه هم این حملات در حال انجامه. این شرکتها و به خصوص معروفترین هاشون یک پایگاه دادهی بزرگ میسازن که شامل آیپی این حمله کنندگان بوده و اونها رو در blacklist خودشون قرار میدن. با کمک همین پایگاههای داده که در نقاط مختلف دنیا داره جمعآوری میشه، میتونیم یک مجموعه بزرگ از آدرسهای حملهکنندگان رو در اختیار داشته باشیم.
نکتهای که وجود داره در مورد توزیعهای لینوکس اینه که اونا اکثراً از iptables به عنوان interface اصلی برای netfilter استفاده میکنن. netfilter یک چهارچوب فیلترینگ بستهها بوده که داخل کرنل لینوکس قرار داره و با iptables میشه براش یک سری قانون تعریف کرد؛ که برای هر بسته عبوری از شبکه این قوانین بررسی بشه.
حالا مشکلی که در استفاده از iptables برای بلاک کردن این لیستهای سیاه وجود داره اینه که اگر شما مثلاً یک لیست شامل ۳۰۰ هزار آیپی رو بهش بدید، وقتی iptables بخواد برای هر کدوم از این آیپیها این قوانین رو بررسی و اعمال کنه، فاجعهی کمبود منابع به وجود میاد و کلاً سیستم میره رو هوا و اصلاً نمیتونه جوابگوی این مسئله باشه؛ اینجاست که ipset شما رو نجات میده.
Ipset چیست؟
درواقع ipset میتونه یک لیست بسیار بزرگی از ip ها، پورتها و مک آدرسها رو بگیره و اونها رو به شکل hash/bitmap در یک حافظهی خیلی کوچیک ذخیره کنه. بعد خیلی راحت میتونید داخل قوانین iptables فقط به نام این لیست اشاره کنید و در زمان نیاز کل این لیست بلندبالا با یک قانون ساده داخل netfilter با سرعت خیلی بالا چک و اعمال بشه.
همینطور میتونید محتویات لیست رو حتی در زمان اجرای فایروال سیستم هم تغییر بدید. ipset باید در سطح کرنل فعال بشه و اکثر توزیعها خودشون ipset رو در این سطح فعال میکنن (البته اونایی که امنیت خیلی براشون مهمه). قسمت خیلی خوب این داستان اینه که شما میتونید بهراحتی کار بهروزرسانی این لیست رو هم به Cron بسپرید و به بقیهی کارهاتون برسید. خب بریم سراغ نصب و راهاندازی.
- پیشنیازهای لازم برای شروع نصب یک سرور آماده (rpm base/debian base) با یک کاربر که دسترسی sudo ، و ارتباط با اینترنت باید برقرار باشه.
آموزش نصب ipset
برای نصب ipset روی سیستمهای Debian,Ubuntu دستور زیر رو وارد کنید:
sudo apt-get install ipset
همینطور برای نصب روی سیستمهای RHEL/CentOS,Fedora
sudo yum install ipset
تنظیمات و نحوه عملکرد ipset
با یه مثال شروع میکنیم:
اول بیایید یه ipset جدید به اسم my-banlist (یا هر اسمی که شما دوست دارید) بسازیم:
sudo ipset create my-banlist hash:net
hash:net در دستور بالا باید وجود داشته باشه (Required) و نشون میده که چه اطلاعاتی به چه نحوی باید ذخیره بشه. انواع مختلفی از ip set وجود داره. در حالت عادی hash:net ، ipset از یک hash استفاده میکنه تا چندین بلوک از CIDR ها رو ذخیره کنه. حالا اگر شما بخواهید یک ip مشخص رو در یک set ذخیره کنید، میتونید بجای hash:net از hash:ip استفاده کنید.
حالا اگر این دستور رو اجرا کنید:
sudo ipset list
یک همچین خروجی خواهید دید:
Name: my-banlist
Type: hash:net
Revision: 6
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 344
References: 0
Number of entries: 0
Members:
این اطلاعات چی هستن؟ این دستور یک لیست از آیپیهای در دسترس رو نشون میده. در ادامه اطلاعاتی از هر set و اینکه چه اعضایی دارن نمایش داده شده. به صورت پیشفرض هر کدوم از set آیپیها میتونن ۶۵۵۳۶ عنصر (element)، که در واقع در اینجا همون بلوکهای CIDR هستند رو ذخیره کنن. شما میتونید این مقدار رو با اضافه کردن maxelem به آخر دستور ساختن یک ipset مشخص کنید، مثل این:
sudo ipset create my-banlist hash:net maxelem 1000000
بیایید یک سری بلوک آیپی (کاملا فرضی) رو به این set اضافه کنیم:
sudo ipset add my-banlist 1.1.1.1/32
sudo ipset add my-banlist 1.1.2.0/24
sudo ipset add my-banlist 1.1.3.0/24
sudo ipset add my-banlist 1.1.4.10/24
اگر دوباره به لیست نگاهی بندازیم:
sudo ipset list
در انتهای خروجی نمایش داده شده میتونید در قسمت members آیپیهای وارد شده رو ببینید.
اعمال قوانین بر روی iptables
حالا با استفاده از این لیست آیپی وارد شده به ipset میتونیم با استفاده از iptables قوانینی رو برای محدود کردنشون اعمال کنیم. برای اینکار میتونیم از گزینهی”-m set –match-set ” استفاده کنیم.
بیایید فرض کنیم میخواهیم یک قانون برای iptables بنویسیم که دسترسی آیپیهای داخل ipset رو به پورت ۸۰ و در نتیجه دسترسی به وب سرور رو محدود کنه. برای اینکار میتونیم این دستور رو وارد کنیم:
sudo iptables -I INPUT -m set –match-set my-banlist src -p tcp –destination-port 80 -j DROP
در صورت تمایل میتونید یک ipset مشخص رو داخل یک فایل ذخیره کرده و بعداً ازش استفاده کنید. با این دستورها:
sudo ipset save my-banlist -f my-banlist.txt
sudo ipset destroy my-banlist
sudo ipset restore -f my-banlist.txt
در این دستورات ما در واقع سعی کردیم که ipset قبلی رو با استفاده از دستور destroy از بین ببریم و ببینیم آیا میشه با استفاده از فایل ذخیره شده اون رو برگردوند یا نه؟
AutoBan
خب تا به اینجا باید یک ایده کلی در مورد قدرت بالای ipset به دست آورده باشید؛ اما همچنان اگر بخواهید تعداد بالایی آیپی رو به صورت موردی بلاک کنید، بازم کار سختی خواهد بود. دقیقاً برای همینه که شرکتهای مختلف لیستهای بلند بالایی از این آیپیها دارن و کار شما رو راحت کردن.
برای امتحان کردن این blacklist ها ما قصد داریم بهتون نشون بدیم که چطور میشه به صورت خودکار این لیستهای سیاه موجود رو به setهای آیپی ترجمه کرد. برای امتحان کردن این مسئله ما قصد داریم یکی از لیستهای رایگان موجود در وبسایت iblocklist.com رو امتحان کنیم. اما نسخههای رایگان این وبسایت به فرمت P2P نوشته شدهاند. برای اینکه بتونیم نسخههای P2P رو به IP-sets تبدیل کنیم، به یک ابزار متنباز پایتون به نام iblocklist2ipset نیاز داریم. اول باید pip رو نصب کنید:
- فقط دوستان یادتون نره که شما صرفاً به iblocklist2ipset فقط برای ترجمه فایلها نیاز خواهید داشت. حالا اگر خودتون از وبسایتهای دیگه لیستهای دیگهای رو تهیه کنید، میتونید قسمت نصب iblocklist2ipset رو رد کرده و فقط نام فایل لیست آیپیها رو به ipset بدید و بعد براش داخل iptables یک قانون تعریف کنید.
آموزش نصب pip
برای debian/Ubuntu
sudo apt-get install python-pip
برای CentOS اول باید مخازن EPEL رو فعال کنید، بعد این دستور رو اجرا کنید:
sudo yum install python-pip
بعد از نصب کردن pip حالا میتونیم بریم برای نصب iblocklist2ipset روی اوبونتو:
sudo pip install iblocklist2ipset
و در توزیعهایی مثل fedora یا CentOS باید این دستور رو اجرا کنید:
sudo python-pip install iblocklist2ipset
حالا به وبسایت iblocklist.com برید و هر کدوم از لیستهای موجود رو بررسی کرده و آدرس موجود برای نسخه P2P رو کپی کنید. ما در اینجا نسخه dshield رو انتخاب کردیم و آدرسش این هست:
http://list.iblocklist.com/?list=xpbqleszmajjesnzddhv&fileformat=p2p&archiveformat=gz
و اگر این آدرس رو به iblocklist2ipset بدید، تقریباً دیگه کاری لازم نیست انجام بدید. دقت کنید که کل خطوط زیر یک دستوره:
sudo iblocklist2ipset generate –ipset=my-banlist “http://list.iblocklist.com/? list=xpbqleszmajjesnzddhv&fileformat=p2p&archiveformat=” > banthis.txt.1
- به دستور بالا دقت کنید. وقتی آدرس رو از وبسایت iblocklist.com بگیرید، در انتهای آدرس … p2p&archiveformat=gz … پسوند gz. رو میبینید که نکتهی مهم اینجاست : وقتی دارید دستور رو اجرا میکنید، حتماً این پسوند رو حذف کنید تا به خطاهای پایتون برنخورید.
بعد از اجرای دستور بالا شما یک فایل خواهید داشت به نام banthis.txt.1 که شامل تمامی ip های مورد نظر شما در اون لیست قرار گرفته. اگر محتویات این فایل رو بررسی کنید، خودتون لیست آیپیهای موجود رو خواهید دید.
حالا باید این لیست رو به ipset بدیم تا کار رو شروع کنه:
sudo ipset restore -f banthis.txt
و در پایان میتونید با دادن یک قانون ساده و یک خطی به iptables حجم بزرگ ip های داخل لیست رو به راحتی بلاک کنید. مثلاً ما میخواهیم دسترسی این ip ها رو کلا به سرورمون بلاک کنیم:
sudo iptables -t raw -I PREROUTING -m set –match-set my-banlist src -j DROP
دقت کنید که شما میتونید به دلخواه دسترسی کل این آیپیها رو به سرور محدود کنید. فقط یادتون نره که اسم ipset ما اینجا my-banlist هست که باید در زمان تنظیم کردن قانون iptables نام اون رو وارد کنید.
استفاده از cron
خب حالا اگر دلتون خواست این لیست مداوم بهروزرسانی بشه چه کاری باید بکنید؟
شما میتونید همین لیست رو با یه اسکریپت به cron بسپرید تا بصورت روزانه یا ساعتی بهروزرسانی بشه و بعد دیگه خیالتون از آپدیتهای این لیست هم راحت بشه.
اسکریپت کلی برای پروسه دریافت لیست
اگر به صفحهی ما در گیتهاب سر بزنید و اسکریپت موجود در فایل ipset_update.sh را در سیستم خودتون ذخیره کنید (یا فقط محتویات این صفحه رو select کرده و کپی کنید)، میتوانید با اجرایی کردن این فایل و سپردن اون به crontab یک وظیفهی روزانه یا ساعتی رو تعریف کنید تا این فایل به شکل مداوم بهروزرسانی بشه:
اول root بشید:
sudo su –
vim ipset_update.sh
اسکریپت رو اینجا paste کرده و ذخیره کنید. بعد باید به این فایل دسترسی اجرایی بدید:
chmod ۷۵۵ ipset_update.sh
برای اینکه فیلترینگ رو بر اساس فایل ساخته شده برای ipset فعال کنیم، لازمه یک قانون در iptables بنویسیم که اونها رو هم به انتهای فایل اسکریپت اضافه کردیم.
- حتماً به انتهای اسکریپت نگاهی بندازید و در قسمت ” YOUR_IP_ADDRESS “ آیپی آدرس مد نظر خودتون رو وارد کنید تا هیچوقت شامل این قوانین نشه. اگر کلاینت هستید این آیپی میتونه آیپی Public شما باشه. و اگر آیپی خاصی مدنظرتون نیست، اون خط رو میتونید پاک کنید.
حالا فایل رو اجرا کنید:
./ipset_update.sh
اگر هیچ خطایی دریافت نکردید، یعنی فایلی به نام block درست ساخته شده. برای اینکه مطمئن بشید که این لیست به ipset اضافه شده، این دستور رو اجرا کنید:
ipset list block
به شما لیست دریافت شده از dshield رو نمایش خواهد داد.
تنظیمات Cron
خب میرسیم به بخش اجرای روزانهی این اسکریپت تا بتونیم فایلمون رو بهروز نگه داریم و آیپیهای جدید و خطرناک رو هر روز بلاک کنیم. اول باید فایل cron رو داخل etc/cron.daily/update_block/ رو میسازیم:
vim /etc/cron.daily/update_block
بعد این تنظیمات رو وارد کنید:
#/etc/cron.daily/update_block
#Global variables
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin
MAILTO=root
HOME=/
#Every day at 4 a.m , poll for update to dshield
#block list, and update firewall blacklist.
۰ ۴ * * * * root /root/ipset_update.sh &>/dev/null
فایل رو ذخیره کنید و خارج بشید.
از اینجا به بعد کار شما تموم شده و میتونید از امنیت بیشتر سرور یا سرویسی که راهاندازی کردین لذت ببرید.