Обсудить проект
Все статьи

Защита сайта от ботов-сканеров: что настроить на сервере в первый день

Что ищут автоматические сканеры и как закрыть основные двери в первый день: служебные файлы, ограничение попыток входа в nginx, обновления, HTTPS и HSTS, логи, мониторинг и бэкапы — с примерами конфигурации и таблицей проверки.

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

Автоматические сканеры не ищут ваш сайт специально — они перебирают известные адреса на всех сайтах подряд: файлы настроек, папки систем контроля версий, архивы бэкапов, формы входа в админку. Задача первого дня — чтобы по этим адресам нечего было найти, вход нельзя было перебирать бесконечно, а в логах было видно, кто стучится.

Статья для разработчиков и администраторов. Ниже — что ищут сканеры, шесть настроек первого дня с примерами для nginx и таблица проверки.

Что ищут сканеры

  • Файлы настроек с паролями и ключами: /.env, /config.php.bak.
  • Папку системы контроля версий: /.git/config — по ней можно восстановить исходный код.
  • Архивы и дампы: /backup.zip, /site.tar.gz, /dump.sql.
  • Формы входа: /wp-login.php, /admin, /administrator.
  • Служебные интерфейсы: /phpmyadmin/, /xmlrpc.php.
  • Файлы старых плагинов и тем, по которым можно определить версию.

Большинство таких запросов получают 404 и ни к чему не приводят. Опасен тот один адрес, который ответит 200.

Шесть слоёв защиты первого дня: закрыть служебные файлы, ограничить попытки входа, обновить и убрать лишнее, HTTPS и HSTS, логи и мониторинг, резервные копии вне сервера
Шесть настроек первого дня

1. Закрыть служебные файлы

Лучшее решение — не хранить их в публичной папке сайта: бэкапы и дампы — вне корня сайта, .env — уровнем выше. Если что-то всё же лежит в корне, закройте доступ на уровне веб-сервера:

# скрытые файлы и папки, кроме .well-known
location ~ /\.(?!well-known) {
    deny all;
}

# архивы, дампы и резервные копии
location ~* \.(sql|zip|tar|gz|bak|old|swp)$ {
    deny all;
}

Проверьте снаружи, что адреса не отдаются:

curl -s -o /dev/null -w "%{http_code}\n" https://example.com/.env
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/.git/config

Нормальный ответ — 403 или 404. Ответ 200 означает, что файл доступен любому.

2. Ограничить попытки входа

Форму входа перебирают тысячами паролей. Ограничьте частоту запросов к ней. В nginx для этого есть модуль limit_req (документация nginx):

limit_req_zone $binary_remote_addr zone=login:10m rate=10r/m;

server {
    location = /wp-login.php {
        limit_req zone=login burst=5 nodelay;
        limit_req_status 429;
        # дальше — обычная передача запроса в PHP
    }
}

Здесь один адрес может отправить в среднем десять запросов в минуту с запасом в пять. По умолчанию nginx отвечает на лишние запросы кодом 503; директива limit_req_status меняет его на 429 — «слишком много запросов».

Вместе с ограничением частоты:

  • двухфакторная защита для всех учётных записей с правами администратора;
  • уникальные логины — без общего admin;
  • если команда работает с постоянных адресов, доступ к админке только с них.

3. Обновить и убрать лишнее

  • Обновите систему управления, тему и плагины до актуальных версий.
  • Удалите неиспользуемые плагины и темы — даже отключённые, их файлы остаются на сервере.
  • Отключите интерфейсы, которыми не пользуетесь, например XML-RPC в WordPress, если он не нужен вашим интеграциям.
  • Удалите установочные скрипты, тестовые страницы и файлы вроде phpinfo.php.

4. HTTPS и заголовки

Перенаправьте все запросы с http на https и добавьте заголовок Strict-Transport-Security. Он сообщает браузеру, что сайт открывается только по HTTPS, и запрещает обходить ошибки сертификата (MDN):

add_header Strict-Transport-Security "max-age=31536000" always;

Директиву includeSubDomains добавляйте, только если все поддомены уже работают по HTTPS: иначе браузеры перестанут открывать те, что без сертификата.

5. Логи и мониторинг

  • Смотрите всплески ответов 401, 403 и 404 — так выглядит перебор.
  • Настройте автоматическую блокировку адресов, которые перебирают вход или служебные пути: для этого используют fail2ban и аналоги или правила на уровне хостинга и CDN.
  • Подключите мониторинг доступности: вы должны узнать о падении сайта раньше клиентов.
  • По возможности отслеживайте изменения файлов сайта: неожиданный новый PHP-файл в папке загрузок — повод для проверки.

6. Резервные копии вне сервера

Если что-то всё же случится, восстановление занимает часы, а не дни, только при одном условии: копия хранится вне сервера сайта и её восстановление проверено. Копия на том же сервере пропадёт вместе с сайтом.

Таблица проверки первого дня

Таблица: Что, Как проверить, Норма
ЧтоКак проверитьНорма
Служебные файлыcurl к /.env, /.git/config, архивам403 или 404
Листинг папокОткрыть папку без index-файла, например загрузкиНет списка файлов
Вход в админку20 быстрых неверных попытокОтвет 429 или блокировка
Учётные записиСписок администраторовТолько нужные люди, у всех 2FA
ОбновленияПанель системы управленияНет доступных обновлений безопасности
HTTPSОткрыть сайт по httpРедирект на https, заголовок HSTS в ответе
МониторингОстановить тестовую копию сайтаПришло уведомление
БэкапВосстановить копию на тестовом сервереСайт поднимается из копии
Таблица проверки: служебные файлы — 403 или 404; листинг папок — нет списка файлов; вход — 429 или блокировка; учётные записи — у всех 2FA; HTTPS — редирект и HSTS; бэкап — сайт поднимается из копии
Как понять, что настройки работают

В поддержку сайтов PIP после запуска входят регулярное резервное копирование, мониторинг доступности и небольшие обновления — так указано на странице цен. Хотите проверить, что можно найти на вашем сервере? Расскажите о задаче.

Короткие подсказки о сайтах и автоматизации — в Telegram-канале @pip_kz.

Ещё по этой теме

Резервные копии сайта: как настроить и проверить восстановление

Что входит в резервную копию сайта, как выбрать частоту, где хранить копии, как проверить восстановление и кто за это отвечает — с ориентирами для разных типов сайтов.

Обновления CMS и плагинов без поломок: порядок работы

Почему обновления системы управления и плагинов ломают сайт и как обновлять безопасно: резервная копия, тестовая копия, обновление по одному, проверка сценариев, план отката, список плагинов и расписание.

Хостинг для сайта: на что смотреть, кроме цены

Как выбрать хостинг: девять критериев с вопросами к провайдеру, типы хостинга, вопрос о месте хранения персональных данных в Казахстане, правило «аккаунт на компании» и порядок смены хостинга.

Обсудим вашу задачу

Разберёмся в деталях и предложим план.

Обсудить проект

Просмотр изображения