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

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
Автор: NomadSP
Источник: XSS.is


Противодействие 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 атак на инфраструктуру, что позволит своевременно принять меры и пофиксить недоступность целевого сервиса из-за стресса.

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

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