در این مطلب آموزشی قصد داریم در مورد مدیریت لیست سیاه با استفاده از ipset صحبت کنیم. این روش شما رو تا حد خیلی زیادی از شر اسپمرها و بات نتها راحت میکنه. اما در ابتدا بیاین به بررسی تعدادی از مفاهیم در این زمینه بپردازیم.
دوستان من به تازگی یک سرور تست راهاندازی کردم تا یک سری مسائل امنیتی رو در خصوص بعضی از سرویسها مثل mail-server بررسی کنم. خیلی جالب بود و قتی دیدم روی این سرور تست، تنها دو روز بعد از راهاندازی تعداد بالایی حملات مختلف داره انجام میشه و خب با توجه به آدرس آیپیها مشخص بود که کار نرمافزارهای خودکار و bot-net های دوستان عزیز در چین و یکی دو جای دیگه است.
بههرحال با fail2ban و یک سری کار دیگه تقریباً این حملات بی معنی شدن، اما به این فکر افتادم که چه کاریه که اصلاً اجازه بدیم این حملات به سرور ما برسن؟ وقتی اینها اینقدر شناخته شدهاند، پس آیا راهی داره که بتونیم این bot-netها رو کلا بلاکشون کنیم؟ با یکم گشت و گذار متوجه شدم که میشه با ipset تعداد زیادی از blacklist ها که شامل ip این حملهکنندگان عزیز هست رو بلاک کنیم و کار بهروزرسانی این ip ها رو به Cron بسپاریم و تا مقدار زیادی از شر این شیاطین اتوماتیک راحت بشیم.
حالا شاید یه عده بگن میشه از مثلاً وبسایتمون و سیستم ورود کاربران با گذاشتن CAPTCHA حفاظت کنیم، اما واقعیت اینه که این حملهکنندگان حتماً از چندین سرویس ارزان آنلاین برای حل پازلهای CAPTCHA استفاده میکنند.
از طرفی در پشت صحنهی این حملات گاهی اوقات یه تیم با نفرات زیاد وجود دارند (بههرحال شما فکر کنید این حملات وقتی از چین و هند میان دیگه مشکل منابع انسانی که ندارن!) و اونا کار حل این پازلهای CAPTCHA رو انجام میدن؛ پس وقت، انرژی و هزینه بیشتر برای پیچیدهتر کردن این پازلها، تقریباً برای ما یه کار بیهودهست. بنابراین ipset میتونه یه راه مناسب و بدون هزینه باشه.
خب میرسیم به داستان اینکه این blacklist ها اصلاً از کجا میان؟ میشه اینطوری گفت که وقتی این دوستان شروع به حمله میکنن، این کار رو در یک حجم عظیمی یعنی با تعداد بسیار بالا و معمولاً در نقاط مختلف و بهصورت پراکنده انجام میدن تا قابل ردیابی نباشن. مثلاً اگر به یک گروه آیپی در ایران داره حمله میشه، احتمال اینکه این حمله به چند نقطه دیگه در خاورمیانه هم شده باشه بالاست.
معمولاً اگر وبسایتهای شرکتهای امنیتی رو چک کنیم که بخشی از کارشون بررسی این حملات در پهنهی وب هست، ممکنه ببینیم که در ترکیه هم این حملات در حال انجامه. این شرکتها و به خصوص معروفترین هاشون یک پایگاه دادهی بزرگ میسازن که شامل آیپی این حمله کنندگان بوده و اونها رو در blacklist خودشون قرار میدن. با کمک همین پایگاههای داده که در نقاط مختلف دنیا داره جمعآوری میشه، میتونیم یک مجموعه بزرگ از آدرسهای حملهکنندگان رو در اختیار داشته باشیم.
نکتهای که وجود داره در مورد توزیعهای لینوکس اینه که اونا اکثراً از iptables به عنوان interface اصلی برای netfilter استفاده میکنن. netfilter یک چهارچوب فیلترینگ بستهها بوده که داخل کرنل لینوکس قرار داره و با iptables میشه براش یک سری قانون تعریف کرد؛ که برای هر بسته عبوری از شبکه این قوانین بررسی بشه.
حالا مشکلی که در استفاده از iptables برای بلاک کردن این لیستهای سیاه وجود داره اینه که اگر شما مثلاً یک لیست شامل ۳۰۰ هزار آیپی رو بهش بدید، وقتی iptables بخواد برای هر کدوم از این آیپیها این قوانین رو بررسی و اعمال کنه، فاجعهی کمبود منابع به وجود میاد و کلاً سیستم میره رو هوا و اصلاً نمیتونه جوابگوی این مسئله باشه؛ اینجاست که ipset شما رو نجات میده.
درواقع ipset میتونه یک لیست بسیار بزرگی از ip ها، پورتها و مک آدرسها رو بگیره و اونها رو به شکل hash/bitmap در یک حافظهی خیلی کوچیک ذخیره کنه. بعد خیلی راحت میتونید داخل قوانین iptables فقط به نام این لیست اشاره کنید و در زمان نیاز کل این لیست بلندبالا با یک قانون ساده داخل netfilter با سرعت خیلی بالا چک و اعمال بشه.
همینطور میتونید محتویات لیست رو حتی در زمان اجرای فایروال سیستم هم تغییر بدید. ipset باید در سطح کرنل فعال بشه و اکثر توزیعها خودشون ipset رو در این سطح فعال میکنن (البته اونایی که امنیت خیلی براشون مهمه). قسمت خیلی خوب این داستان اینه که شما میتونید بهراحتی کار بهروزرسانی این لیست رو هم به Cron بسپرید و به بقیهی کارهاتون برسید. خب بریم سراغ نصب و راهاندازی.
برای نصب ipset روی سیستمهای Debian,Ubuntu دستور زیر رو وارد کنید:
sudo apt-get install ipset
همینطور برای نصب روی سیستمهای RHEL/CentOS,Fedora
sudo yum install 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 آیپیهای وارد شده رو ببینید.
حالا با استفاده از این لیست آیپی وارد شده به 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 از بین ببریم و ببینیم آیا میشه با استفاده از فایل ذخیره شده اون رو برگردوند یا نه؟
خب تا به اینجا باید یک ایده کلی در مورد قدرت بالای ipset به دست آورده باشید؛ اما همچنان اگر بخواهید تعداد بالایی آیپی رو به صورت موردی بلاک کنید، بازم کار سختی خواهد بود. دقیقاً برای همینه که شرکتهای مختلف لیستهای بلند بالایی از این آیپیها دارن و کار شما رو راحت کردن.
برای امتحان کردن این blacklist ها ما قصد داریم بهتون نشون بدیم که چطور میشه به صورت خودکار این لیستهای سیاه موجود رو به setهای آیپی ترجمه کرد. برای امتحان کردن این مسئله ما قصد داریم یکی از لیستهای رایگان موجود در وبسایت iblocklist.com رو امتحان کنیم. اما نسخههای رایگان این وبسایت به فرمت P2P نوشته شدهاند. برای اینکه بتونیم نسخههای P2P رو به IP-sets تبدیل کنیم، به یک ابزار متنباز پایتون به نام iblocklist2ipset نیاز داریم. اول باید 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
بعد از اجرای دستور بالا شما یک فایل خواهید داشت به نام 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 بسپرید تا بصورت روزانه یا ساعتی بهروزرسانی بشه و بعد دیگه خیالتون از آپدیتهای این لیست هم راحت بشه.
اگر به صفحهی ما در گیتهاب سر بزنید و اسکریپت موجود در فایل ipset_update.sh را در سیستم خودتون ذخیره کنید (یا فقط محتویات این صفحه رو select کرده و کپی کنید)، میتوانید با اجرایی کردن این فایل و سپردن اون به crontab یک وظیفهی روزانه یا ساعتی رو تعریف کنید تا این فایل به شکل مداوم بهروزرسانی بشه:
اول root بشید:
sudo su –
vim ipset_update.sh
اسکریپت رو اینجا paste کرده و ذخیره کنید. بعد باید به این فایل دسترسی اجرایی بدید:
chmod ۷۵۵ ipset_update.sh
برای اینکه فیلترینگ رو بر اساس فایل ساخته شده برای ipset فعال کنیم، لازمه یک قانون در iptables بنویسیم که اونها رو هم به انتهای فایل اسکریپت اضافه کردیم.
حالا فایل رو اجرا کنید:
./ipset_update.sh
اگر هیچ خطایی دریافت نکردید، یعنی فایلی به نام block درست ساخته شده. برای اینکه مطمئن بشید که این لیست به ipset اضافه شده، این دستور رو اجرا کنید:
ipset list block
به شما لیست دریافت شده از dshield رو نمایش خواهد داد.
خب میرسیم به بخش اجرای روزانهی این اسکریپت تا بتونیم فایلمون رو بهروز نگه داریم و آیپیهای جدید و خطرناک رو هر روز بلاک کنیم. اول باید فایل 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
فایل رو ذخیره کنید و خارج بشید.
از اینجا به بعد کار شما تموم شده و میتونید از امنیت بیشتر سرور یا سرویسی که راهاندازی کردین لذت ببرید.
امیدوارم از این مطلب آموزشی خوشتون اومده باشه و از مفاهیم سادهی اون لذت برده باشید.
جمعآوری شده توسط حمید نبی زاده
سینداد یعنی هدیهی سیمرغ، یا فرزند سیمرغ؛ به عبارتی یعنی خود سیمرغ، با همه ی شگفتی هایش، اما جوانتر و سرزنده تر. و این چیزی است که ما سعی می کنیم در سینداد باشیم. از سال ۱۳۸۵ دانش مان را به صورت خدماتی در حوزه ی هاستینگ، شبکه و تولید نرم افزار در اختیار مشتریان مان قرار داده ایم و به این افتخار می کنیم که تک تک آنها تا به امروز همراه ما مانده اند. باور داریم که سینداد صرفاً یک شرکت نیست، بلکه نوعی باور است به ارائه ی شگفت انگیز از هر چیز.