Простий захист від DDoS на сервері

DDoS (Distributed Denial of Service) - це атака, коли ваш сервер або сайт починають завалювати величезною кількістю запитів з безлічі пристроїв одночасно. Уявіть, це ніби у вашу маленьку кав'ярню на 10 столиків одночасно намагаються зайти тисячі відвідувачів - у вас просто не вистачить ресурсів аби всіх обслужити. При цьому ваші "постійні" клієнти навіть не зможуть підійти до дверей!

До речі, коротко про те, чим Dos відрізняється від DDoS:
DoS (Denial of Service, «Відмова в обслуговуванні») - це атака, під час якої один зловмисник або одна програма намагається перевантажити якийсь сервер, сайт або онлайн-сервіс, щоб зробити його недоступним для звичайних користувачів.

DDoS (Distributed Denial of Service, «Розподілена відмова в обслуговуванні») — це більш масштабна версія DoS. У цьому випадку атака йде не від одного джерела, а одночасно від безлічі пристроїв, що часто заражені шкідливим ПЗ і управляються зловмисником.

При DDoS-атаках зловмисники зазвичай контролюють низку заражених комп'ютерів або пристроїв (так званих ботнетів) і використовують їх для відправки великої кількості неправдивих запитів на цільовий сервер або в мережу. Внаслідок цього ресурси (такі як пропускна спроможність, процесор, пам'ять) вичерпуються, і сервер не може відповісти на звичайні запити користувачів.

В результаті такої атаки ресурс стає недоступним для користувачів, падає або значно знижує свою нормальну продуктивність.

Чи можна уникнути її або захиститися від такого виду атаки? Відповідь - так, можна.

І хоча забезпечити справжній повноцінний захист від DDoS може виявитися не простим або витратним завданням, ми розповімо вам про найпростіші способи захисту, які цілком можна організувати своїми силами. У багатьох випадках його може виявитися достатньо, щоб відбитися від простих атак недоброзичливців із мережі.

Використання Nginx для запобігання DDOS-атакам

Веб-сервер NGINX має низку інструментів по боротьбі з DDoS, і його можливості захисту можуть бути розширені за допомогою конфігурації та сторонніх модулів. Хоча NGINX сам по собі не є спеціалізованим брандмауером або інструментом безпеки, у поєднанні з певними конфігураціями він може ефективно пом'якшувати та протистояти поширеним DDoS-атакам.

Встановлення лімітів на запити та підключення

NGINX надає кілька вбудованих модулів, що можуть обмежувати кількість клієнтських з'єднань та частоту запитів, тим самим зменшуючи кількість запитів, що ініціюються певною IP-адресою або користувачем за короткий проміжок часу, послаблюючи тиск DDoS-атак.

Обмеження швидкості підключень

Модуль `limit_conn` дає змогу обмежити кількість з'єднань, що встановлюються кожним IP в один і той самий час. Це дуже ефективно для запобігання атакам із великою кількістю недійсних з'єднань (наприклад, SYN Flood).

http {
    # Визначте область загальної пам'яті для зберігання IP-адреси та кількості з'єднань
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
    
    server {
        listen 80;
        server_name example.com;
        
        # Обмежте максимальну кількість з'єднань на одну IP-адресу
        limit_conn conn_limit 10;

        location / {
            # Звичайне опрацювання запитів
        }
    }
}

У наведеній вище конфігурації `limit_conn_zone` визначає зону загальної пам'яті для зберігання кількості з'єднань IP-адреси, а `limit_conn` обмежує кожну IP-адресу максимум 10 з'єднаннями одночасно.

Обмеження швидкості запитів

http {
    # Визначте область загальної пам'яті для зберігання інформації про швидкість запиту
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;
    
    server {
        listen 80;
        server_name example.com;
        
        # Обмеження до 5 запитів на секунду на одну IP-адресу
        limit_req zone=req_limit burst=10 nodelay;

        location / {
            # Звичайне опрацювання запитів
        }
    }
}

У цій конфігурації `limit_req_zone` визначає зону обмеження швидкості запитів і встановлює максимум 5 запитів на секунду для кожної IP-адреси. Якщо кількість запитів перевищить це значення, NGINX відкидатиме або затримуватиме занадто велику кількість запитів.

Чорний та білий списки

NGINX дає змогу контролювати доступ на основі IP-адрес. За допомогою модуля `ngx_http_access_module` можна легко заблокувати (чорний список) або дозволити доступ (білий список) до певних IP-адрес. Це дуже ефективно для боротьби з невеликими DDoS-атаками або шкідливими запитами з певних IP-адрес.

Конфігурація чорного списку
server {
    listen 80;
    server_name example.com;
    
    # Блокування доступу до IP-адреси
    deny 192.168.1.1;
    
    # Блокування доступу до сегмента IP
    deny 192.168.1.0/24;

    location / {
        # Звичайне опрацювання запитів
    }
}
Налаштування білих списків

Якщо ви дозволяєте доступ до служби тільки певним IP-адресам, ви можете використовувати директиву `allow` та поєднувати її з `deny all` для реалізації механізму білих списків:

server {
    listen 80;
    server_name example.com;
    
    # Дозволити доступ до IP-адреси
    allow 192.168.1.1;
    
    # Заборонити всі інші IP-адреси
    deny all;

    location / {
        # Звичайне опрацювання запитів
    }
}

Налаштування таймауту запиту

Розумне налаштування таймаута запиту може запобігти тривалому зайняттю ресурсів сервера зловмисниками та зменшити кількість DDoS-атак, таких як slowloris. Налаштувавши параметри таймаута з'єднання і запиту в NGINX, можна швидко вимикати недійсні з'єднання.

Налаштування параметрів тайм-ауту

server {
    listen 80;
    server_name example.com;

    # Встановлення таймаута простою клієнтського з'єднання
    keepalive_timeout 10;

    # Встановіть максимальний розмір тіла запиту для запобігання великих запитів
    client_max_body_size 1m;
    
    # Встановлення таймаута для читання клієнтських запитів
    client_body_timeout 10s;

    # Встановлення таймаута читання заголовків клієнта
    client_header_timeout 10s;

    location / {
        #  Звичайне опрацювання запитів
    }
}

  • `keepalive_timeout`: Обмежує максимальний час простою з'єднання, щоб запобігти використанню ресурсів з'єднання з сервером.
  • `client_max_body_size`: Обмежує розмір тіла запиту, аби запобігти виснаженню ресурсів сервера надто великими запитами.
  • `client_body_timeout` та `client_header_timeout`: Обмежують час читання вмісту та заголовка запиту для запобігання повільним атакам.

Оптимізація кешу й статичних ресурсів

Налаштувавши кешування й оптимізувавши доставку статичних ресурсів, ви можете зменшити кількість запитів, які NGINX безпосередньо обробляє на бекенді, тим самим знизивши вплив DDoS-атак. Кешування - це ефективний спосіб знизити піки трафіку та зменшити навантаження на внутрішні сервери.

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cache_zone:10m max_size=10g inactive=60m use_temp_path=off;

server {
    listen 80;
    server_name example.com;
    
    location / {
        proxy_cache cache_zone;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
        proxy_pass http://backend;
    }
}

При налаштуванні кешу NGINX буде кешувати відповіді від бекенда, знижуючи навантаження на бекенд-сервер від повторюваних запитів. Це дає змогу безпосередньо відповідати на велику кількість статичних запитів до ресурсів від NGINX під час DDoS-атак, у такий спосіб знижуючи навантаження на сервер.

Використання черги HTTP-запитів

За допомогою модуля `ngx_http_limit_req_module` ви можете помістити вхідні запити в чергу. Якщо запит перевищує ємність черги, повертається помилка, щоб запобігти перевантаженню сервера великою кількістю запитів.

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    server {
        listen 80;
        server_name example.com;

        location / {
            limit_req zone=one burst=5 nodelay;
            proxy_pass http://backend;
        }
    }
}

Дана конфігурація дозволяє виконувати не більше 1 запиту на секунду. Якщо запит перевищує цю швидкість, його буде поміщено в чергу `burst`, і нові запити буде відхилено, коли чергу буде заповнено.

Використовуйте модулі безпеки сторонніх виробників

NGINX підтримує використання сторонніх модулів для розширення можливостей захисту. Ось деякі часто використовувані модулі та інструменти захисту від DDoS:

  • ModSecurity: Це брандмауер веб-додатків (WAF) з відкритим вихідним кодом, який може виявляти й блокувати поширені моделі атак, зокрема SQL-ін'єкції, XSS тощо, а також володіє певним ефектом захисту від DDoS-атак.
  • NAXSI: Модуль брандмауера, розроблений спеціально для NGINX для захисту веб-додатків від різних атак. Він вирізняється легкістю та високою продуктивністю.

Комбінування брандмауерів із зовнішніми інструментами

Не дивлячись на те, що NGINX може пом'якшити деякі DDoS-атаки, для більш ефективного захисту зазвичай потрібне поєднання інших інструментів і механізмів безпеки:

  • iptables: За допомогою конфігурації Linux `iptables` деякі атаки можуть бути заблоковані безпосередньо на мережевому рівні.
  • Cloudflare або інша CDN: Використання мережі доставки контенту (CDN), наприклад Cloudflare, може забезпечити додатковий захист від DDoS. Брандмауер веб-додатків та послуги з очищення трафіку, що надаються Cloudflare, можуть ефективно протистояти великомасштабним DDoS-атакам.
  • Fail2ban: Об'єднайте журнали NGINX для автоматичного блокування шкідливих IP-адрес за допомогою `fail2ban`.

Динамічне балансування навантаження та еластичне масштабування

Поєднання NGINX із такими платформами, як Kubernetes, дає змогу реагувати на масштабні DDoS-атаки завдяки еластичному масштабуванню. Наприклад, за допомогою функції еластичного масштабування Kubernetes під час піку трафіку автоматично збільшується кількість примірників NGINX, щоб розділити трафік, а під час зниження трафіку ресурси автоматично скорочуються.

Резюме

У статті ми коротко пояснили, що таке DDoS, як захиститися від атак за допомогою нехитрих налаштувань NGINX.
Нагадаємо, що надійний хостинг-провайдер надає шаред хостинг із ддос захистом. Але коли ви використовуєте послугу віртуального сервера, рекомендуємо самостійно виконувати тонке налаштування сервера, аби можливість кібератаки на сайт була мінімізована.

Методи запобігання DDoS-атакам у NGINX включають обмеження швидкості, чорні та білі списки IP-адрес, налаштування таймауту запиту, оптимізацію кешу, використання черг запитів, сторонніх модулів безпеки, а також поєднання брандмауерів та CDN.

Завдяки розумному налаштуванню та використанню зовнішніх інструментів NGINX може ефективно протистояти DDoS-атакам різних розмірів і типів.