Уже через несколько минут после запуска VPS на его SSH-порт начинают приходить попытки подключения с незнакомых адресов. Это не атака лично на вас: в интернете постоянно работают боты, которые ищут открытые серверы и перебирают простые пароли. Поэтому до установки сайта или приложения стоит выполнить несколько базовых настроек. Описанный порядок рассчитан на Ubuntu 22.04 и 24.04, в Debian всё работает почти так же.
1. Первое подключение и обновление системы
Когда сервер готов, вы получаете IP-адрес и пароль root или SSH-ключ. Подключитесь из терминала и первым делом обновите пакеты. Готовые образы могли быть собраны несколько недель или месяцев назад, и в них есть незакрытые уязвимости:
ssh root@203.0.113.10
apt update && apt upgrade -y
Если обновилось ядро, система попросит перезагрузку — об этом говорит наличие файла /var/run/reboot-required. Удобнее не перезагружаться сразу, а закончить остальные настройки и выполнить reboot один раз в конце.
2. Отдельный пользователь вместо root
Постоянно работать под root опасно: одна ошибочная команда может сломать систему, а учётную запись root боты перебирают чаще всего. Создайте себе обычного пользователя и дайте ему права sudo. В примере имя пользователя deploy, замените его на своё:
adduser deploy
usermod -aG sudo deploy
adduser попросит пароль. Он нужен не для входа по SSH, а для подтверждения команд sudo, поэтому сделайте его длинным и сложным.
3. Вход по SSH-ключу
Переход с пароля на пару ключей — один из важнейших шагов. Ключ создаётся на вашем компьютере: закрытая часть остаётся у вас, открытая копируется на сервер. Если ключа ещё нет, создайте его и отправьте на сервер. В Windows 10 и 11 эти команды тоже работают в PowerShell, но если ssh-copy-id отсутствует, открытый ключ придётся скопировать вручную:
ssh-keygen -t ed25519 -C "laptop-ofis"
ssh-copy-id deploy@203.0.113.10
Теперь в новом окне терминала выполните ssh deploy@203.0.113.10. Если пароль не спрашивается или спрашивается только пароль ключа, всё настроено верно. Командой sudo -v проверьте и наличие прав sudo.
4. Запрет входа под root и по паролю
Убедившись, что ключ работает, можно отключить вход под root и аутентификацию по паролю. В новых версиях Ubuntu помимо основного файла читаются и файлы из каталога /etc/ssh/sshd_config.d/, и один из них, например 50-cloud-init.conf в облачных образах, может снова включать вход по паролю. Поэтому надёжнее записать свои настройки в отдельный файл и проверить остальные:
sudo nano /etc/ssh/sshd_config.d/00-hardening.conf
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
Имя файла начинается с 00, потому что SSH берёт первое встретившееся значение параметра, а файлы читаются в алфавитном порядке. Проверьте конфигурацию и перезапустите службу:
sudo sshd -t
sudo grep -ri passwordauthentication /etc/ssh/sshd_config /etc/ssh/sshd_config.d/
sudo systemctl restart ssh
Главное правило: не закрывайте текущую SSH-сессию. Подключитесь заново в новом окне и закрывайте старое только после того, как убедитесь, что всё работает. Иначе из-за одной ошибки можно полностью потерять доступ к серверу.
5. Файрвол: открываем только нужное
В Ubuntu удобно использовать UFW. Сначала разрешите SSH и только потом включайте файрвол, иначе соединение оборвётся. Если планируете размещать сайт, откройте также порты 80 и 443:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
Не открывайте наружу порты MySQL, Redis или приложений: им достаточно работать внутри сервера через 127.0.0.1. Какие службы слушают какие порты, покажет sudo ss -tulpn.
6. Часовой пояс и имя сервера
Чтобы время в логах, задачах cron и резервных копиях было правильным, настройте часовой пояс. Для проекта в Узбекистане это Asia/Tashkent. Имя сервера помогает не перепутать терминалы, когда серверов несколько:
sudo timedatectl set-timezone Asia/Tashkent
sudo hostnamectl set-hostname web1.example.uz
timedatectl
7. Автоматические обновления безопасности
Обновлять сервер вручную каждый день непросто. В Ubuntu есть пакет, который сам устанавливает обновления безопасности, и во многих образах он уже стоит. Проверьте, что он включён:
sudo apt install unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
Это касается только системных пакетов. Обновлять движок сайта, плагины и библиотеки приложения по-прежнему придётся вам.
8. fail2ban против подбора паролей
Даже при отключённом входе по паролю боты продолжают попытки и засоряют логи. fail2ban временно блокирует адреса после серии неудачных попыток. В Ubuntu защита SSH включена в нём по умолчанию сразу после установки:
sudo apt install fail2ban
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
Пример: подготовка сервера для небольшого магазина
Допустим, ташкентский магазин одежды переносит сайт с виртуального хостинга на VPS. В день получения сервера разработчик сначала выполняет эти восемь шагов, перезагружается и только потом переходит к установке Nginx, PHP и MySQL. Такой порядок упрощает и дальнейшую работу: всё ставится под отдельным пользователем, а наружу открыты только нужные порты. DNS-запись домена переключается на новый сервер в самом конце, после полной проверки сайта. В sayt.uz записи домена меняются в разделе DNS личного кабинета.
После всех шагов перезагрузите сервер командой sudo reboot и ещё раз проверьте, что можете войти новым пользователем по ключу. Эти полчаса работы избавят от множества проблем в будущем.