D2
Администратор
- Регистрация
- 19 Фев 2025
- Сообщения
- 4,380
- Реакции
- 0
Автор: NomadSP
Источник: XSS.is
Противодействие DDoS это один из базовых принципов защиты своих цифровых активов от дистабилизации работы сервисов, нарушения пропускной способности, потери мощности и других неприятностей, которые несёт Distributed Denial of Service Attack.
При этом существуют методы противодействия, а так же способы изучить данный вектор атак самостоятельно хотя бы для достижения принципов понимания, а может и вовсе для использования в тренировках.
Начнём с Firewall.
Поскольку по умолчанию мы используем Linux OS, то рассматриваемый инструмент: iptables. Встроенный инструмент, управляемый командой, например:
Bash: Скопировать в буфер обмена
Это позволит блокировать трафик на основании заданного IP, хотя могут быть настроены и другие правила.
Для более удобного использования можно использовать ufw: Интерфейс для работы с iptables.
Однако, я бы порекомендовал нам разобраться с инструментом Fail2Ban - который позволит автоматизировать работу через iptables.
Шаг 1. Установка Fail2Ban.
По умолчанию, f2b уже доступен на большинстве дистрибутивов Linux OS, поэтому переходим к установке:
Bash: Скопировать в буфер обмена
Шаг 2. Настраиваем конфигурацию.
Fail2Ban по умолчанию поставляется с конфигурационным файлом /etc/fail2ban/jail.conf
Для поддержания безопасности, рекомендую создать свой файл /etc/fail2ban/jail.local, чтобы избежать перезаписи настроек при обновлениях.
Создаём файл jail.local:
Bash: Скопировать в буфер обмена
Шаг 3. Редактируем конфигурацию:
Bash: Скопировать в буфер обмена
Основные настройки, которые можно изменить:
- ignoreip: IP-адреса, которые не будут блокироваться (например, корпоративные).
- bantime: Время блокировки в секундах.
- findtime: Период времени, за который фиксируется количество неудачных попыток.
- maxretry: Количество попыток подключения до блокировки IP.(т. е., после этого количества - IP уходит в стоп-лист)
Пример:
INI: Скопировать в буфер обмена
Настройка для SSH:
В целом, Fail2Ban имеет возможность так же защиты SSH, что можно настроить там же в jail.local.
Пример настройки для SSH:
INI: Скопировать в буфер обмена
Интеграция с Ngnix/Apache etc.
Каждый подобный сервис имеет свой фильтр - набор правил для поиска аномалий в журналах, например, /var/log/nginx/error.log.
Пример настройки для Nginx:
INI: Скопировать в буфер обмена
Шаг 4. Перезапускаем Fail2Ban.
После изменения конфигураций необходимо перезапустить Fail2Ban, чтобы изменения вступили в силу:
Bash: Скопировать в буфер обмена
Шаг 5. Проверяем состояния Fail2Ban.
Проверка статусов всех jails:
Bash: Скопировать в буфер обмена
Если надо проверить статус конкретного jail, к примеру, SSH, то используем:
Bash: Скопировать в буфер обмена
Шаг 6. Проверяем логи:
Bash: Скопировать в буфер обмена
Соответственно, таким образом у нас настроены параметры проверки IP, конкретного SSH, а так же сервиса.
В ситуации, если какой-то IP-адрес необходимо разблокировать, например, в рамках внутренних тестов, то можно использовать:
Bash: Скопировать в буфер обмена
Reverse.
Теперь попробуем обратное - тесты на практике, чтобы понять уязвимые векторы нашей построенной инфраструктуры, например.
Я предлагаю для этого использовать незамысловатый Metasploit, поэтому рассмотрим пошагово:
Шаг 1. Установливаем Metasploit:
Bash: Скопировать в буфер обмена
Шаг 2. Запускаем Metasploit:
Bash: Скопировать в буфер обмена
Шаг 3: Выбориаем модуль для симуляции DDoS-атаки.
Например, для SYN Flood используем соответствующий модуль Metasploit.
Bash: Скопировать в буфер обмена
Шаг 4. Настраиваем параметры модуля.
После выбора модуля нам нужно указать IP-адрес цели (например, тестового сервера) и порт, который будет атакован.
- RHOST: Укажите IP-адрес тестового сервера.
- RPORT: Порт, на который будет направлена атака (например, 80 для веб-сервера).
- INTERFACE: Укажите сетевой интерфейс для исходящей атаки (например, `eth0`).
Пример команды настройки:
Bash: Скопировать в буфер обмена
Шаг 5. Запуск атаки.
После настройки параметров, запустите атаку:
Bash: Скопировать в буфер обмена
Это запустит SYN Flood атаку на указанный IP-адрес и порт.
Проверка недоступности сервера.
Для того чтобы убедиться в эффекте тестовой атаки, поступаем следующим образом:
Шаг 1. Ping-тест.
Попробуйте отправить запрос ping и посмотрите, как изменится ответ:
Bash: Скопировать в буфер обмена
Если сервер не отвечает или отвечает с большими задержками, это может быть признаком того, что он перегружен или недоступен.
Шаг 2. Тест порта.
Если вы атакуете веб-сервер (например, порт 80), попробуйте открыть сайт в браузере. Недоступность и лаги - явный признак стресса.
Инструменты для мониторинга и визуализации DDoS-атак во время ваших тестов.
Все, кто ранее уже читал мои статьи, устали от Promethius, а уж тем более Grafana, поэтому сегодня предлагаю рассмотреть альтернативу.
К слову, данную альтернативу так же можно использовать во время ваших собственных тестов.
Интегрируем Suricata с ELK стеком.
Шаг 1. Установим пакеты компонентов ELK и Suricata.
Напомню, что Suricata должна быть установлена на сервере, чтобы перехватывать пакеты сетевого трафика.
Bash: Скопировать в буфер обмена
Шаг 2. Установка ELK стека.
2.1. Установка Elasticsearch.
Bash: Скопировать в буфер обмена
Шаг 2.2. Включаем Elasticsearch.
Bash: Скопировать в буфер обмена
Шаг 2.3. Проверка статуса.
Bash: Скопировать в буфер обмена
Шаг 3. Установим Logstash.
Bash: Скопировать в буфер обмена
Для обработки логов Suricata мы создадим отдельную конфигурацию.
Шаг 4. Установка Kibana.
Bash: Скопировать в буфер обмена
Шаг 4.1. Включаем Kibana.
Bash: Скопировать в буфер обмена
Шаг 4.2. Откроем Kibana в браузере:
http://localhost:5601
Шаг 5. Настройка Suricata.
Suricata может отправлять логи напрямую в Logstash, который затем отправит их в Elasticsearch для хранения и обработки.
- Конфигурация Suricata для работы с JSON-логами.
Bash: Скопировать в буфер обмена
В разделе outputs: убедитесь, что формат JSON включен:
YAML: Скопировать в буфер обмена
Это создаст файл логов /var/log/suricata/eve.json, содержащий все события в формате JSON.
Шаг 6. Конфигурация Logstash.
Создадим конфигурационный файл для Logstash, чтобы он принимал логи Suricata и отправлял их в Elasticsearch:
Bash: Скопировать в буфер обмена
Шаг 6. Добаввляем обработчика JSON-логов:
Bash: Скопировать в буфер обмена
Пояснение:
- Читаем логи из файла /var/log/suricata/eve.json.
- Разделили события на алерты и обычные логи.
- Настроили отправку данных в Elasticsearch с разными индексами для алертов и логов.
Шаг 7. Перезапустите Logstash:
Bash: Скопировать в буфер обмена
Шаг 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: Скопировать в буфер обмена
Теперь нам необходимо связать созданный обработчик логов с Syslog, для создания единого журнала логов или инцидентов.
Python: Скопировать в буфер обмена
По итогу мы получаем следующие возможности:
1. Фильтрация событий: Вы можете добавлять правила фильтрации, чтобы обрабатывать только критические инциденты и атаки.
2. Логирование ошибок и предупреждений: Настроили внутреннее логирование ошибок.
3. Управление конфигурацией: Используя адреса конфигурационных файлов мы получаем логи из конкретных сервисов.
Заключение.
За эту статью мы научились обнаруживать, создавать тестово, мониторить и логировать события DDoS атак на инфраструктуру, что позволит своевременно принять меры и пофиксить недоступность целевого сервиса из-за стресса.
Все настройки необходимо подбирать под свои нужды, поэтому настоятельно рекомендую начать с аудита своих систем безопасности, а дальше уже подбирать нудные точки защиты и метода отражения атак.
Желаю удачи в настройках! До скорого!
Источник: 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
Шаг 3. Редактируем конфигурацию:
Bash: Скопировать в буфер обмена
sudo nano /etc/fail2ban/jail.local
Основные настройки, которые можно изменить:
- 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
Шаг 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
Это запустит 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 атак на инфраструктуру, что позволит своевременно принять меры и пофиксить недоступность целевого сервиса из-за стресса.
Все настройки необходимо подбирать под свои нужды, поэтому настоятельно рекомендую начать с аудита своих систем безопасности, а дальше уже подбирать нудные точки защиты и метода отражения атак.
Желаю удачи в настройках! До скорого!