Что сделать сразу после покупки 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/Moscowhostnamectl set-hostname web-01
Шаг 2. Создайте пользователя с правами sudo
Работать под root постоянно опасно: одна ошибка в команде может сломать систему, а root — первая цель для подбора пароля. Создайте обычного пользователя и дайте ему право выполнять команды администратора через sudo:
adduser adminusermod -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 yesMaxAuthTries 3
Файл называется именно 01-...: SSH берёт первое найденное значение, а у многих хостингов в той же папке лежит 50-cloud-init.conf с PasswordAuthentication yes. Файл с меньшим номером читается раньше и побеждает.
Проверьте конфиг и перезапустите SSH:
sudo sshd -tsudo 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 ufwsudo ufw allow OpenSSH
# если сменили порт SSH: sudo ufw allow 2222/tcpsudo ufw default deny incomingsudo ufw default allow outgoingsudo 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-systemdsudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ВАШ_IP
[sshd]
enabled = truebackend = systemd
В ignoreip добавьте свой IP, если он постоянный, — чтобы случайно не заблокировать себя. Если сменили порт SSH, добавьте в блок [sshd] строку port = 2222.
sudo systemctl enable --now fail2bansudo fail2ban-client status sshd
Шаг 7. Включите автоматические обновления безопасности
Уязвимости в пакетах находят постоянно, а вручную обновлять сервер легко забыть. unattended-upgrades каждый день ставит только исправления безопасности, не трогая основные версии программ.
sudo apt install -y unattended-upgradessudo 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 /swapfilesudo chmod 600 /swapfilesudo mkswap /swapfilesudo swapon /swapfileecho '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Чтобы система использовала swap только при реальной нехватке памяти:
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swap.confsudo 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 и перезагружайте сервер, если это нужно.