Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| vm:nginx:06-file2ban_v2 [2025/12/01 12:09] – создано admin | vm:nginx:06-file2ban_v2 [2026/03/03 14:00] (текущий) – удалено admin | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | ====== Установка и настройка Fail2ban для Nginx Proxy Manager ====== | ||
| - | ===== Описание ===== | ||
| - | |||
| - | Данная инструкция описывает процесс установки и настройки Fail2ban для защиты Nginx Proxy Manager от: | ||
| - | * Сканирования уязвимостей | ||
| - | * 404 флуда | ||
| - | * DoS атак | ||
| - | * SSH брутфорса | ||
| - | |||
| - | ===== Требования ===== | ||
| - | |||
| - | * Ubuntu Server 24.04 (или аналогичный дистрибутив) | ||
| - | * Nginx Proxy Manager установленный в Docker | ||
| - | * Root доступ к серверу | ||
| - | |||
| - | ===== Установка Fail2ban ===== | ||
| - | |||
| - | ==== Шаг 1: Установка пакета ==== | ||
| - | |||
| - | <code bash> | ||
| - | apt update | ||
| - | apt install fail2ban -y | ||
| - | </ | ||
| - | |||
| - | ==== Шаг 2: Создание структуры каталогов ==== | ||
| - | |||
| - | <code bash> | ||
| - | mkdir -p / | ||
| - | </ | ||
| - | |||
| - | ===== Создание парсера логов Nginx Proxy Manager ===== | ||
| - | |||
| - | ==== Шаг 3: Создание скрипта парсера ==== | ||
| - | |||
| - | Создайте файл / | ||
| - | |||
| - | <code bash> | ||
| - | cat > / | ||
| - | #!/bin/bash | ||
| - | # Скрипт парсинга логов nginx-proxy-manager для fail2ban | ||
| - | # Обрабатывает все access логи из папки nginxpm | ||
| - | |||
| - | LOG_DIR="/ | ||
| - | LOG_FILE="/ | ||
| - | CONTAINER_NAME=" | ||
| - | PARSER_LOG="/ | ||
| - | |||
| - | # Создаем директории если они не существуют | ||
| - | mkdir -p " | ||
| - | |||
| - | # Проверяем, | ||
| - | if ! docker ps --format "table {{.Names}}" | ||
| - | echo " | ||
| - | exit 1 | ||
| - | fi | ||
| - | |||
| - | # Проверяем существование директории с логами | ||
| - | if [ ! -d " | ||
| - | echo " | ||
| - | exit 1 | ||
| - | fi | ||
| - | |||
| - | # Очищаем целевой файл | ||
| - | > " | ||
| - | |||
| - | # Счетчик обработанных файлов и строк | ||
| - | processed_files=0 | ||
| - | total_lines=0 | ||
| - | |||
| - | # Обрабатываем все файлы с окончанием *_access.log | ||
| - | for logfile in " | ||
| - | # Проверяем, | ||
| - | if [ -f " | ||
| - | lines_from_file=$(tail -n 2000 " | ||
| - | tail -n 2000 " | ||
| - | processed_files=$((processed_files + 1)) | ||
| - | total_lines=$((total_lines + lines_from_file)) | ||
| - | echo " | ||
| - | fi | ||
| - | done | ||
| - | |||
| - | # Если не найдено ни одного файла логов | ||
| - | if [ $processed_files -eq 0 ]; then | ||
| - | echo " | ||
| - | # Создаем пустой файл чтобы fail2ban не ругался | ||
| - | touch " | ||
| - | fi | ||
| - | |||
| - | # Устанавливаем права доступа | ||
| - | chmod 644 " | ||
| - | |||
| - | # Логируем статистику каждый час (когда минуты = 00) | ||
| - | MINUTE=$(date +%M) | ||
| - | if [ " | ||
| - | final_lines=$(wc -l < " | ||
| - | echo " | ||
| - | fi | ||
| - | |||
| - | # Ротация логов parser.log (если больше 5MB) | ||
| - | if [ -f " | ||
| - | mv " | ||
| - | touch " | ||
| - | chmod 644 " | ||
| - | fi | ||
| - | |||
| - | # Удаление записей старше 30 дней из лог-файла | ||
| - | if [ -f " | ||
| - | CUTOFF_DATE=$(date -d '30 days ago' ' | ||
| - | TEMP_FILTERED="/ | ||
| - | | ||
| - | # Фильтруем записи не старше 30 дней | ||
| - | awk -v cutoff=" | ||
| - | { | ||
| - | # Извлекаем дату из строки лога (формат: | ||
| - | match($0, / | ||
| - | if (date_match[1]) { | ||
| - | # Преобразуем дату в timestamp для сравнения | ||
| - | cmd = "date -d \"" | ||
| - | cmd | getline log_timestamp | ||
| - | close(cmd) | ||
| - | | ||
| - | cmd2 = "date -d \"" | ||
| - | cmd2 | getline cutoff_timestamp | ||
| - | close(cmd2) | ||
| - | | ||
| - | # Если дата лога >= даты отсечки, | ||
| - | if (log_timestamp >= cutoff_timestamp) { | ||
| - | print $0 | ||
| - | } | ||
| - | } else { | ||
| - | # Если не удалось извлечь дату, оставляем запись | ||
| - | print $0 | ||
| - | } | ||
| - | }' " | ||
| - | | ||
| - | # Заменяем оригинальный файл отфильтрованным | ||
| - | if [ -f " | ||
| - | mv " | ||
| - | chmod 644 " | ||
| - | fi | ||
| - | fi | ||
| - | |||
| - | # Ротация основного лог-файла (если больше 10MB) | ||
| - | if [ -f " | ||
| - | mv " | ||
| - | touch " | ||
| - | chmod 644 " | ||
| - | echo " | ||
| - | fi | ||
| - | |||
| - | exit 0 | ||
| - | EOF | ||
| - | </ | ||
| - | |||
| - | ==== Шаг 4: Установка прав на скрипт ==== | ||
| - | |||
| - | <code bash> | ||
| - | chmod +x / | ||
| - | </ | ||
| - | |||
| - | ==== Шаг 5: Добавление скрипта в cron ==== | ||
| - | |||
| - | <code bash> | ||
| - | (crontab -l 2>/ | ||
| - | </ | ||
| - | |||
| - | Проверка добавления в cron: | ||
| - | |||
| - | <code bash> | ||
| - | crontab -l | ||
| - | </ | ||
| - | |||
| - | ==== Шаг 6: Первый запуск парсера ==== | ||
| - | |||
| - | <code bash> | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | Проверка результата: | ||
| - | |||
| - | <code bash> | ||
| - | ls -lh / | ||
| - | tail -10 / | ||
| - | </ | ||
| - | |||
| - | ===== Настройка фильтров Fail2ban ===== | ||
| - | |||
| - | ==== Шаг 7: Создание фильтра для блокировки сканирования ==== | ||
| - | |||
| - | <code bash> | ||
| - | cat > / | ||
| - | [Definition] | ||
| - | |||
| - | # Формат NPM: [DATE] - STATUS STATUS - METHOD PROTOCOL DOMAIN " | ||
| - | failregex = ^\[.*\] - \d+ \d+ - GET https? .* " | ||
| - | ^\[.*\] - 40\d \d+ - GET https? .* " | ||
| - | ^\[.*\] - \d+ \d+ - GET https? .* " | ||
| - | ^\[.*\] - \d+ \d+ - GET https? .* " | ||
| - | ^\[.*\] - \d+ \d+ - (GET|POST) https? .* " | ||
| - | ^\[.*\] - \d+ \d+ - (GET|POST) https? .* " | ||
| - | ^\[.*\] - \d+ \d+ - GET https? .* " | ||
| - | |||
| - | ignoreregex = | ||
| - | EOF | ||
| - | </ | ||
| - | |||
| - | ==== Шаг 8: Создание фильтра для блокировки 404 флуда ==== | ||
| - | |||
| - | <code bash> | ||
| - | cat > / | ||
| - | [Definition] | ||
| - | |||
| - | # Блокировка множественных 404 ошибок | ||
| - | failregex = ^\[.*\] - 404 \d+ - (GET|POST|HEAD) https? .* " | ||
| - | |||
| - | ignoreregex = | ||
| - | EOF | ||
| - | </ | ||
| - | |||
| - | ==== Шаг 9: Создание фильтра для блокировки DoS ==== | ||
| - | |||
| - | <code bash> | ||
| - | cat > / | ||
| - | [Definition] | ||
| - | |||
| - | # Блокировка слишком частых запросов (DoS) | ||
| - | failregex = ^\[.*\] - \d+ \d+ - (GET|POST|HEAD) https? .* " | ||
| - | |||
| - | ignoreregex = ^\[.*\] - \d+ \d+ - (GET|POST) https? .* " | ||
| - | EOF | ||
| - | </ | ||
| - | |||
| - | ==== Шаг 10: Создание символических ссылок на фильтры ==== | ||
| - | |||
| - | <code bash> | ||
| - | ln -sf / | ||
| - | ln -sf / | ||
| - | ln -sf / | ||
| - | </ | ||
| - | |||
| - | ===== Настройка jail для Nginx Proxy Manager ===== | ||
| - | |||
| - | ==== Шаг 11: Создание конфигурации jail ==== | ||
| - | |||
| - | <WRAP center round important 60%> | ||
| - | **ВАЖНО: | ||
| - | </ | ||
| - | |||
| - | <code bash> | ||
| - | cat > / | ||
| - | # Jail конфигурация для nginx защиты | ||
| - | [DEFAULT] | ||
| - | # Время бана в секундах (1 час = 3600) | ||
| - | bantime = 3600 | ||
| - | # Время поиска нарушений (5 минут = 300) | ||
| - | findtime = 300 | ||
| - | # Игнорировать локальные IP | ||
| - | ignoreip = 127.0.0.1/8 ::1 192.168.0.0/ | ||
| - | |||
| - | [nginx-scan-block] | ||
| - | enabled = true | ||
| - | port = http,https | ||
| - | filter = nginx-scan-block | ||
| - | logpath = / | ||
| - | backend = polling | ||
| - | maxretry = 3 | ||
| - | bantime = 7200 | ||
| - | findtime = 300 | ||
| - | action = iptables-multiport[name=nginx-scan, | ||
| - | |||
| - | [nginx-dos-block] | ||
| - | enabled = true | ||
| - | port = http, | ||
| - | filter = nginx-dos-block | ||
| - | logpath = / | ||
| - | backend = polling | ||
| - | maxretry = 50 | ||
| - | bantime = 600 | ||
| - | findtime = 60 | ||
| - | action = iptables-multiport[name=nginx-dos, | ||
| - | |||
| - | [nginx-404-flood] | ||
| - | enabled = true | ||
| - | port = http,https | ||
| - | filter = nginx-404-flood | ||
| - | logpath = / | ||
| - | backend = polling | ||
| - | maxretry = 10 | ||
| - | bantime = 3600 | ||
| - | findtime = 600 | ||
| - | action = iptables-multiport[name=nginx-404, | ||
| - | EOF | ||
| - | </ | ||
| - | |||
| - | ==== Шаг 12: Создание символической ссылки на jail ==== | ||
| - | |||
| - | <code bash> | ||
| - | ln -sf / | ||
| - | </ | ||
| - | |||
| - | ===== Тестирование конфигурации ===== | ||
| - | |||
| - | ==== Шаг 13: Проверка синтаксиса конфигурации ==== | ||
| - | |||
| - | <code bash> | ||
| - | fail2ban-client -t | ||
| - | </ | ||
| - | |||
| - | Ожидаемый результат: | ||
| - | < | ||
| - | OK: configuration test is successful | ||
| - | </ | ||
| - | |||
| - | ==== Шаг 14: Тестирование фильтров на реальных логах ==== | ||
| - | |||
| - | <code bash> | ||
| - | fail2ban-regex / | ||
| - | fail2ban-regex / | ||
| - | fail2ban-regex / | ||
| - | </ | ||
| - | |||
| - | Должны быть найдены совпадения (matched > 0). | ||
| - | |||
| - | ===== Запуск и включение автозагрузки ===== | ||
| - | |||
| - | ==== Шаг 15: Включение и запуск Fail2ban ==== | ||
| - | |||
| - | <code bash> | ||
| - | # Включить автозагрузку | ||
| - | systemctl enable fail2ban | ||
| - | |||
| - | # Запустить службу | ||
| - | systemctl start fail2ban | ||
| - | |||
| - | # Проверить статус | ||
| - | systemctl status fail2ban | ||
| - | </ | ||
| - | |||
| - | ===== Проверка работы ===== | ||
| - | |||
| - | ==== Шаг 16: Проверка активных jail ==== | ||
| - | |||
| - | <code bash> | ||
| - | fail2ban-client status | ||
| - | </ | ||
| - | |||
| - | Ожидаемый вывод: | ||
| - | < | ||
| - | Status | ||
| - | |- Number of jail: 4 | ||
| - | `- Jail list: | ||
| - | </ | ||
| - | |||
| - | ==== Шаг 17: Проверка статуса конкретного jail ==== | ||
| - | |||
| - | <code bash> | ||
| - | fail2ban-client status nginx-scan-block | ||
| - | fail2ban-client status nginx-404-flood | ||
| - | fail2ban-client status nginx-dos-block | ||
| - | </ | ||
| - | |||
| - | Пример вывода: | ||
| - | < | ||
| - | Status for the jail: nginx-scan-block | ||
| - | |- Filter | ||
| - | | |- Currently failed: 5 | ||
| - | | |- Total failed: | ||
| - | | `- File list: / | ||
| - | `- Actions | ||
| - | |- Currently banned: 2 | ||
| - | |- Total banned: | ||
| - | `- Banned IP list: | ||
| - | </ | ||
| - | |||
| - | ==== Шаг 18: Проверка правил iptables ==== | ||
| - | |||
| - | <code bash> | ||
| - | iptables -L -n | grep -E " | ||
| - | </ | ||
| - | |||
| - | Ожидаемый результат: | ||
| - | < | ||
| - | Chain INPUT (policy ACCEPT) | ||
| - | f2b-nginx-dos | ||
| - | f2b-nginx-404 | ||
| - | f2b-nginx-scan | ||
| - | Chain f2b-nginx-404 (1 references) | ||
| - | Chain f2b-nginx-dos (1 references) | ||
| - | Chain f2b-nginx-scan (1 references) | ||
| - | </ | ||
| - | |||
| - | Детальный просмотр забаненных IP: | ||
| - | <code bash> | ||
| - | iptables -L f2b-nginx-scan -n -v | ||
| - | iptables -L f2b-nginx-404 -n -v | ||
| - | iptables -L f2b-nginx-dos -n -v | ||
| - | </ | ||
| - | |||
| - | ===== Мониторинг ===== | ||
| - | |||
| - | ==== Просмотр логов Fail2ban ==== | ||
| - | |||
| - | <code bash> | ||
| - | # Последние 50 строк | ||
| - | tail -50 / | ||
| - | |||
| - | # Только баны | ||
| - | tail -100 / | ||
| - | |||
| - | # Мониторинг в реальном времени | ||
| - | tail -f / | ||
| - | </ | ||
| - | |||
| - | ==== Просмотр логов парсера ==== | ||
| - | |||
| - | <code bash> | ||
| - | tail -50 / | ||
| - | </ | ||
| - | |||
| - | ==== Общая статистика ==== | ||
| - | |||
| - | <code bash> | ||
| - | echo "=== NGINX SCAN BLOCK ===" | ||
| - | fail2ban-client status nginx-scan-block | ||
| - | echo "" | ||
| - | echo "=== NGINX 404 FLOOD ===" | ||
| - | fail2ban-client status nginx-404-flood | ||
| - | echo "" | ||
| - | echo "=== NGINX DOS BLOCK ===" | ||
| - | fail2ban-client status nginx-dos-block | ||
| - | </ | ||
| - | |||
| - | ===== Управление банами ===== | ||
| - | |||
| - | ==== Разбан IP адреса ==== | ||
| - | |||
| - | <code bash> | ||
| - | # Разбан в конкретном jail | ||
| - | fail2ban-client set nginx-scan-block unbanip 1.2.3.4 | ||
| - | |||
| - | # Разбан во всех jail | ||
| - | fail2ban-client unban 1.2.3.4 | ||
| - | </ | ||
| - | |||
| - | ==== Ручной бан IP адреса ==== | ||
| - | |||
| - | <code bash> | ||
| - | fail2ban-client set nginx-scan-block banip 1.2.3.4 | ||
| - | </ | ||
| - | |||
| - | ===== Настройка параметров защиты ===== | ||
| - | |||
| - | ==== Описание параметров jail ==== | ||
| - | |||
| - | ^ Параметр ^ Описание ^ Рекомендуемое значение ^ | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | |||
| - | ==== nginx-scan-block (сканирование) ==== | ||
| - | |||
| - | * **maxretry**: | ||
| - | * **findtime**: | ||
| - | * **bantime**: | ||
| - | |||
| - | Блокирует попытки доступа к: | ||
| - | * Конфигурационным файлам (.env, .git, wp-config.php) | ||
| - | * Скриптам (.php, .asp, .jsp, .cgi) | ||
| - | * SQL инъекциям | ||
| - | * XSS атакам | ||
| - | * Path traversal | ||
| - | |||
| - | ==== nginx-404-flood (404 флуд) ==== | ||
| - | |||
| - | * **maxretry**: | ||
| - | * **findtime**: | ||
| - | * **bantime**: | ||
| - | |||
| - | Блокирует множественные запросы к несуществующим страницам. | ||
| - | |||
| - | ==== nginx-dos-block (DoS атаки) ==== | ||
| - | |||
| - | * **maxretry**: | ||
| - | * **findtime**: | ||
| - | * **bantime**: | ||
| - | |||
| - | Блокирует слишком частые запросы, | ||
| - | |||
| - | ===== Troubleshooting ===== | ||
| - | |||
| - | ==== Fail2ban не запускается ==== | ||
| - | |||
| - | Проверка логов: | ||
| - | <code bash> | ||
| - | journalctl -xeu fail2ban | ||
| - | systemctl status fail2ban | ||
| - | </ | ||
| - | |||
| - | Проверка конфигурации: | ||
| - | <code bash> | ||
| - | fail2ban-client -d | ||
| - | </ | ||
| - | |||
| - | ==== Jail не банит атаки ==== | ||
| - | |||
| - | Проверка чтения лог-файла: | ||
| - | <code bash> | ||
| - | fail2ban-client status nginx-scan-block | ||
| - | </ | ||
| - | |||
| - | Должно быть '' | ||
| - | |||
| - | Если видите '' | ||
| - | |||
| - | ==== Фильтры не находят совпадений ==== | ||
| - | |||
| - | Тестирование фильтра: | ||
| - | <code bash> | ||
| - | fail2ban-regex / | ||
| - | </ | ||
| - | |||
| - | Проверка формата логов: | ||
| - | <code bash> | ||
| - | head -3 / | ||
| - | </ | ||
| - | |||
| - | Формат должен быть: | ||
| - | < | ||
| - | [DATE] - STATUS STATUS - METHOD PROTOCOL DOMAIN " | ||
| - | </ | ||
| - | |||
| - | ==== Парсер не создает лог-файл ==== | ||
| - | |||
| - | Проверка работы парсера: | ||
| - | <code bash> | ||
| - | bash -x / | ||
| - | cat / | ||
| - | </ | ||
| - | |||
| - | Проверка наличия логов Nginx Proxy Manager: | ||
| - | <code bash> | ||
| - | ls -la / | ||
| - | </ | ||
| - | |||
| - | Проверка работы контейнера: | ||
| - | <code bash> | ||
| - | docker ps | grep nginxpm | ||
| - | </ | ||
| - | |||
| - | ===== Автоматическое обновление ===== | ||
| - | |||
| - | Fail2ban обновляется вместе с системой: | ||
| - | |||
| - | <code bash> | ||
| - | apt update | ||
| - | apt upgrade fail2ban -y | ||
| - | systemctl restart fail2ban | ||
| - | </ | ||
| - | |||
| - | ===== Резервное копирование ===== | ||
| - | |||
| - | ==== Файлы для бэкапа ==== | ||
| - | |||
| - | <code bash> | ||
| - | # Конфигурация | ||
| - | / | ||
| - | |||
| - | # Скрипты | ||
| - | / | ||
| - | |||
| - | # Логи (опционально) | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | ==== Создание бэкапа ==== | ||
| - | |||
| - | <code bash> | ||
| - | tar -czf fail2ban-backup-$(date +%Y%m%d).tar.gz \ | ||
| - | / | ||
| - | / | ||
| - | / | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | ===== Удаление ===== | ||
| - | |||
| - | <code bash> | ||
| - | # Остановить службу | ||
| - | systemctl stop fail2ban | ||
| - | systemctl disable fail2ban | ||
| - | |||
| - | # Удалить пакет | ||
| - | apt remove --purge fail2ban -y | ||
| - | |||
| - | # Удалить конфигурацию | ||
| - | rm -rf / | ||
| - | rm -f / | ||
| - | rm -f / | ||
| - | rm -f / | ||
| - | rm -f / | ||
| - | |||
| - | # Удалить из cron | ||
| - | crontab -e | ||
| - | # Удалить строку с parse-nginx-logs.sh | ||
| - | |||
| - | # Очистить правила iptables | ||
| - | iptables -F | ||
| - | </ | ||
| - | |||
| - | ===== Заключение ===== | ||
| - | |||
| - | После выполнения всех шагов ваш сервер будет защищен от: | ||
| - | * ✅ Сканирования уязвимостей | ||
| - | * ✅ 404 флуда | ||
| - | * ✅ DoS атак | ||
| - | * ✅ SSH брутфорса | ||
| - | |||
| - | Fail2ban автоматически: | ||
| - | * Собирает логи из Nginx Proxy Manager каждые 2 минуты | ||
| - | * Анализирует запросы на предмет атак | ||
| - | * Блокирует подозрительные IP на уровне iptables | ||
| - | * Автоматически разбанивает IP после истечения времени бана | ||
| - | |||
| - | ===== Полезные ссылки ===== | ||
| - | |||
| - | * [[https:// | ||
| - | * [[https:// | ||
| - | * [[https:// | ||
| - | |||
| - | ---- | ||
| - | |||
| - | **Автор: | ||
| - | **Дата создания: | ||
| - | **Последнее обновление: | ||