Безопасность6 мин чтения

Первые 15 минут после покупки VPS: базовая защита сервера

SSH-ключи, отдельный пользователь, файрвол, автоматические обновления и fail2ban — восемь шагов для Ubuntu и Debian, которые стоит сделать до запуска проекта.

Новый сервер с публичным IP-адресом начинают сканировать боты почти сразу после запуска: они перебирают пароли к SSH и ищут открытые службы. Хорошая новость в том, что базовая защита занимает около пятнадцати минут. Ниже — порядок действий для Ubuntu 22.04/24.04 и Debian 12, который стоит выполнить до того, как ставить на сервер свой проект.

Перед началом. IP-адрес, логин и пароль root появятся в карточке сервера в личном кабинете. Там же есть консоль в браузере: если вы случайно закроете себе доступ по SSH, через неё всё можно исправить.

Шаг 1. Создайте SSH-ключ на своём компьютере

Вход по ключу надёжнее любого пароля: подобрать его перебором практически невозможно. Если ключа у вас ещё нет, создайте его на своём компьютере — в Linux, macOS или PowerShell в Windows команда одинаковая:

Терминал
ssh-keygen -t ed25519 -C "my-laptop"

Программа предложит путь к файлу (подойдёт вариант по умолчанию) и пароль для самого ключа — его стоит задать, чтобы украденный файл был бесполезен. Появятся два файла: закрытый id_ed25519, который никогда никуда не передаётся, и открытый id_ed25519.pub, который кладут на серверы.

В Verdian Cloud открытый ключ можно добавить в профиле личного кабинета и выбрать при заказе сервера или при переустановке системы — тогда он сразу окажется на сервере. Если сервер уже создан, подключитесь по паролю и действуйте по шагам ниже.

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

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

Терминал
ssh root@IP-адрес-сервера
apt update && apt full-upgrade -y

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

Шаг 3. Заведите отдельного пользователя

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

Терминал
apt install -y sudo
adduser deploy
usermod -aG sudo deploy

Имя deploy — только пример, выберите своё. Теперь добавьте этому пользователю ваш открытый ключ. Если ключ уже лежит у root (например, вы выбрали его при заказе), просто скопируйте его:

Терминал
rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy

Если ключа на сервере ещё нет, отправьте его со своего компьютера:

Терминал
ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@IP-адрес-сервера

В Windows команды ssh-copy-id нет — откройте на сервере файл /home/deploy/.ssh/authorized_keys и вставьте в него содержимое id_ed25519.pub одной строкой. У каталога .ssh должны быть права 700, у файла — 600, а владелец обоих — deploy.

Важно. Не закрывайте текущую сессию. Откройте второе окно терминала и убедитесь, что вход ssh deploy@IP-адрес-сервера работает без пароля, а sudo -v принимает пароль пользователя. Только после этого переходите к следующему шагу.

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

Ubuntu 22.04+ и Debian 12 читают дополнительные настройки SSH из каталога /etc/ssh/sshd_config.d/. Для каждого параметра действует первое найденное значение, а файлы читаются по алфавиту — поэтому назовём свой файл так, чтобы он шёл первым. Это важно: в облачных образах Ubuntu часто есть файл 50-cloud-init.conf, который включает вход по паролю.

Терминал
sudo tee /etc/ssh/sshd_config.d/00-hardening.conf > /dev/null <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
EOF

Проверьте синтаксис и посмотрите, какие значения сервер SSH применит на самом деле:

Терминал
sudo sshd -t
sudo sshd -T | grep -Ei '^(permitrootlogin|passwordauthentication|kbdinteractiveauthentication)'

Если ошибок нет и в выводе стоит no, перезапустите службу. Уже открытые сессии при этом не разорвутся:

Терминал
sudo systemctl restart ssh

Снова проверьте вход во втором окне терминала. Попытка ssh root@IP-адрес-сервера теперь должна завершаться отказом.

Смена порта SSH с 22 на другой уменьшает количество мусорных записей в журналах, но защитой не является: сканеры находят нестандартные порты за минуты. Если всё же меняете порт, сначала откройте новый порт в файрволе.

Шаг 5. Включите файрвол

Принцип простой: закрыть всё входящее и открыть только то, чем вы действительно пользуетесь. В Ubuntu для этого есть ufw, в Debian его нужно установить:

Терминал
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp

Если на сервере будет сайт, откройте HTTP и HTTPS:

Терминал
sudo ufw allow 80,443/tcp

Включите файрвол и проверьте правила:

Терминал
sudo ufw enable
sudo ufw status verbose

Одна частая ловушка: Docker публикует порты контейнеров (-p 8080:80) через собственные правила iptables, в обход ufw. Если сервис внутри контейнера не должен быть доступен из интернета, публикуйте его только на локальный адрес: -p 127.0.0.1:8080:80.

Шаг 6. Настройте автоматические обновления безопасности

Уязвимости в OpenSSH, OpenSSL и ядре находят регулярно, а заходить на сервер каждый день, чтобы поставить патчи, никто не будет. Пакет unattended-upgrades ставит обновления безопасности сам. В Ubuntu он обычно уже установлен, в Debian — добавьте:

Терминал
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

На вопрос об автоматической установке ответьте «Да». Журнал работы лежит в /var/log/unattended-upgrades/. Обновления, которым нужна перезагрузка, система сама не применит до конца — периодически проверяйте, нет ли файла /var/run/reboot-required.

Шаг 7. Поставьте fail2ban

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

Терминал
sudo apt install -y fail2ban python3-systemd

Настройки не правят в jail.conf — его перезапишет следующее обновление. Создайте свой файл jail.local:

Терминал
sudo tee /etc/fail2ban/jail.local > /dev/null <<'EOF'
[sshd]
enabled = true
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
EOF

Параметр backend = systemd заставляет fail2ban читать системный журнал напрямую. Без него в Debian 12 служба может не запуститься: там по умолчанию нет файла /var/log/auth.log. Запустите службу и проверьте, что правило для SSH работает:

Терминал
sudo systemctl enable fail2ban
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd

Если вы сами заблокировали свой адрес, снимите блокировку через консоль в кабинете: sudo fail2ban-client set sshd unbanip ВАШ-IP.

Шаг 8. Мелочи, которые потом сэкономят время

Выставьте часовой пояс, чтобы время в журналах совпадало с вашим:

Терминал
sudo timedatectl set-timezone Europe/Moscow

На небольших тарифах полезен файл подкачки — он не ускорит сервер, но спасёт от аварийного завершения процессов при кратком всплеске потребления памяти:

Терминал
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Защитите и личный кабинет

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

Когда базовая настройка закончена, самое время сделать снимок чистой системы. Если в тариф подключены снапшоты, к этому состоянию можно будет вернуться за пару минут. Чем снапшот отличается от полноценной резервной копии — в статье «Снапшоты и бэкапы».

Чек-лист

  • Система обновлена, при необходимости сервер перезагружен.
  • Есть отдельный пользователь с sudo и входом по SSH-ключу.
  • Вход под root и по паролю запрещён, проверено во втором окне терминала.
  • Файрвол включён, открыты только нужные порты.
  • Обновления безопасности ставятся автоматически.
  • fail2ban следит за SSH.
  • В личном кабинете включена двухфакторная аутентификация.

Сервер, на котором всё это работает

VPS на AMD EPYC 7713 с NVMe: SSH-ключи из профиля при заказе, консоль в браузере и снапшоты в кабинете.