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