Сервер с публичным 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, 27017 | MySQL, PostgreSQL, MongoDB | Подбор пароля, утечка базы целиком |
| 6379 | Redis | Часто без пароля; через него получают доступ к серверу |
| 2375 | Docker API без TLS | Полный контроль над сервером без пароля |
| 9200 | Elasticsearch | Чтение и удаление всех данных |
| 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-файлы в папках загрузок.
Если взломали
- Отрежьте сервер от сети. Закройте всё, кроме своего IP, или выключите сервер в панели провайдера. Иначе он продолжит рассылать спам и атаковать, а ваш IP попадёт в чёрные списки.
- Сохраните следы. Скопируйте логи —
/var/log, журнал systemd, логи веб-сервера, — чтобы потом найти точку входа. - Не лечите, а переустанавливайте. Найти все закладки взломщика практически невозможно. Надёжный путь — чистая система на новом сервере или после переустановки.
- Восстановите данные из бэкапа до взлома. Именно поэтому нужны версии бэкапов, а не одна перезаписываемая копия: см. «Сервер для бэкапа».
- Смените все секреты. Пароли баз данных, ключи API, SSH-ключи, пароли администраторов CMS, токены ботов — всё, что хранилось на сервере.
- Закройте точку входа. Обновите то, через что вошли, иначе через неделю всё повторится.
- Уведомьте, если затронуты персональные данные. Оператор персональных данных в России обязан сообщить Роскомнадзору об утечке в течение 24 часов, а о результатах расследования — в течение 72 часов.
Чек-лист
| Мера | Как проверить |
|---|---|
| Вход по SSH только по ключу, root закрыт | sudo sshd -T | grep -E "passwordauth|permitroot" |
| Firewall включён, открыто только нужное | sudo ufw status |
| Снаружи видны только SSH, 80 и 443 | nmap -Pn IP с другой машины |
| Базы и внутренние сервисы — на 127.0.0.1 | sudo 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 в папке загрузок.
- Секреты вне кода, отдельный пользователь на приложение, уникальные пароли.
- Если взломали — отрезать от сети, переустановить, восстановить из бэкапа до взлома, сменить все секреты.
