در این مقاله جلوگیری از حملات brute force در nginx به شما آموزش داده میشود تا بتوانید این حملات که تا حدودی متوقف کنید. تنظیمات زیر، از حملات brute force با استفاده از ماژول HttpLimitReqModule در nginx جلوگیری می کند. این از ماژول های پیش فرض nginx است و نیازی به نصب جداگانه آن ندارید.
brute force چیست؟
کلمه brute force به معنای کمکگرفتن از جبر و زور برای انجام کاری است که بدون هیچگونه برنامهریزی و دقت انجام میشود. حمله بروت فورس در مقیاس بزرگ انجام شده و سعی دارد تا به اطلاعات کاربری افراد دسترسی پیدا کند. حمله بروت فورس از حملات حوزه شبکه به شمار میآید و با نام حمله جستجوی فراگیر نیز شناخته میشود. در این حمله تمام گذرواژههای ممکن و ترکیبهای مختلف آزمایش شده تا ترکیب درست کشف شود.
اساس کار این حمله را میتوان حدسزدن دانست؛ بهعبارتدیگر، هکر سعی میکند رمز عبور فرد را حدس بزند و این حدس را آنقدر تکرار میکند تا به داده درست برسد. معمولاً نام کاربری در این نوع حملات در دسترس هست و فقط برای رمز عبور تلاش میشود. موفق شدن هکر در این حمله باعث میشود تا او به تمام اطلاعات کاربر دست یابد و هرگونه اقدامی را انجام دهد؛ به همین دلیل این حمله را یک جنگ تمامعیار میدانند.
ویژگیهای مثبت و منفی حمله بروت فورس
سادهبودن حملات brute force بزرگترین ویژگی مثبت آن است. این حمله در صورت داشتن زمان کافی و بدون توجه به هیچگونه استراتژی خاصی و حتی فضای کافی میتواند اجرا شود. این قابلیت برای حمله بروت فورس درحالیکه ویژگی مثبت آن است، میتواند خطر بزرگی برای کاربران باشد؛ زیرا در هر زمانی حسابشان میتواند مورد حمله قرار بگیرد. هرگونه حسابی که رمز عبور و نام کاربری دارد، با حمله بروت فورس قابل شکستهشدن است. باتوجهبه اینکه برای مشخصشدن گذرواژه در این حمله حدس زده میشود، زمان زیادی از مهاجم خواهد گرفت. بر همین اساس سطح امنیتی یک سیستم را با زمانی که لازم است تا رمز عبور آن در بروت فورس یافت شود، میسنجند.
از مهمترین ویژگیهای منفی که میتوان برای bruteforce نام برد، کند بودن آن است. سرعت پایین این حمله باعث میشود که در برخی موارد هیچگاه به موفقیت نرسد. هرچقدر که رمز عبور هدف طولانیتر باشد، ترکیبی از حروف کوچک و بزرگ باشد، کاراکتر در آن استفاده شده باشد و… زمان بیشتری لازم است که قفل آن توسط بروت فورس شکسته شود. این تفاوت زمانی با کوچکترین تغییرات نیز خود را نشان میدهد؛ برای مثال رمزهای چهار کاراکتری سریعتر از رمزهای دارای پنج کاراکتر شکسته میشوند.
برخی از رمزها هستند که برای شکستهشدن آنها لازم است ماهها و یا حتی سالها زمان بگذارید! ازاینرو در مواردی که استفاده از این نوع حمله زمان زیادی از فرد مهاجم بگیرد، او به دنبال روشهای جایگزین خواهد بود. طولانیبودن رمز، داشتن کاراکتر یا حروف کوچک و بزرگ، رمزهای دشواری میسازد.
Rate limiting
Nginx قادر به رسیدگی به هزاران درخواست در ثانیه است. در صورت حمله brute force، مهاجم می تواند هزاران credential را در ثانیه امتحان کند! ویژگی های محدود کننده نرخ با محدود کردن تلاش در ثانیه از چنین حملاتی جلوگیری می کند. محدود کردن 1 تلاش در ثانیه امکان یافتن credential کاربر را به طور قابل توجهی به تاخیر می اندازد.
Error code
بیشتر حملات از طریق ربات های خودکار انجام می شود که به کد http بازگردانده شده توسط سرور شما نگاه می کنند. بهطور پیشفرض، وقتی نرخ محدود است، Nginx یک 503 (سرور موقتاً در دسترس نیست) برمیگرداند. با تغییر کد برگشتی به 444 (بدون پاسخ از سرور)، اکثر ربات ها به هدف بعدی منتقل می شوند. همچنین ردیابی در گزارش های سرور یا سیستم های نظارتی آسان تر است.
Find Login URL
قبل از پیکربندی Nginx، باید url ورود به سیستم مورد استفاده توسط برنامه خود را بدانید. بسته به نرم افزاری که استفاده می کنید، دسترسی به ورود شما می تواند به صورت زیر باشد:
- /api/login for an API
- /wp-login for WordPress
- /admininistrator for a backend access
- /admin/login for a backend access
- /user/login for a frontend access
سرور مجازی را با ویرایشگر مورد علاقه خود ویرایش کنید
برای تنظیمات کلی در فایل etc/nginx/nginx.conf در بلوک http{..} دستور زیر را قرار دهید:
#set login zone max 1 request per second per client
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
server {
server_name example.com;
root /var/www/html/;
#limit connection per ip
limit_conn perip 10;
#protect /admin/login
location ~/admin/login {
limit_req zone=login; #use login limit_req_zone
limit_req_status 444; #return 444 when limiting
}
location / {
#other none rate limited requests
}
۱۰m سایز ناحیه است. ۱MB میتواند ۱۶۰۰۰ وضعیت را نگهداری کند. اگر تعداد سایت های شما زیاد است و یا سایت هایی با بازدید سنگین دارید ممکن است بخواهید این مقدار را روی ۲۰MB یا ۱۰۰MB تنظیم کنید.
۱r/s به این معناست که یک درخواست در هر ثانیه مجاز است. شما نمیتوانید شکاف ها را مشخص کنید. اگر مایلید این مقدار را باز هم محدود کنید یعنی تعداد درخواست های در هر ثانیه کمتر شود میتوانید ۳۰r/m را امتحان کنید که به معنای ۳۰ درخواست در هر دقیقه یا یک درخواست در هر دو ثانیه است
Testing
برای آزمایش ویژگی، می توانید 3 درخواست را پشت سر هم از خط فرمان اجرا کنید:
curl http://example.com/admin/login -I; curl http://example.com/admin/login -I; curl http://example.com/admin/login -I;
درخواست اول باید یک کد http برگرداند (200,401,403…). درخواستهای زیر باید چیزی مانند “curl: (52) پاسخ خالی از سرور” را برگردانند.
your.client.ip - - [15/Jun/2020:23:40:11 +0000] "HEAD /admin/login HTTP/1.1" 200 0 "-" "curl/7.58.0"
your.client.ip - - [15/Jun/2020:23:40:11 +0000] "HEAD /admin/login HTTP/1.1" 444 0 "-" "curl/7.58.0"
your.client.ip - - [15/Jun/2020:23:40:11 +0000] "HEAD /admin/login HTTP/1.1" 444 0 "-" "curl/7.58.0"
نتیجه گیری
با پیاده سازی ویژگی های اساسی مانند محدودیت نرخ و حداکثر اتصال در هر IP، به محافظت از برنامه و داده های کاربر خود کمک خواهید کرد. این پیکربندی برای پیکربندی و افزودن یک لایه امنیتی اضافی به برنامه شما زمان زیادی نمی برد.