Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия | |||
| vm:nginx:05-file2ban [2025/11/09 21:11] – admin | vm:nginx:05-file2ban [2026/03/03 12:15] (текущий) – удалено admin | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | Как использовать / | ||
| - | Самый универсальный способ — создать символические ссылки из / | ||
| - | < | ||
| - | sudo ln -s / | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | ====== Настройка Fail2ban с Nginx Proxy Manager ====== | ||
| - | |||
| - | ===== Описание ===== | ||
| - | |||
| - | Fail2ban - это система защиты от брутфорс атак и автоматизированных сканирований. В связке с Nginx Proxy Manager (nginxpm) обеспечивает автоматическую блокировку подозрительных IP-адресов на основе анализа логов доступа. | ||
| - | |||
| - | ===== Требования ===== | ||
| - | |||
| - | * Docker и docker-compose | ||
| - | * Nginx Proxy Manager (nginxpm) | ||
| - | * Ubuntu/ | ||
| - | * Права root или sudo | ||
| - | |||
| - | ===== Установка Fail2ban ===== | ||
| - | |||
| - | <code bash> | ||
| - | # Обновление пакетов | ||
| - | sudo apt update | ||
| - | |||
| - | # Установка fail2ban | ||
| - | sudo apt install fail2ban -y | ||
| - | |||
| - | # Включение автозапуска | ||
| - | sudo systemctl enable fail2ban | ||
| - | sudo systemctl start fail2ban | ||
| - | </ | ||
| - | |||
| - | ===== Структура конфигурации ===== | ||
| - | |||
| - | < | ||
| - | / | ||
| - | ├── scripts/ | ||
| - | │ | ||
| - | │ | ||
| - | ├── logs/ | ||
| - | │ | ||
| - | │ | ||
| - | └── config/ | ||
| - | ├── jail.local | ||
| - | └── filters/ | ||
| - | </ | ||
| - | |||
| - | ===== Docker Compose конфигурация Nginx Proxy Manager ===== | ||
| - | |||
| - | <code yaml> | ||
| - | services: | ||
| - | app: | ||
| - | image: ' | ||
| - | container_name: | ||
| - | restart: always | ||
| - | ports: | ||
| - | - ' | ||
| - | - ' | ||
| - | environment: | ||
| - | DB_MYSQL_HOST: | ||
| - | DB_MYSQL_PORT: | ||
| - | DB_MYSQL_USER: | ||
| - | DB_MYSQL_PASSWORD: | ||
| - | DB_MYSQL_NAME: | ||
| - | volumes: | ||
| - | - ./ | ||
| - | - ./ | ||
| - | depends_on: | ||
| - | - db | ||
| - | networks: | ||
| - | - webproxy | ||
| - | |||
| - | db: | ||
| - | image: ' | ||
| - | container_name: | ||
| - | restart: always | ||
| - | environment: | ||
| - | MYSQL_ROOT_PASSWORD: | ||
| - | MYSQL_DATABASE: | ||
| - | MYSQL_USER: " | ||
| - | DB_MYSQL_PASSWORD: | ||
| - | volumes: | ||
| - | - ./ | ||
| - | networks: | ||
| - | - webproxy | ||
| - | |||
| - | networks: | ||
| - | webproxy: | ||
| - | external: true | ||
| - | </ | ||
| - | |||
| - | ===== Создание директорий ===== | ||
| - | |||
| - | <code bash> | ||
| - | # Создание структуры папок | ||
| - | sudo mkdir -p / | ||
| - | </ | ||
| - | |||
| - | ===== Скрипт парсинга логов parse-nginx-logs.sh ===== | ||
| - | |||
| - | Создать файл **/ | ||
| - | |||
| - | <code bash> | ||
| - | #!/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 | ||
| - | |||
| - | # Дата отсечки (30 дней назад) для фильтрации логов | ||
| - | CUTOFF_DATE=$(date -d '30 days ago' ' | ||
| - | CUTOFF_TIMESTAMP=$(date -d '30 days ago' ' | ||
| - | |||
| - | # Обрабатываем все файлы с окончанием *_access.log | ||
| - | for logfile in " | ||
| - | # Проверяем, | ||
| - | if [ -f " | ||
| - | # Читаем файл и фильтруем записи не старше 30 дней | ||
| - | awk -v cutoff_ts=" | ||
| - | { | ||
| - | # Извлекаем дату из строки лога (формат: | ||
| - | match($0, / | ||
| - | if (date_match[1]) { | ||
| - | # Преобразуем дату в timestamp для сравнения | ||
| - | cmd = "date -d \"" | ||
| - | cmd | getline log_timestamp | ||
| - | close(cmd) | ||
| - | | ||
| - | # Если дата лога >= даты отсечки, | ||
| - | if (log_timestamp >= cutoff_ts) { | ||
| - | print $0 | ||
| - | } | ||
| - | } else { | ||
| - | # Если не удалось извлечь дату, оставляем запись | ||
| - | print $0 | ||
| - | } | ||
| - | }' " | ||
| - | | ||
| - | processed_files=$((processed_files + 1)) | ||
| - | 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 " | ||
| - | TEMP_FILTERED="/ | ||
| - | | ||
| - | # Финальная фильтрация собранного файла | ||
| - | awk -v cutoff_ts=" | ||
| - | { | ||
| - | # Извлекаем дату из строки лога (формат: | ||
| - | match($0, / | ||
| - | if (date_match[1]) { | ||
| - | # Преобразуем дату в timestamp для сравнения | ||
| - | cmd = "date -d \"" | ||
| - | cmd | getline log_timestamp | ||
| - | close(cmd) | ||
| - | | ||
| - | # Если дата лога >= даты отсечки, | ||
| - | if (log_timestamp >= cutoff_ts) { | ||
| - | print $0 | ||
| - | } | ||
| - | } else { | ||
| - | # Если не удалось извлечь дату, оставляем запись | ||
| - | print $0 | ||
| - | } | ||
| - | }' " | ||
| - | | ||
| - | # Заменяем оригинальный файл отфильтрованным | ||
| - | if [ -f " | ||
| - | mv " | ||
| - | chmod 644 " | ||
| - | fi | ||
| - | fi | ||
| - | |||
| - | # Ротация основного лог-файла (если больше 10MB) | ||
| - | if [ -f " | ||
| - | mv " | ||
| - | touch " | ||
| - | chmod 644 " | ||
| - | echo " | ||
| - | fi | ||
| - | |||
| - | exit 0 | ||
| - | </ | ||
| - | |||
| - | ===== Настройка прав доступа и cron ===== | ||
| - | |||
| - | <code bash> | ||
| - | # Сделать скрипт исполняемым | ||
| - | sudo chmod +x / | ||
| - | |||
| - | # Создать задачу cron для автоматического запуска каждые 5 минут | ||
| - | sudo crontab -e | ||
| - | |||
| - | # Добавить строку: | ||
| - | */5 * * * * / | ||
| - | </ | ||
| - | |||
| - | ===== Скрипт управления manage-fail2ban.sh ===== | ||
| - | |||
| - | Создать файл **/ | ||
| - | |||
| - | <code bash> | ||
| - | #!/bin/bash | ||
| - | # Скрипт управления и мониторинга fail2ban | ||
| - | |||
| - | case " | ||
| - | status) | ||
| - | echo "=== Статус fail2ban ===" | ||
| - | fail2ban-client status | ||
| - | echo "" | ||
| - | echo "=== Детальная информация ===" | ||
| - | for jail in $(fail2ban-client status | grep "Jail list:" | cut -d: -f2 | tr ',' | ||
| - | echo "--- $jail ---" | ||
| - | fail2ban-client status " | ||
| - | done | ||
| - | ;; | ||
| - | reload) | ||
| - | echo " | ||
| - | systemctl reload fail2ban | ||
| - | ;; | ||
| - | restart) | ||
| - | echo " | ||
| - | systemctl restart fail2ban | ||
| - | ;; | ||
| - | unban) | ||
| - | if [ -z " | ||
| - | echo " | ||
| - | exit 1 | ||
| - | fi | ||
| - | echo " | ||
| - | fail2ban-client unban " | ||
| - | ;; | ||
| - | *) | ||
| - | echo " | ||
| - | exit 1 | ||
| - | ;; | ||
| - | esac | ||
| - | </ | ||
| - | |||
| - | <code bash> | ||
| - | # Сделать скрипт исполняемым | ||
| - | sudo chmod +x / | ||
| - | </ | ||
| - | |||
| - | ===== Команды управления ===== | ||
| - | |||
| - | ==== Управление службой fail2ban ==== | ||
| - | |||
| - | <code bash> | ||
| - | # Проверка статуса службы | ||
| - | sudo systemctl status fail2ban | ||
| - | |||
| - | # Запуск службы | ||
| - | sudo systemctl start fail2ban | ||
| - | |||
| - | # Остановка службы | ||
| - | sudo systemctl stop fail2ban | ||
| - | |||
| - | # Перезапуск службы | ||
| - | sudo systemctl restart fail2ban | ||
| - | |||
| - | # Включить автозапуск | ||
| - | sudo systemctl enable fail2ban | ||
| - | </ | ||
| - | |||
| - | ==== Использование скрипта управления ==== | ||
| - | |||
| - | <code bash> | ||
| - | # Показать статус всех jail' | ||
| - | sudo / | ||
| - | |||
| - | # Перезагрузить конфигурацию | ||
| - | sudo / | ||
| - | |||
| - | # Перезапустить службу | ||
| - | sudo / | ||
| - | |||
| - | # Разблокировать IP | ||
| - | sudo / | ||
| - | </ | ||
| - | |||
| - | ===== Просмотр логов ===== | ||
| - | |||
| - | ==== Логи fail2ban ==== | ||
| - | |||
| - | <code bash> | ||
| - | # Основные логи fail2ban | ||
| - | sudo tail -f / | ||
| - | |||
| - | # Логи через systemd | ||
| - | sudo journalctl -u fail2ban -f | ||
| - | |||
| - | # Просмотр последних 100 записей | ||
| - | sudo journalctl -u fail2ban -n 100 | ||
| - | |||
| - | # Поиск конкретных событий | ||
| - | sudo grep "Ban " / | ||
| - | sudo grep "Unban " / | ||
| - | </ | ||
| - | |||
| - | ==== Логи парсера nginx ==== | ||
| - | |||
| - | <code bash> | ||
| - | # Лог работы парсера | ||
| - | sudo tail -f / | ||
| - | |||
| - | # Просмотр обработанных логов nginx | ||
| - | sudo tail -f / | ||
| - | |||
| - | # Статистика размера логов | ||
| - | sudo ls -lah / | ||
| - | |||
| - | # Проверка последних записей в исходных логах nginxpm | ||
| - | sudo ls -la / | ||
| - | sudo tail -10 / | ||
| - | |||
| - | # Подсчет строк в логах | ||
| - | sudo wc -l / | ||
| - | sudo wc -l / | ||
| - | </ | ||
| - | |||
| - | ===== Диагностика и тестирование ===== | ||
| - | |||
| - | ==== Проверка работы парсера ==== | ||
| - | |||
| - | <code bash> | ||
| - | # Запуск парсера вручную | ||
| - | sudo / | ||
| - | |||
| - | # Проверка размера результирующего лога | ||
| - | sudo wc -l / | ||
| - | |||
| - | # Проверка даты самых старых записей (должно быть не более месяца) | ||
| - | sudo head -5 / | ||
| - | sudo tail -5 / | ||
| - | |||
| - | # Проверка что контейнер nginxpm запущен | ||
| - | sudo docker ps | grep nginxpm | ||
| - | </ | ||
| - | |||
| - | ==== Тестирование фильтров ==== | ||
| - | |||
| - | <code bash> | ||
| - | # Тест фильтра на соответствие логу | ||
| - | sudo fail2ban-regex / | ||
| - | |||
| - | # Проверка конкретного jail | ||
| - | sudo fail2ban-client status nginx-scan-block | ||
| - | |||
| - | # Тест с выводом совпадений | ||
| - | sudo fail2ban-regex --print-all-matched / | ||
| - | </ | ||
| - | |||
| - | ===== Мониторинг системы ===== | ||
| - | |||
| - | ==== Ежедневные проверки ==== | ||
| - | |||
| - | <code bash> | ||
| - | # Проверка статуса системы | ||
| - | sudo / | ||
| - | |||
| - | # Размер логов | ||
| - | sudo du -sh / | ||
| - | sudo du -sh / | ||
| - | |||
| - | # Количество заблокированных IP | ||
| - | sudo fail2ban-client status | grep " | ||
| - | |||
| - | # Статистика по jail' | ||
| - | sudo fail2ban-client status sshd | ||
| - | sudo fail2ban-client status nginx-404-flood | ||
| - | sudo fail2ban-client status nginx-scan-block | ||
| - | sudo fail2ban-client status nginx-dos-block | ||
| - | </ | ||
| - | |||
| - | ==== Просмотр iptables правил ==== | ||
| - | |||
| - | <code bash> | ||
| - | # Просмотр всех правил fail2ban | ||
| - | sudo iptables -L -n | grep f2b | ||
| - | |||
| - | # Просмотр правил конкретного jail | ||
| - | sudo iptables -L f2b-nginx-scan-block -n | ||
| - | |||
| - | # Подсчет заблокированных IP | ||
| - | sudo iptables -L f2b-nginx-scan-block -n | grep -c " | ||
| - | </ | ||
| - | |||
| - | ===== Особенности работы ===== | ||
| - | |||
| - | * **Полное пересоздание файла**: | ||
| - | * **Фильтрация по времени**: | ||
| - | * **Ротация логов**: | ||
| - | * **Множественные хосты**: | ||
| - | * **Регулярное обновление**: | ||
| - | * **Логирование процесса**: | ||
| - | |||
| - | ===== Устранение неполадок ===== | ||
| - | |||
| - | ==== Типичные проблемы ==== | ||
| - | |||
| - | <code bash> | ||
| - | # Проверка что директория nginxpm существует | ||
| - | sudo ls -la / | ||
| - | |||
| - | # Проверка прав доступа | ||
| - | sudo ls -la / | ||
| - | |||
| - | # Проверка cron задач | ||
| - | sudo crontab -l | ||
| - | |||
| - | # Проверка запуска Docker контейнера | ||
| - | sudo docker logs nginxpm | tail -20 | ||
| - | |||
| - | # Проверка работы fail2ban | ||
| - | sudo systemctl is-active fail2ban | ||
| - | sudo systemctl is-enabled fail2ban | ||
| - | </ | ||
| - | |||
| - | ==== Если нет блокировок ==== | ||
| - | |||
| - | 1. **Проверить наличие данных в логах**: | ||
| - | <code bash> | ||
| - | sudo cat / | ||
| - | </ | ||
| - | |||
| - | 2. **Проверить работу фильтров**: | ||
| - | <code bash> | ||
| - | sudo fail2ban-regex / | ||
| - | </ | ||
| - | |||
| - | 3. **Проверить cron задачу**: | ||
| - | <code bash> | ||
| - | sudo systemctl status cron | ||
| - | sudo tail -f / | ||
| - | </ | ||
| - | |||
| - | <note important> | ||
| - | Регулярно проверяйте работу системы командой '' | ||
| - | </ | ||
| - | |||
| - | <note tip> | ||
| - | Для тестирования можно добавить тестовую запись в лог и проверить срабатывание фильтров: | ||
| - | '' | ||
| - | </ | ||