Руководства

Защита VPS от взлома: что закрыть и как понять, что вас взломали

Защита VPS от взлома: что закрыть и как понять, что вас взломали

Сервер с публичным IP-адресом начинают сканировать через минуты после запуска: боты перебирают пароли SSH, ищут открытые базы данных, старые версии CMS и забытые панели. Большинство взломов при этом не про хитрые атаки, а про несколько типовых дыр. Ниже — как на самом деле взламывают VPS, что закрыть поверх базовой настройки, как проверить сервер на открытые двери, по каким признакам понять, что вас уже взломали, и что делать в этом случае.

Как взламывают VPS на практике

ПутьКак выглядитЧто закрывает
Подбор пароля SSH или RDPТысячи попыток входа в сутки с разных адресовВход только по ключу, fail2ban, ограничение RDP
Устаревшая CMS или плагинИзвестная уязвимость в WordPress-плагине, загрузка веб-шеллаОбновления приложений, минимум плагинов, запрет PHP в папке загрузок
Открытый наружу сервисБаза данных, Redis, Docker API или админка без пароля на публичном портуАудит портов, привязка к 127.0.0.1
Утёкшие ключи и паролиТокен в публичном репозитории, пароль из чужой утечкиСекреты вне кода, уникальные пароли, ротация
Уязвимость в самом приложенииОшибка в вашем коде или в зависимостяхОбновления зависимостей, изоляция, наименьшие права

Цель взломщика в большинстве случаев — не ваши данные, а ваш сервер: майнинг, рассылка спама, участие в DDoS-атаках, прокси для мошенничества. Поэтому «у меня нечего красть» не защищает: ресурсы сервера и его IP ценны сами по себе.

Фундамент: базовая настройка

Без этого остальное не имеет смысла. Если сервер новый — пройдите по шагам статьи «Как настроить VPS после покупки»:

  • свой пользователь вместо root, вход по SSH-ключу, вход по паролю и под root отключён;
  • firewall ufw: открыто только то, что нужно;
  • автоматические обновления безопасности;
  • fail2ban против перебора паролей.

Для Windows-сервера аналог — ограничение доступа к RDP и сильные пароли: см. «Windows VPS». Дальше — то, что закрывает остальные пути.

Аудит: что на самом деле открыто

Firewall настроен, но это не значит, что наружу ничего лишнего не торчит. Посмотрите, какие программы слушают порты:

sudo ss -tulpn

Всё, что слушает 0.0.0.0 или [::], принимает подключения со всех адресов. Затем проверьте снаружи, с другого компьютера, что видно из интернета на самом деле:

nmap -Pn IP_СЕРВЕРА

Наружу обычно должны смотреть только SSH, 80 и 443. Если в списке есть что-то из этого — разберитесь немедленно:

ПортСервисЧем опасен
3306, 5432, 27017MySQL, PostgreSQL, MongoDBПодбор пароля, утечка базы целиком
6379RedisЧасто без пароля; через него получают доступ к серверу
2375Docker API без TLSПолный контроль над сервером без пароля
9200ElasticsearchЧтение и удаление всех данных
8080, 8443, 9000 и подобныеАдминки, панели, dev-серверыСлабые пароли, неизвестные уязвимости

Базы и внутренние сервисы должны слушать только 127.0.0.1 или внутреннюю сеть Docker. Отдельная ловушка — Docker: опубликованный в ports порт становится доступен из интернета даже при запрете в ufw, потому что Docker сам пишет правила iptables. Как этого избежать — в статье «Docker на VPS».

SSH: ещё два уровня

  • Разрешите вход только нужным пользователям. В /etc/ssh/sshd_config добавьте AllowUsers deploy — остальные учётные записи не войдут по SSH, даже если у них есть ключ. После правки проверьте конфигурацию командой sudo sshd -t и перезапустите службу, не закрывая текущую сессию.
  • Защитите ключ паролем. Если ноутбук украдут или файл ключа утечёт, без пароля к ключу им не воспользоваться. Пароль задаётся при создании ключа или позже: ssh-keygen -p -f ~/.ssh/id_ed25519.

Смена порта SSH с 22 на другой уменьшает шум в логах, но не защищает: сканеры находят SSH на любом порту. Это косметика, а не мера безопасности.

Вместо fail2ban можно использовать CrowdSec: он работает по тому же принципу, но обменивается списками атакующих адресов с другими серверами и блокирует известных ботов до того, как они начнут перебор.

Веб-приложения: главный вход для взлома

Сайт на CMS — самая частая точка входа. Что сделать:

  • Обновляйте CMS, плагины и темы. Автоматические обновления системы не обновляют WordPress и его плагины. Удалите неиспользуемые плагины и темы: отключённый плагин с уязвимостью всё равно доступен по прямому адресу.
  • Закройте админку. Ограничьте доступ к /wp-admin или панели управления своими IP-адресами в nginx и включите двухфакторную авторизацию для администраторов:
    location /wp-admin {
        allow 203.0.113.10;
        deny all;
        # дальше обычная обработка PHP
    }
  • Запретите выполнение PHP в папке загрузок. Типичный взлом — загрузить файл с кодом под видом картинки и открыть его. Правило в nginx закрывает это целиком:
    location ~* /uploads/.*\.php$ {
        deny all;
    }
  • Код сайта не должен быть доступен на запись веб-серверу. Владелец файлов — ваш пользователь, а пользователь веб-сервера может писать только в папки загрузок и кэша.
  • Ограничьте частоту запросов к странице входа и формам — защита от перебора паролей и ботов. Пример конфигурации — в статье «Защита от DDoS».

Секреты и права

  • Пароли и токены — не в коде. Храните их в файле .env вне папки сайта и добавьте его в .gitignore. Если секрет когда-то попал в репозиторий, считайте его скомпрометированным и замените: история Git хранит всё.
  • Отдельный пользователь на каждое приложение. Тогда уязвимость в одном проекте не даёт доступа к остальным. Так же работает и с ИИ-агентами — см. «OpenClaw на VPS».
  • Минимум людей с доступом. Подрядчику — отдельный пользователь и ключ, которые удаляются после работы. Ревизию доступов раз в квартал описывает статья «Обслуживание VPS».
  • Уникальные пароли для панели провайдера, почты, к которой она привязана, и доменного регистратора. Взлом почты даёт доступ ко всему остальному.

Признаки того, что сервер уже взломан

  • Процесс с незнакомым именем постоянно грузит процессор на 100% — классический майнер. Смотрите top или htop.
  • Резкий рост исходящего трафика без роста посетителей — рассылка или участие в атаках.
  • Письмо от провайдера о жалобе на спам, сканирование или атаку с вашего IP.
  • Незнакомые задания в cron: sudo crontab -l и ls /etc/cron.d/, а также crontab -l для каждого пользователя.
  • Незнакомые ключи в ~/.ssh/authorized_keys или новые пользователи в /etc/passwd.
  • Успешные входы, которых вы не делали: last, а также sudo journalctl -u ssh --since "7 days ago" | grep Accepted.
  • Изменённые файлы сайта, редиректы на чужие сайты, незнакомые PHP-файлы в папках загрузок.

Если взломали

  1. Отрежьте сервер от сети. Закройте всё, кроме своего IP, или выключите сервер в панели провайдера. Иначе он продолжит рассылать спам и атаковать, а ваш IP попадёт в чёрные списки.
  2. Сохраните следы. Скопируйте логи — /var/log, журнал systemd, логи веб-сервера, — чтобы потом найти точку входа.
  3. Не лечите, а переустанавливайте. Найти все закладки взломщика практически невозможно. Надёжный путь — чистая система на новом сервере или после переустановки.
  4. Восстановите данные из бэкапа до взлома. Именно поэтому нужны версии бэкапов, а не одна перезаписываемая копия: см. «Сервер для бэкапа».
  5. Смените все секреты. Пароли баз данных, ключи API, SSH-ключи, пароли администраторов CMS, токены ботов — всё, что хранилось на сервере.
  6. Закройте точку входа. Обновите то, через что вошли, иначе через неделю всё повторится.
  7. Уведомьте, если затронуты персональные данные. Оператор персональных данных в России обязан сообщить Роскомнадзору об утечке в течение 24 часов, а о результатах расследования — в течение 72 часов.

Чек-лист

МераКак проверить
Вход по SSH только по ключу, root закрытsudo sshd -T | grep -E "passwordauth|permitroot"
Firewall включён, открыто только нужноеsudo ufw status
Снаружи видны только SSH, 80 и 443nmap -Pn IP с другой машины
Базы и внутренние сервисы — на 127.0.0.1sudo ss -tulpn
Обновления системы ставятся автоматическиsystemctl status unattended-upgrades
CMS, плагины и образы Docker обновленыПанель CMS, docker compose pull
Защита от перебора включенаsudo fail2ban-client status
Секреты вне кода и GitПоиск паролей в репозитории
Бэкапы с версиями — в другом местеПробное восстановление
Мониторинг доступности включёнмониторинг провайдера или свой

Start в Финляндии — $10/мес   Хранилище для бэкапов от $1/мес   Мониторинг — бесплатно

Коротко

  • Чаще всего VPS взламывают через слабый пароль SSH, устаревшую CMS, открытый наружу сервис или утёкший ключ.
  • Сначала базовая настройка: ключи, firewall, обновления, fail2ban.
  • Проверьте, что реально открыто: ss -tulpn на сервере и nmap снаружи; базы — только на 127.0.0.1.
  • Сайт: обновления CMS и плагинов, админка по IP и с двухфакторной авторизацией, запрет PHP в папке загрузок.
  • Секреты вне кода, отдельный пользователь на приложение, уникальные пароли.
  • Если взломали — отрезать от сети, переустановить, восстановить из бэкапа до взлома, сменить все секреты.