Свежий сервер с белым IP начинают перебирать по паролю примерно через пятнадцать минут после включения. Это не «взлом лично вас» — это боты, которые круглосуточно сканируют весь интернет и пробуют пары root / 123456.
Проверить самому можно одной командой на новом сервере, который проработал хотя бы сутки:
grep "Failed password" /var/log/auth.log | wc -l
Несколько сотен попыток за день — обычная картина.
Защита от этого занимает минут двадцать и делается один раз. Ниже — семь шагов, которые стоит пройти сразу после заказа, до того как вы начнёте что-то разворачивать на сервере.
Если вы ещё не подключались к серверу — начните отсюда: Как подключиться к VPS по SSH.
Шаг 1. Обновить систему
Образ операционной системы собран какое-то время назад, и часть пакетов в нём уже устарела — в том числе те, где закрыли уязвимости.
apt update && apt upgrade -y
Если после обновления система попросит перезагрузку:
reboot
Через полминуты подключайтесь снова.
Шаг 2. Создать отдельного пользователя
Работать под root постоянно — плохая привычка: любая ошибка в команде выполняется с максимальными правами, а скрипт, скачанный из интернета, получает полный доступ к системе.
Заведите обычного пользователя:
adduser deploy
Система попросит пароль — задайте сложный. Остальные поля (имя, телефон) можно пропустить, нажимая Enter.
Дайте ему право повышать привилегии через sudo:
usermod -aG sudo deploy
Теперь любая административная команда выполняется с приставкой sudo, и система лишний раз переспросит пароль — это тот самый барьер, который не даёт снести систему одной опечаткой.
Шаг 3. Настроить вход по SSH-ключу
Ключ — это пара файлов: приватный остаётся у вас на компьютере, публичный кладётся на сервер. Подобрать ключ перебором невозможно, в отличие от пароля.
На своём компьютере (не на сервере) выполните:
ssh-keygen -t ed25519 -C "my-laptop"
Путь оставьте по умолчанию, нажав Enter. Парольную фразу задавать необязательно, но с ней ключ защищён даже при краже ноутбука.
Скопируйте публичный ключ на сервер. macOS и Linux:
ssh-copy-id deploy@ВАШ_IP
Windows (PowerShell):
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh deploy@ВАШ_IP "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Теперь откройте второе окно терминала и проверьте вход:
ssh deploy@ВАШ_IP
Если пароль не спросили — ключ работает.
Не закрывайте первое окно. Пока в нём открыта рабочая сессия, вы не рискуете остаться снаружи при ошибке в следующем шаге. Это главное правило при настройке SSH: всегда держите одну живую сессию про запас.
Шаг 4. Запретить вход по паролю и под root
Пока вход по паролю разрешён, боты будут его перебирать — сколько бы ключей вы ни настроили. Отключаем.
sudo nano /etc/ssh/sshd_config
Найдите и приведите строки к такому виду (уберите # в начале, если он есть):
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
Сохраните: Ctrl + O, Enter, Ctrl + X.
Проверьте конфигурацию на ошибки до перезапуска:
sudo sshd -t
Пустой вывод означает, что синтаксис в порядке. Применяем:
sudo systemctl restart ssh
Теперь из нового окна проверьте, что вход работает. Если что-то пошло не так — у вас осталась открытая сессия из шага 3, через неё можно всё откатить.
Смена порта на Ubuntu 24.04
Перенос SSH с порта 22 на нестандартный убирает почти весь автоматический перебор из логов. Это не защита сама по себе, но заметно снижает шум.
На Ubuntu 24.04 одной строки Port в sshd_config недостаточно — там служба запускается через сокет, и порт задаётся отдельно:
sudo systemctl edit ssh.socket
В открывшемся файле впишите между комментариями:
[Socket]
ListenStream=
ListenStream=2222
Пустая первая строка сбрасывает порт 22, вторая задаёт новый. Применяем:
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
Сразу откройте новый порт в firewall (шаг 5), иначе следующее подключение не пройдёт. Дальше подключаться нужно так:
ssh -p 2222 deploy@ВАШ_IP
Шаг 5. Включить firewall
По умолчанию сервер отвечает на любом порту, где что-то слушает. Firewall оставляет открытым только то, что действительно нужно.
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
Если меняли порт SSH — вместо 22 указывайте свой, например 2222.
Правило для SSH добавляется первым, до
ufw enable. Иначе firewall включится и разорвёт вашу же сессию.
Посмотреть список правил:
sudo ufw status numbered
Удалить лишнее правило по номеру:
sudo ufw delete 3
Базы данных наружу открывать не нужно. MySQL, PostgreSQL, Redis должны слушать только 127.0.0.1 — приложение на том же сервере к ним достучится, а весь остальной интернет нет. Проверить, что где слушает:
sudo ss -tulpn
Строки с 0.0.0.0:3306 или *:6379 — повод разобраться.
Шаг 6. Поставить fail2ban
Fail2ban читает логи и блокирует IP, с которых идёт перебор. Работает сразу после установки, настройка нужна минимальная.
sudo apt install fail2ban -y
Создайте свой файл настроек, чтобы обновления пакета его не затирали:
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
Пять неудачных попыток за десять минут — час бана. Запускаем:
sudo systemctl enable --now fail2ban
Через сутки посмотрите статистику:
sudo fail2ban-client status sshd
В строке Total banned будет видно, сколько адресов уже отсеяно.
Шаг 7. Включить автоматические обновления безопасности
Большинство взломов происходит не через хитрые атаки, а через давно известные дыры в софте, который никто не обновлял. Автообновления закрывают этот класс проблем без вашего участия.
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades
На вопрос ответьте «Yes». Система будет сама ставить обновления безопасности.
Чтобы сервер ещё и перезагружался, когда обновление этого требует:
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";
Перезагрузка будет в четыре утра и только когда действительно нужна. Если на сервере крутится что-то, чего нельзя перезапускать без присмотра, эту опцию лучше не включать.
Чек-лист
| Шаг | Команда для проверки | Что должно быть |
|---|---|---|
| Система обновлена | apt list --upgradable |
пусто |
| Есть отдельный пользователь | id deploy |
группа sudo в списке |
| Вход по ключу работает | ssh deploy@IP |
пароль не спрашивают |
| Пароль и root отключены | sudo sshd -T \| grep -E "permitrootlogin\|passwordauth" |
оба no |
| Firewall включён | sudo ufw status |
Status: active |
| Fail2ban работает | sudo fail2ban-client status |
список jail'ов |
| Автообновления включены | systemctl status unattended-upgrades |
active |
Что ещё стоит сделать
Настроить бэкапы. Безопасность — это не только «не пустить чужого», но и «восстановиться, если что-то случилось». Копии делаются за десять минут: Бэкапы VPS: автоматические копии.
Не хранить пароли в коде. Секреты держите в файле .env с правами 600, а не в репозитории.
Отключить лишние службы. Посмотрите, что запущено, и уберите ненужное:
systemctl list-units --type=service --state=running
Изолировать проекты. Если на сервере несколько приложений, удобнее разнести их по контейнерам — тогда проблема в одном не заденет остальные: Docker на VPS.
Частые вопросы
Что делать, если я потерял SSH-ключ и не могу зайти? Подключитесь через VNC-консоль в панели управления — она работает независимо от SSH. Оттуда можно зайти под root и добавить новый ключ.
Нужно ли менять порт SSH?
Не обязательно. Ключи и fail2ban закрывают вопрос безопасности, смена порта лишь убирает шум в логах. Но многим спокойнее, когда в auth.log не тысячи строк перебора.
Fail2ban заблокировал мой IP, что делать? Зайдите через VNC-консоль и разбаньте:
sudo fail2ban-client set sshd unbanip ВАШ_IP
Чтобы этого не повторялось, добавьте свой адрес в jail.local: ignoreip = 127.0.0.1/8 ВАШ_IP.
Достаточно ли этих семи шагов? Для типового сервера с сайтом или ботом — да, они закрывают основные сценарии: перебор пароля, доступ к внутренним службам снаружи и эксплуатацию старых уязвимостей. Дальше безопасность зависит уже от самого приложения.
Нужен ли антивирус на Linux-сервере? Нет. Гораздо важнее закрытые порты, обновления и вход по ключу.
Сколько ресурсов съедают fail2ban и автообновления? Считанные мегабайты памяти. Всё описанное спокойно работает даже на тарифе «Старт» с 2 ГБ.
Итог
Двадцать минут в начале избавляют от куда более долгих разборов потом. Ключевое здесь — три вещи: вход только по ключу, закрытый firewall и включённые автообновления. Остальное — полезные дополнения.
И помните главное правило при любой настройке SSH: пока не проверили новое подключение из отдельного окна, старую сессию не закрывайте.

