Защита зараженного сайта: автоматическая сборка черного списка IP-адресов из логов Nginx

Представьте ситуацию: ваш сайт подвергся атаке. В корне и других папках появились подозрительные PHP-файлы, которых там быть не должно. Вы их удаляете, но через некоторое время они возникают снова. Очевидно, злоумышленники нашли и используют неизвестную вам уязвимость (дыру) — возможно, в одном из плагинов CMS или стороннем компоненте.

Атакующие, эксплуатируя уязвимость, загружают на сервер «шелл» (например, shell.php или image.jpg.php) в публичные директории, часто внутри /assets/ (будем рассматривать эту папку как прмер. Затем они обращаются к этому файлу для выполнения произвольных команд на сервере.

Так ваш сайт становится частью бот-сети под управлением хакеров.

Наша стратегия

Пока вы ищете коренную причину, нужно срочно ограничить ущерб и заблокировать доступ для атакующих. Самый эффективный способ — вычислить их IP-адреса по следам в лог-файлах и добавить их в черный список на веб-сервере.

Фильтр по пути: Ищем в логах все обращения к файлам с расширением .php внутри пути, содержащего assets. Это основной индикатор компрометации, так как в этой папке обычно лежат статические ресурсы (стили, скрипты, изображения), а не исполняемые PHP-файлы.

Извлечение и блокировка IP: Из отфильтрованных строк извлекаем IP-адреса, удаляем дубликаты и формируем конфигурационный файл для Nginx с директивами deny.

Практическая реализация: Bash-скрипт для автоматизации

Вот готовый скрипт, который реализует описанную логику. Разместите его, например, в /usr/local/bin/generate_blacklist.sh и сделайте исполняемым (chmod +x).

Как это работает, строка за строкой:

  1. grep "assets.*\.php" — находит все строки в логах, где путь содержит assets и заканчивается на .php.
  2. grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' — с помощью регулярного выражения извлекает из оставшихся строк только IP-адреса.
  3. sort | uniq — сортирует адреса и оставляет только уникальные значения.
  4. awk '{print "deny "$1";"}' — для каждого IP-адреса формирует строку формата deny 192.168.1.1;, понятную Nginx.
  5. echo "allow all;" >> "$DENY_FILE" — критически важный шаг. Эта директива разрешает доступ всем остальным IP. Она должна идти после всех правил deny, так как Nginx обрабатывает их последовательно.

Интеграция с Nginx

Создайте и запустите скрипт. Убедитесь, что пути к логам и файлу blacklist.conf верны для вашей системы.

Включите черный список в конфигурацию Nginx. В основном файле конфигурации (обычно /etc/nginx/nginx.conf) внутри секции http добавьте:

Проверьте и примените конфигурацию:

Что еще можно сделать (идеи)

Планирование. Добавьте скрипт в cron для ежедневного автоматического обновления списка:

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

Расширенный анализ. Для более точного обнаружения можно усложнить фильтр, например, искать конкретные имена файлов (shell.phpwp-update.php) или определенные параметры в запросах (?cmd=).

Уведомления. Добавьте в скрипт отправку email или сообщения в Telegram, если найдено новое подозрительное обращение.

Белый список. Если есть легитимные обращения к скриптам в assets, добавьте их IP в отдельный файл whitelist и подключайте его перед blacklist.conf с директивами allow.

Файрвол уровня ОС. Для большей эффективности заблокированные IP можно добавлять и в iptables/nftables или firewalld.

Важно!

Этот метод — эффективная паллиативная мера для срочного сдерживания атаки. Он не устраняет первопричину! Параллельно с блокировками необходимо:

  • Провести полный аудит сайта.
  • Обновить CMS, плагины, ядро.
  • Проверить права на файлы и папки.
  • Установить мониторинг целостности файлов.
  • Проанализировать логи на предмет первоначального вектора атаки.

Мало букафф? Читайте есчо !

HTTP авторизация для nginx

Декабрь 3, 2019 г.

Задача возникла в контексте SEO, требовалось предотвратить индексацию тестовых сайтов поисковыми системами. На практике видно, что инструкции файла robots.txt ...

Читать

Проверка конфигурации nginx

Апрель 16, 2018 г.

Nginx не читает конфиги на лету, и их можно спокойно править на действующем сервере. Когда правки закончены, хотелось бы убедиться, что по крайней мере синтаксис команд верен и сервер запустится с новыми настройками. Для этого в nginx встроен валидатор ...

Читать

Переходим с http на https - план действий

Июль 24, 2017 г.

Прежде чем переводить сайт на https протокол, нужно иметь четкий план того, что делать и в какой последовательности. Такая тактика хорошо работает и в ...

Читать

Переадресация сайта с www и без www

Январь 26, 2017 г.

Издревле ломают голову сеошники над вопросом. Вопрос ставиться по-гамлетовски : с www или без www? "Быть или не быть, вот в чем вопрос". Быть или ...

Читать
 

Комментарии к «Защита зараженного сайта: автоматическая сборка черного списка IP-адресов из логов Nginx»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: