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

Що таке DDoS і чим він небезпечний

DoS (Denial of Service) — це атака на систему, основною метою якої є довести її до стану відмови. Іншими словами: хакер створює таке навантаження на сервер, що користувачі, які намагаються отримати доступ до ресурсів машини, не можуть цього зробити.

DDoS (Distributed Denial of Service) — атака на систему, яка йде з великої кількості комп’ютерів. Мета його та ж, що й у DoS — довести систему до відмови у роботі.

Суть DDoS полягає в наступному: з кожного комп’ютера відправляється така кількість пакетів із запитами до ресурсу, що на їх обробку та відправку пакетів у відповідь йде весь ресурс системи. Як результат: послуги, роботу яких дана система підтримує, «падають», а клієнти втрачають можливість зайти на сервер, отримати доступ до сайту і т.д.

Наслідком такої атаки для власника ресурсу є насамперед недоотримання прибутку через простоювання системи. Саме тому важливо вжити усіх можливих заходів. А якщо зловмисники до вас уже дісталися, максимально швидко відреагувати і дати відсіч хакерам.

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

Для підвищення опірності сервера DDoS-атакам можна скористатися різними інструментами, основні з яких:

  1. Налаштування Apache;
  2. Встановлення та налаштування mod_security;
  3. Налаштування зв’язки Apache+nginx.

Нижче ми детально розглянемо кожен з них.

Налаштування веб-сервера Apache

Щоб сервер був більш захищений від DDoS-атаки, необхідно виконати налаштування конфігураційних файлів Apache, розміщених у каталогу /usr/local/etc/httpd/conf (3 шт.):

  • httpd.conf
  • srm.conf
  • access.conf

Перш ніж розпочати їх редагування, створіть копії файлів. Для цього в командному рядку консолі введіть команду сp і вкажіть повне ім’я файлу, який хочете скопіювати, а через пропуск — назва файлу-копії.

Наприклад:

cp /etc/httpd/conf/httpd.conf ~/httpd.conf.backup

Не у всіх версіях Apache доступні однакові налаштування безпеки, тому отримання зловмисником інформації про версію системи збільшує шанси атакувати сервер. Щоб запобігти витоку інформації про систему, скористайтесь даними файлу httpd.conf.

Щоб заборонити виведення даних про версію сервера на сторінці під час відображення помилки, вимкніть директиву ServerSignature (вкажіть Off навпроти неї). Також за допомогою директиви ServerTokens необхідно обмежити обсяг інформації, яку сервер повідомляє про себе, відповідаючи на http-запит. Для цього навпроти зазначеної директиви напишіть «Prod». В результаті сервер виводитиме в Server header тільки слово «Apache» замість повної інформації про його версію.

Тепер в httpd.conf встановимо певні ліміти:

  1. Timeout — період часу, протягом якого сервер очікує на продовження недоотриманого запиту клієнта або намагається надіслати відповідь. Установлене за замовчуванням значення (300 сек) можна зменшити до 100 сек (зокрема для VPS), що знизить вплив DDos-атак. При цьому важливо врахувати швидкість інтернет-з’єднання та розмір пакетів, які плануєте одержувати, щоб зберегти нормальну роботу сервісів;
  2. KeepAliveTimeout — час очікування сервера наступного запиту клієнта в рамках одного з’єднання. Рекомендується знизити задані спочатку 15 секунд до 10 с (при середньому навантаженні) або 5 с (за високої завантаженості) сервера;
  3. Ім’я користувача та група. У якості імені користувача user та group, з яких запускатиметься сервер, вкажіть «apache» — так ви не поставите під удар поштовий сервер, якщо раптом хакерам вдасться обійти захист;
  4. Директива Options. Використовуючи директиву Options, яка міститься всередині тега Directory, вимкніть деякі опції, зокрема: SSI, запуск CGI, FollowSymLinks. Для цього прописуємо навпроти них такі значення:
  • Options -Includes — вимикає SSI
  • Options -ExecCGI — вимикає CGI
  • Options -FollowSymLinks — забороняє Apache слідувати за символьними посиланнями

Якщо прописати для Options «None», ми відключимо їх усі. Щоб відключити окремі опції, пишемо:

Options -ExecCGI -FollowSymLinks -Indexes

У access.conf (одному з трьох, згаданих раніше файлів), тег Directory, можна вимкнути підтримку .htaccess файлів, встановивши для директиви AllowOverride значення None . Однак, якщо вам необхідно, щоб сервер читав такі файли, залиште AllowOverride увімкненою, прописавши навпроти неї All (дозволяє використовувати будь-які директиви .htaccess) або обмеживши його:

  • AuthConfig — доступ для директив дозволу
  • FileInfo — дає можливість використовувати директиви, що керують типами документів
  • Indexes — можливість використання директив управління індексацією каталогу
  • Limit — дозволяє лише директиви керування доступом
  • Options — лише директиви управління специфічними особливостями каталогу.

Такі директиви, як LimitRequestFieldSize, а також LimitRequestFields і LimitRequestLine, у більшості випадків виставлені автоматично на прийнятному для більшої частини серверів рівні. Вони мають обмежити розміри клієнтських запитів, що також допомагає захистити сервер від DoS-атак. Ознайомившись із документацією, можна налаштувати їх ретельніше, тим самим обмеживши споживання ресурсів клієнтами.

Обмежити розмір файлів, що завантажуються (LimitRequestBody — за замовчуванням не лімітований) і XML запитів (LimitXMLRequestBody — за замовчуванням 1 МБ) можна у файлі httpd.conf, прописавши бажане значення в байтах. Наприклад, встановити максимальний розмір файлів на рівні 1 МБ, а запитів XML від 1 до 10 МБ (10485760 байт).

Залежно від можливостей ОЗП необхідно змінити налаштування MaxClients. Тут можна задати максимальну кількість клієнтських запитів, які сервер оброблятиме одночасно. Завдяки цьому MaxClients дозволяє знизити або збільшити навантаження на машину.

При виборі оптимального числа для цього параметра подумайте, яка кількість клієнтів може одночасно знаходитись на вашому сайті (по можливості проаналізуйте статистику відвідувань) і зробіть невелику надбавку, щоб уникнути відмови у доступі до сайту у разі сплеску відвідуваності.

Встановлення та налаштування mod_security

Ще один спосіб захистити сервер від DDoS-атаки — встановити модуль mod_security для Apache та налаштувати в ньому необхідні фільтри. Для встановлення модуля використовують такі команди:

apt-get install libapache2-modsecurity — Ubuntu/Debian

yum install mod_security — CentOS

де:

  • apt-get install та yum install — команди для встановлення програм для систем Ubuntu, Debian та CentOS відповідно;
  • libapache2-modsecurity та mod_security — ім’я програми, яку ми встановлюємо зі сховища системи

Щоб переконатися, що mod_security завантажився, у командному рядку пишемо:

apachectl-M | grep --color security

Індикатором того, що завантаження пройшло успішно, є повідомлення:

security2_module (shared)

Після цього необхідно завершити установку модуля, яка передбачає перейменування файлу конфігурації:

mv /etc/modsecurity/modsecurity.conf{-recommended,}

Перезавантажте Apache, щоб внесені зміни почали працювати:

service apache2 reload

Тепер, коли все встановлено, можна розпочинати налаштування mod_security. Залишати конфігураційний файл modsecurity.conf без змін не варто, оскільки базово він налаштований тільки відстежувати запити, не здійснюючи блокування виявлених уразливостей.

Щоб перевести mod_security в режим розпізнавання та знешкодження вразливостей, в modsecurity.conf відредагуємо рядок SecRuleEngine, а саме: встановлене для неї значення DetectionOnly змінюємо на On:

Було:

SecRuleEngine DetectionOnly

Стало:

SecRuleEngine On

Оскільки DDoS-атака пов’язана безпосередньо з передачею даних, наступним кроком буде обмежити їх можливий обсяг. У mod_security за це відповідають директиви SecRequestBodyLimit та SecRequestBodyNoFilesLimit. Значення базово прописаної конфігурації становить 12,5 МБ та 128 КБ відповідно. Їх можна зменшити, тим самим обмеживши максимальний обсяг даних, які можуть бути надіслані серверу. При цьому SecRequestBodyLimit вже враховує обсяг файлів завантаження, що передаються, а SecRequestBodyNoFilesLimit — ні.

Відкоригувати можна і максимальний об’єм тіла запиту, що міститься в RAM. Для цього скористаємося налаштуваннями SecRequestBodyInMemoryLimit. Дані, що залишилися, при цьому підуть у Swap. Щоб зменшити навантаження на пам’ять, це значення (128 КБ) можна зменшити.

Крім коригування директив modsecurity.conf необхідно підвантажити правила CRS (Core Rule Set — базові правила фільтрації). Для цього відредагуємо дані /etc/apache2/mods-enabled/mod-security.conf.

До директорії з модулем security2_module додаємо каталоги з правилами, які веб-сервер Apache прочитає під час запуску:

<IfModule security2_module>
Include “/usr/share/modsecurity-crs/*.conf”
Include “/usr/share/modsecurity-crs/activated_rules/*.conf”
</IfModule>

Правила для mod-security знаходяться у каталогах:

  1. /usr/share/modsecurity-crs/base_rules
  2. /usr/share/modsecurity-crs/optional_rules
  3. /usr/share/modsecurity-crs/experimental_rules

Тепер необхідно в каталозі activated_rules створити символічні посилання для активації потрібних нам правил. Тут одразу задаємо правило для захисту від введення SQL-коду, що не дозволить зловмисникам отримати доступ до баз даних MySQL через фіктивні логін-пароль:

cd /usr/share/modsecurity-crs/activated_rules/
ln -s /usr/share/modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf

Щоб внести зміни, перезапустіть Apache.

Якщо все зробили правильно і включили SecRuleEngine, то при спробі обійти фаєрвол і отримати доступ до БД SQL система видасть помилку «403 Forbidden».

Якщо після введення довільного SQL-коду ви успішно зайшли, значить DetectionOnly не було замінено на On для параметра SecRuleEngine.

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

Встановлення та налаштування зв’язки Apache+nginx

Інший варіант захисту — встановити проксі-сервер nginx у зв’язці з Apache, що посилює безпеку вашої системи. При такій кооперації nginx посилює (страхує) Apache, забираючи він обробку статичного контенту.

Nginx встановлюється в консолі за допомогою команди:

apt-get install nginx — для Debian/Ubuntu

yum install nginx для CentOS

Як і в Apache, тут також є свої налаштування безпеки, доступні /etc/nginx/nginx.conf. Найбільш важливими параметрами для нас є:

  1. client_max_body_size — обмежує максимальний розмір тіла запиту. Як правило, встановлюється в межах від 1 до 24 МБ;
  2. сlient_body_buffer_size — визначає розмір буфера для читання тіла запиту від клієнта (від 16 КБ);
  3. client_header_timeout — обмежує час передачі повного заголовка запиту (зазвичай задається в межах 10-20 секунд);
  4. client_body_timeout — визначає час передачі тіла запиту (зазвичай встановлюється таке ж значення, як для параметра client_header_timeout);
  5. keepalive_timeout — встановлює тривалість з’єднання клієнта з сервером (15–30 секунд);
  6. send_timeout — час, що виділяється клієнту на прийняття відповіді (2–10 секунд).

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

Як захиститися від DDoS-атаки, якщо вона вже йде

Якщо зловмиснику все ж таки вдалося обійти створені нами перепони, саме час задуматися, як протистояти атакі, що ведеться на сервер або сайт.

Перше, що необхідно зробити: проаналізувати логи та зрозуміти, хто і в якому напрямку веде атаку, визначити превалюючий тип трафіку. Для цих цілей добре підійде утиліта tcpdump, яка дозволяє подивитися, який тип пакетів приходить найчастіше, а також host-name та IP-адреса, з яких вони були відправлені.

Результат аналізу трафіку, отриманий за допомогою tcpdump, можна записати у файл для подальшого вивчення, додавши ключ -w (у командному рядку — tcpdump -w <ім’я файлу>). Крім того, певні ключі дозволяють відразу задати параметри фільтрації та виведення інформації:

  1. -n — замінює hostname на IP-адресу;
  2. -nn — відображає номер порту, а не протокол, що ним використовується;
  3. -q — забезпечує мінімальний виведення інформації (ім’я протоколу, маршрут пакета, номери портів, обсяг переданих даних);
  4. -r <file> — читає трафік із файлу, попередньо записаний за допомогою ключа -w, наприклад, tcpdump -r dumpfile;
  5. -T <type> — інтерпретує пакети певного типу;
  6. -tttt — виводить дату і час;
  7. -v — показує детальну інформацію про трафік: TTL, ID, довжину заголовка запиту та дані про нього);
  8. -з <number> — наказує утиліті tcpdump завершити роботу після отримання заданої кількості пакетів.

Коли IP-адреси, з яких надходить небажаний трафік, визначено, їх необхідно заблокувати. Для цього підійдуть утиліти (фаєрволи), здатні відфільтрувати та обмежити отримання небажаних пакетів: iptables, fail2ban, APF, ipfw.

Щоб додати до списку фільтра iptables певну адресу та тип пакета, передачу якого ми хочемо обмежити, використовуємо команду:

iptables -A INPUT -p tcp --dport 80 -s 95.153.67.144 -j DROP

де:

  1. -A — говорить про необхідність додати правило
  2. INPUT — позначає всі вхідні пакети (трафік, який необхідно обмежити)
  3. -p <protocol> — вказує протокол, для якого діятиме правило, що додається.
  4. –dport <port number> — порт, на який буде йти трафік (тільки якщо нам відомо ця інформація)
  5. -s <address> — вказує на джерело надсилання пакетів (можна прописати як IP-адресу, так і ім’я мережі або hostname)
  6. -j — повідомляє команду, яку необхідно застосувати, якщо вхідний пакет відповідає всім зазначеним раніше умовам.

Коли нам відома тільки IP-адреса, з якої приходить шкідливий трафік, можна заблокувати її повністю:

iptables -A INPUT -s 95.153.67.144 -j DROP

Іншим не менш популярним і дієвим способом відбиття атаки є налаштування утиліти fail2ban.

Крім безкоштовних варіантів протидії DDoS-атакам не завадить і, навіть є бажаним, скористатися платними системами захисту, на кшталт CloudFlare, Comodo, Cisco, Wanguard.