Представьте ситуацию: ваш сайт подвергся атаке. В корне и других папках появились подозрительные 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#!/bin/bash # Пути к лог-файлам Nginx (обрабатываем текущий и предыдущий) LOG_FILE="/var/log/nginx/access.log" LOG_FILE_2="/var/log/nginx/access.log.1" # Итоговый файл черного списка для Nginx DENY_FILE="/etc/nginx/conf.d/blacklist.conf" # Основная команда обработки логов echo "Начинаю анализ логов на предмет подозрительных обращений к assets/*.php ..." grep "assets.*\.php" "$LOG_FILE" "$LOG_FILE_2" | \ # Ищем строки с нужным паттерном grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | \ # Извлекаем только IP sort | uniq | \ # Сортируем и удаляем дубликаты awk '{print "deny "$1";"}' > "$DENY_FILE" # Формируем директивы deny # Добавляем разрешающее правило в конец (порядок важен для Nginx!) echo "allow all;" >> "$DENY_FILE" # Проверяем результат BLOCKED_COUNT=$(wc -l < "$DENY_FILE") echo "Готово! В черный список добавлено адресов: $((BLOCKED_COUNT - 1))" # Вычитаем строку "allow all" echo "Файл создан: $DENY_FILE" |
Как это работает, строка за строкой:
grep "assets.*\.php"— находит все строки в логах, где путь содержитassetsи заканчивается на.php.grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'— с помощью регулярного выражения извлекает из оставшихся строк только IP-адреса.sort | uniq— сортирует адреса и оставляет только уникальные значения.awk '{print "deny "$1";"}'— для каждого IP-адреса формирует строку форматаdeny 192.168.1.1;, понятную Nginx.echo "allow all;" >> "$DENY_FILE"— критически важный шаг. Эта директива разрешает доступ всем остальным IP. Она должна идти после всех правилdeny, так как Nginx обрабатывает их последовательно.
Интеграция с Nginx
Создайте и запустите скрипт. Убедитесь, что пути к логам и файлу blacklist.conf верны для вашей системы.
Включите черный список в конфигурацию Nginx. В основном файле конфигурации (обычно /etc/nginx/nginx.conf) внутри секции http добавьте:
|
1 2 3 4 5 |
http { # ... другие директивы ... include /etc/nginx/conf.d/blacklist.conf; # Подключение черного списка } |
Проверьте и примените конфигурацию:
|
1 2 |
nginx -t # Проверка синтаксиса systemctl reload nginx # или nginx -s reload |
Что еще можно сделать (идеи)
Планирование. Добавьте скрипт в cron для ежедневного автоматического обновления списка:
|
1 |
0 2 * * * /usr/local/bin/generate_blacklist.sh && systemctl reload nginx |
Каждый день будет составляться новый список. Вообще лучше бы он дополнялся, для этого нужно будет переписать наш скрипт.
Расширенный анализ. Для более точного обнаружения можно усложнить фильтр, например, искать конкретные имена файлов (shell.php, wp-update.php) или определенные параметры в запросах (?cmd=).
Уведомления. Добавьте в скрипт отправку email или сообщения в Telegram, если найдено новое подозрительное обращение.
Белый список. Если есть легитимные обращения к скриптам в assets, добавьте их IP в отдельный файл whitelist и подключайте его перед blacklist.conf с директивами allow.
Файрвол уровня ОС. Для большей эффективности заблокированные IP можно добавлять и в iptables/nftables или firewalld.
Важно!
Этот метод — эффективная паллиативная мера для срочного сдерживания атаки. Он не устраняет первопричину! Параллельно с блокировками необходимо:
- Провести полный аудит сайта.
- Обновить CMS, плагины, ядро.
- Проверить права на файлы и папки.
- Установить мониторинг целостности файлов.
- Проанализировать логи на предмет первоначального вектора атаки.


