آموزش روشهای کاربردی برای ایمن سازی Memcached
در این مقاله میخوانید
ایمن سازی Memcached یکی از مواردی مهمی است که اخیرا مورد توجه کاربران قرار گرفته است. در ۲۷فوریه۲۰۱۸، CloudFlare مقالهای درباره حجم حملات شدید به Memcached منتشر کرد. Memcached سیستم کش و حافظه پنهان محبوبی است که روی سرور نصب میشود و اغلب برای کاهش زمان پاسخدهی و کاهش بار اسکریپت مورد استفاده است. وقتی درخواستهای پایگاه داده MySQL در سایت زیاد باشد، Memcached مقداری از اطلاعات دیتابیس را در رم ذخیره میکند.
حملات Amplification محل استقرار Memcached را هدف گرفتهاند که در اینترنت با استفاده از UDP درمعرض دید واقع شده است. برای کاهش این حملات، بهتر است Memcached را به Local Interface یا حافظه محلی تبدیل کنید. UDP را غیرفعال و از سرور خود با روشهای معمولی محافظت کنید. در این مقاله، نحوه انجام ایمن سازی Memcached در سرور لینوکس بههمراه سایر عملیاتها را خواهید آموخت؛ پس تا پایان با ما همراه باشید.
بررسی آسیبپذیری Memcached در پورت UDP
ایده کلی در پشت همه حملات Amplification یکسان است. مهاجم میتواند IP را جعل و درخواستهای جعلی را به سرور UDP آسیبپذیر ارسال کند. سرور UDP بدون اطلاع از جعلیبودن درخواست، پاسخ را آماده میکند. مشکل زمانی رخ میدهد که هزاران پاسخ به یک میزبان جعلی ارسال میشود و منابع را اشغال میکند.
اصلیترین مشکل سیستمهای حاوی UDP به پاسخهایی حجیمتر از درخواستها مربوط میشود. بدینصورت که مهاجم جعلی با سرعت پورت محدود (مانند ۱ گیگابایتبرثانیه) میتواند بهراحتی باتوجهبه حجیمتربودن پاسخها، حملات بسیار بزرگی را انجام دهد که به ۱۰۰ گیگابیتبرثانیه میرسد و پهنای باند را اشغال کند.
مشکل اصلی سیستم Memcached حجمتربودن پاسخهای UDP است. دادهها در UDP سیستم Memcached با سرعت زیاد به کاربران تحویل داده میشود و درخواستی بسیار کوچک است و پاسخ آن میتواند تا حدود ۱ مگابایت حجیم باشد. مهاجمان ابتدا بستهای بزرگ را روی سرور Memcached مییابند و با IPهای جعلی درخواستها را ارسال میکنند.
برای مثال، در سیستم Memcached با پاسخهایی حجیم، شاهد هستیم که ۱۵ بایت درخواست به ۱۳۴ کیلوبایت پاسخ منجر میشود. با غیرفعالسازی UDP و کاهش حجم پاسخها، بهراحتی میتوانید از سیستم Memcached خود محافظت کنید. همچنین، حتماً IP استفادهشده را به localhost تنظیم کنید تا از آن استفاده خارجی نشود.
آموزش ایمن سازی Memcached در سرورهای لینوکسی
بهطورپیشفرض، اوبونتو و دبیان Memcached را به رابط محلی (Local Interface) 127.0.0.1 متصل میکنند. تأسیسات نصبشده در شبکه 127.0.0.1 دربرابر حملات شبکه آسیبپذیر نیستند. برای ایمنسازی سرویس Memcached روی این سرورها، باید پارامترهای کانفیگ سرویس را تغییر دهید. ایمن سازی Memcached در مدیریت سرور Centos ،Fedora ،Ubuntu و Debian با ایجاد تغییرات فایل کانفیگ صورت میگیرد. برای انجام این کار، فایل کانفیگ Memcached را بهصورت زیر ویرایش کنید:
اگر از سرورهای Centos یا Fedora استفاده میکنید:
sudo nano /etc/sysconfig/memcached
یا اگر از سرورهای Ubuntu، Debian استفاده میکنید:
sudo nano /etc/memcached.conf OPTIONS="-l 127.0.0.1"
بررسی کنید که -1 روی این IP شبکه تنظیم شده باشد:
PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="-l 127.0.0.1 -U 0"
اگر آدرس listening در آینده تغییر کند، بهترین کار غیرفعالکردن UDP است؛ زیرا احتمال بروز حملات از این بخش بسیار زیاد است. برای غیرفعالسازی UDP و بدون تغییرماندن TCPها، گزینه زیر را به پایین فایل خود اضافه کنید:
PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="-l 127.0.0.1 -U 0"
فایل را ذخیره کنید و ببندید. همچنین برای اعمال تغییرات، سرویس Memcached خود را مجدداً راهاندازی کنید:
sudo service memcached restart
کد زیر را اجرا و بررسی کنید که Memcached درحالحاضر به رابط محلی متصل است و فقط به TCP گوش میدهد:
sudo netstat -plunt
خروجی:
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN 23803/Memcached
شما باید Memcached را فقط متصل به 127.0.0.1 با استفاده از TCP مشاهده کنید.
اجازه دسترسی ازطریق شبکه خصوصی
دستورالعملهای یادشده به Memcached میگویند که فقط بهصورت local فعال باشد. این کار با قرارندادن رابط Memcached درمعرض دید، از حملات Amplification جلوگیری میکند. اگر به اجازه دسترسی از سرورهای دیگر نیاز دارید، باید پیکربندی دیگری را تنظیم کنید. درصورت نیاز به گسترش دسترسی Memcached و اتصال به شبکه خصوصی، امنترین گزینه ایجاد محدودیت در فایروال سیستم است.
۱. محدودکردن دسترسی به IP با فایروال
قبل از محدودکردن دسترسی IP با فایروال، بهتر است برای محدودکردن دسترسی ماشینهایی که میتوانند وارد سرور شما شوند، قوانین فایروال را تنظیم کنید. برای پیکربندی قوانین فایروال خود، باید آدرسهای IP خصوصی سرورهای سرویسگیرنده را بدانید. اگر از فایروال UFW استفاده میکنید، با تایپکردن موارد زیر دسترسی به Memcached خود را میتوانید محدود کنید:
sudo ufw allow OpenSSH sudo ufw allow from client_servers_private_IP/32 to any port 11211 sudo ufw enable
همچنین، اگر از Iptables استفاده میکنید، فایروالی با قوانین ذکرشده را با دستورهای زیر میتوانید ایجاد کنید:
sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT sudo iptables -A INPUT -p tcp -s client_servers_private_IP/32 --dport 11211 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -P INPUT DROP
پسازآن، سرویس Memcached را برای اتصال به رابط شبکه خصوصی سرور خود میتوانید تنظیم کنید.
مقاله زیر راهنمای کامل سرویس فایروال وب یا WAF است، آن را از دست ندهید.
Memcached .۲ را به رابط شبکه خصوصی متصل کنید
اکنون که فایروال شما بهدرستی عمل میکند، پیکربندیهای لازم را برای اتصال Memcached به شبکههای خصوصی میتوانید انجام دهید.
در سرورهای اوبونتو یا دبیان، فایل /etc/memcached.conf را دوباره باز کنید:
sudo nano /etc/memcached.conf
در این فایل، خط مربوط به -l 127.0.0.1 را پیدا و آدرس شبکه خصوصیتان را بهجای آن وارد کنید:
-l memcached_servers_private_IP
پس از اتمام کار، فایل را ذخیره کنید و ببندید.
برای سرورهای CentOS و Fedora باید فایل /etc/sysconfig/Memcached را دوباره باز کنید:
sudo vi /etc/sysconfig/Memcached
در این فایل، IP شبکه خصوصی خود را در جلو متغیر OPTIONS قرار دهید:
OPTIONS="-l memcached_servers_private_IP -U 0 -S -vv"
عبارت memcached_servers_private_IP میتواند رنجی از آیپیهای شبکه (192.168.0.0/16) یا آیپی مشخصی مثل 192.168.100.20 باشد. پس از اتمام کار، فایل را ذخیره کنید و ببندید. سپس، دوباره سرویس Memcached را مجدداً راهاندازی کنید:
sudo service memcached restart
تنظیمات جدید ثبتشده خود را با استفاده از netstat بررسی کنید:
sudo netstat -plunt
خروجی:
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name [...] tcp 0 0 memcached_servers_private_IP:11211 0.0.0.0:* LISTEN 2383/Memcached
درنهایت، اتصال از سرور خارجی ثبتشده را بررسی کنید تا مطمئن شوید که دسترسیهای لازم را برای اتصال به Memcached دراختیار دارید. همچنین، سعی کنید با استفاده از سرورهای غیرمجاز دیگر، به سرویس Memcached خود متصل شوید تا فایروال و سایر اقدامات امنیتی Memcached خود را بتوانید بررسی کنید.
استفاده از UDP ایمن در Memcached
باتوجهبه گزارشهای پیش رو و مشکلات عنوانشده، بهتر است از UDP استفاده نکنید؛ اما اگر در هر شرایطی به استفاده از UDP در Memcached نیاز داشتید، باید نکاتی را رعایت کنید تا درمعرض خطر حملات Amplification قرار نگیرید. همانطورکه گفتیم، دلیل اصلی بروز این حملات حجم پاسخهای ارسالی به کاربر است؛ یعنی با ریکوئستهای سبک میتوانند حجم زیادی از دادهها را دریافت و سیستم شما را اشغال کنند.
- اگر از UDP استفاده میکنید، همیشه باید با حجم بسته کوچکتر از درخواست پاسخ دهید. با انجام این کار، خطر حمله Amplification بهشدت کاهش مییابد و کسی نمیتواند از پروتکلهای شما سوءاستفاده و سرورتان را مشغول کند.
- فراموش نکنید همیشه و همهجا باید از سیستم فایروال قوی استفاده کنید. فایروال بسیاری از این حملات را پوشش خواهد داد و از آنها جلوگیری خواهد کرد. درنهایت، سرور شما ایمنتر از قبل خواهد بود.
- برای حفظ امنیت بیشتر، بههیچعنوان پروتکل UDP را بدون احراز هویت پیادهسازی نکنید. حتماً از سیستمهای امنیتی برای تشخیص کاربران جعلی استفاده کنید تا درمعرض خطر کمتری قرار بگیرید.
هر آنچه باید درمورد علت بروز حملات DDos و نحوه مقابله با آنها بدانید در مقاله زیر آمده است.
استفاده از سیستم Cloudflare
اگر از سیستم Cloudflare استفاده میکنید، نیازی نیست نگران این نوع حملهها باشید. معماری Anycast Cloudflare بهخوبی برای توزیع بار در زمان بروز حملات Amplification عمل میکند و بههیچعنوان نمیگذارد سیستم شما زیر بار بسیار زیاد از مدار خارج شود. درنهایت، شما پشت Cloudflare ایمن هستید.
ناگفته نماند با سیستم Cloudflare نیز نمیتوان با اطمینان کامل گفت که حملات رخ نخواهند داد؛ زیرا کلادفلیر تنها از حملات به آدرس دامنهتان جلوگیری میکند و درصورتیکه IP شما درمعرض دید قرار بگیرد، همچنان Cloudflare بیفایده خواهد بود و سرورتان مستقیماً درمعرض خطر قرار میگیرد.
بررسی آسیبپذیری Memcached
پس از انجام مراحل یادشده، نوبت به بررسی و تست نفوذ سیستم میرسد. شما باید سیستم فایروال و UDP خود را تست کنید تا مطمئن شوید که سرویس Memcached شما کاملاً ایمن است و دربرابر حملات آسیبپذیر نیست.
۱. بررسی آسیبپذیری UDP
همانطورکه مشاهده کردید، پورت UDP سیستم Memcached آسیبپذیر است و مهاجمان بهراحتی میتوانند در کارتان خلل ایجاد کنند. با اجرای دستور زیر، میتوانید آسیبپذیری Memcached دربرابر UDP را بررسی کنید:
$ echo -en "\x00\x00\x00\x00\x00\x01\x00\x00stats\r\n" | nc -q1 -u 127.0.0.1 11211 STAT pid 21357 STAT uptime 41557034 STAT time 1519734962 ...
اگر پاسختان خالی نبود، نتیجه میگیریم که سرور Memcached شما آسیبپذیر است.
۲. بررسی آسیبپذیری فایروال Memcached
برای بررسی فایروال و آزمایش اینکه آیا میتوان ازطریق UDP به آنها دسترسی پیدا کرد یا نه، باید nmap را اجرا و تست کنید:
$ nmap TARGET -p 11211 -sU -sS --script memcached-info Starting Nmap 7.30 ( https://nmap.org ) at 2018-02-27 12:44 UTC Nmap scan report for xxxx Host is up (0.011s latency). PORT STATE SERVICE 11211/tcp open memcache | memcached-info: | Process ID 21357 | Uptime 41557524 seconds | Server time 2018-02-27T12:44:12 | Architecture 64 bit | Used CPU (user) 36235.480390 | Used CPU (system) 285883.194512 | Current connections 11 | Total connections 107986559 | Maximum connections 1024 | TCP Port 11211 | UDP Port 11211 |_ Authentication no 11211/udp open|filtered memcache
جمعبندی
برای ایمن سازی Memcached روشهای مختلفی وجود دارد. سیستم Memcached آسیبپذیریهایی در پورت UDP دارد که باعث میشود حملات Amplification بهراحتی انجام شوند و سیستم Memcached شما را از کار بیندازند. با ایجاد فایروالهای مناسب و غیرفعالسازی UDP و محدودسازی IP به localhost دربرابر این حملات مقاوم شوید. این حملات تأثیر بسیار زیادی بر اشغالسازی شبکه و سرور Memcached شما میگذارند؛ بهطوریکه کاملاً سرور را از مدار خارج میکنند. درنهایت، حتماً تغییرات اعمالشده را با استفاده از روشهای مختلف بررسی کنید و مطمئن شوید که سیستمتان دربرابر تمام حملات ذکرشده ایمن است. در این مطلب سعی کردیم ایمن سازی Memcached را مختصراً توضیح دهیم.
سؤالات متداول
۱. Memcached برای چه کاری استفاده میشود؟
Memcached محل ذخیره داده با کارایی فراوان و استفاده آسان محسوب میشود. این سیستم کاملاً مقیاسپذیر و منبعباز است که برای ارائه پاسخهای کوتاهتر از میلیثانیه و بهعنوان سیستم کش یا حافظه پنهان سشنها استفاده میشود.
۲. Memcached چقدر ایمن است؟
Memcached همچون سایر پایگاههای داده و سیستمها بسیار ایمن است؛ اما مسائل امنیتی بسیاری هستند که به سرور مربوط میشوند و ارتباطی با Memcached ندارند.
۳. باگ امنیتی Memcached چیست؟
سیستم Memcached در استفاده از پورت UDP باگ امنیتی دارد که باعث بروز حملات amplification میشود. برای حل این مشکل، باید پورت UDP را ببندید.
۴. چگونه امنیت Memcached را افزایش دهیم؟
با استفاده از این راهکارهای ساده، امنیت Memcached را افزایش دهید:
- غیرفعالسازی پورت UDP
- محدودسازی IP به Localhost
- استفاده از فایروال قوی
- استفاده از Cloudflare
۵. آیا Memcached از SQL پشتیبانی میکند؟
خیر، Memcached فقط از get/set و ارتباط بین جداول پشتیبانی میکند که سیستمی key-value است و از کوئریهای SQL پشتیبانی نمیکند.