MHOSTMHOST

Что сделать сразу после покупки VPS: базовая настройка и безопасность

Новый VPS начинают атаковать через несколько минут после запуска: боты постоянно сканируют интернет и подбирают пароли к SSH. Поэтому базовую защиту нужно настроить до того, как вы установите сайт, бота или VPN.

В инструкции девять шагов, на всё уходит 20–30 минут. Команды подходят для Ubuntu 22.04/24.04 и Debian 12. После настройки сервер будет закрыт от подбора паролей, будет сам ставить обновления безопасности и не упадёт из-за нехватки памяти.

Шаг 1. Обновите систему

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

ssh root@IP_СЕРВЕРА
apt update && apt upgrade -y

Если обновилось ядро, перезагрузите сервер: reboot.

Заодно задайте часовой пояс и понятное имя сервера. Правильное время нужно для логов, cron и SSL-сертификатов:

timedatectl set-timezone Europe/Moscow
hostnamectl set-hostname web-01

Шаг 2. Создайте пользователя с правами sudo

Работать под root постоянно опасно: одна ошибка в команде может сломать систему, а root — первая цель для подбора пароля. Создайте обычного пользователя и дайте ему право выполнять команды администратора через sudo:

adduser admin
usermod -aG sudo admin

Вместо admin выберите своё имя: его сложнее угадать. Задайте надёжный пароль — он понадобится для sudo.

Шаг 3. Настройте вход по SSH-ключу

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

На своём компьютере (Linux, macOS или PowerShell в Windows 10/11) создайте ключ:

ssh-keygen -t ed25519 -C "my-laptop"

Нажмите Enter, чтобы сохранить ключ в стандартное место. Задайте парольную фразу: если ноутбук украдут, ключом не смогут воспользоваться.

Скопируйте открытый ключ на сервер. В Linux и macOS:

ssh-copy-id admin@IP_СЕРВЕРА

В Windows команды ssh-copy-id нет, используйте PowerShell:

type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh admin@IP_СЕРВЕРА "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Проверьте вход в новом окне терминала: ssh admin@IP_СЕРВЕРА. Сервер должен пустить без пароля пользователя (или спросить только парольную фразу ключа).

Шаг 4. Запретите вход под root и по паролю

Когда вход по ключу работает, отключите пароли. Это полностью останавливает подбор паролей к SSH.

Не закрывайте текущую сессию, пока не проверите новые настройки в другом окне. Иначе при ошибке потеряете доступ к серверу.

Создайте файл с настройками:

sudo nano /etc/ssh/sshd_config.d/01-hardening.conf

PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes

MaxAuthTries 3

Файл называется именно 01-...: SSH берёт первое найденное значение, а у многих хостингов в той же папке лежит 50-cloud-init.conf с PasswordAuthentication yes. Файл с меньшим номером читается раньше и побеждает.

Проверьте конфиг и перезапустите SSH:

sudo sshd -t
sudo systemctl restart ssh

В новом окне проверьте, что ssh admin@IP_СЕРВЕРА работает, а ssh root@IP_СЕРВЕРА — нет.

Смена порта SSH с 22 на другой уменьшает мусор в логах, но не заменяет ключи. Если меняете, добавьте в тот же файл Port 2222, откройте порт в firewall (шаг 5) до перезапуска. В Ubuntu 24.04 после этого выполните sudo systemctl daemon-reload && sudo systemctl restart ssh.socket.

Шаг 5. Включите firewall

Firewall закрывает все порты, кроме тех, что вы открыли сами. Так случайно запущенная служба или база данных не окажется доступной из интернета.

В стандартных образах Ubuntu UFW обычно уже есть, но в минимальных образах и в Debian его нужно установить. Сначала разрешите SSH, иначе после включения потеряете доступ:

sudo apt install -y ufw

sudo ufw allow OpenSSH
# если сменили порт SSH: sudo ufw allow 2222/tcp

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw enable

Для сайта откройте веб-порты: sudo ufw allow 80,443/tcp. Проверьте правила: sudo ufw status verbose.

Если на сервере будет Docker, учтите: он публикует порты в обход UFW. Привязывайте порты контейнеров к 127.0.0.1 и открывайте наружу через Nginx.

Шаг 6. Установите fail2ban

fail2ban читает логи и блокирует IP, с которых много неудачных попыток входа. Даже при входе только по ключу он разгружает сервер от ботов и чистит логи.

sudo apt install -y fail2ban python3-systemd
sudo nano /etc/fail2ban/jail.local

[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ВАШ_IP

[sshd]
enabled = true
backend = systemd

В ignoreip добавьте свой IP, если он постоянный, — чтобы случайно не заблокировать себя. Если сменили порт SSH, добавьте в блок [sshd] строку port = 2222.

sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd

Шаг 7. Включите автоматические обновления безопасности

Уязвимости в пакетах находят постоянно, а вручную обновлять сервер легко забыть. unattended-upgrades каждый день ставит только исправления безопасности, не трогая основные версии программ.

sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

В появившемся окне выберите Yes. Проверить, что всё работает, можно пробным запуском: sudo unattended-upgrade --dry-run --debug.

Некоторые обновления, например ядра, требуют перезагрузки. Если на сервере есть файл /var/run/reboot-required, перезагрузите его в удобное время.

Шаг 8. Добавьте swap

На VPS с 1–2 ГБ RAM нехватка памяти — частая причина внезапных падений: система убивает процесс базы данных или сайта. Swap — это файл на диске, который подстрахует при пиках нагрузки.

Проверьте, есть ли swap: free -h. Если в строке Swap нули, создайте файл на 2 ГБ:

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Чтобы система использовала swap только при реальной нехватке памяти:

echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swap.conf
sudo sysctl --system

Swap медленнее оперативной памяти. Если сервер постоянно в него уходит, пора переходить на тариф с большим объёмом RAM.

Шаг 9. Настройте бэкапы и мониторинг

Бэкап — единственное, что спасает при удалённых файлах, взломе или сбое диска. Мониторинг сообщает о проблеме раньше, чем о ней напишут клиенты.

Бэкапы:

  • Храните хотя бы одну копию важных данных (базы, файлы сайта, конфиги) вне сервера: в S3-совместимом хранилище или на другом VPS. Для этого подходят restic или borg.
  • Раз в месяц проверяйте, что из бэкапа действительно можно восстановиться.

Мониторинг:

  • Подключите внешний сервис проверки доступности: он будет открывать сайт каждую минуту и пришлёт уведомление в Telegram или на почту, если тот не ответит.
  • Для быстрой проверки ресурсов на самом сервере: htop (процессор и память), df -h (место на диске), free -h (память).
  • Следите за местом на диске: когда он заполнен на 100%, падают базы данных и перестают писаться логи.

Чек-лист

Что дальше

Сервер готов к работе. Дальше всё зависит от задачи: например, запустить Telegram-бота 24/7 или защитить сайт от DDoS-атак.

Частые вопросы

Что делать, если я закрыл себе доступ по SSH? Зайдите через веб-консоль (VNC) в панели хостинга. Она работает напрямую, без SSH и firewall. Исправьте настройки и перезапустите SSH.

Нужно ли менять порт SSH? Не обязательно. Главную защиту дают ключи и запрет паролей. Смена порта лишь уменьшает количество ботов в логах.

Что если я потеряю SSH-ключ? Зайдите через веб-консоль хостинга под своим пользователем с паролем и добавьте новый открытый ключ в ~/.ssh/authorized_keys. Лучше заранее добавить ключи с двух устройств.

Нужен ли антивирус на Linux-сервере? Для обычного VPS важнее обновления, ключи, firewall и минимум открытых портов. Антивирус имеет смысл, если сервер принимает файлы от пользователей, например почта или файлообменник.

Как часто обновлять сервер вручную? Обновления безопасности ставятся сами после шага 7. Раз в месяц выполняйте sudo apt update && sudo apt upgrade и перезагружайте сервер, если это нужно.