Новый VPS начинают сканировать и подбирать к нему пароли через несколько минут после запуска — это не паранойя, а обычный фон интернета. Поэтому первая настройка VPS — это защита: вход по SSH-ключу вместо пароля, файрвол ufw и fail2ban против перебора. Всё вместе занимает пятнадцать минут. Если сервер ещё не выбран, начните со статьи как выбрать VPS и не переплатить. Команды ниже — для Ubuntu и Debian; мы выполняем их на каждом своём сервере с тех пор, как один из них заразился майнером через подобранный пароль.

Шаг 1. Как создать SSH-ключ
SSH-ключ — это пара файлов: закрытый ключ остаётся у вас на компьютере, открытый (публичный) кладётся на сервер. Подобрать ключ перебором, в отличие от пароля, невозможно.
Сгенерировать SSH-ключ можно одной командой — она одинаково работает в Linux, macOS и в Windows 10 и 11 (в PowerShell или терминале, OpenSSH там встроен):
ssh-keygen -t ed25519 -C "мой ноутбук"
Программа спросит, куда сохранить ключ — нажмите Enter, — и предложит пароль на сам ключ. Пароль лучше задать: если ноутбук украдут, ключом без пароля воспользоваться нельзя будет.
Где лежат SSH-ключи после этого:
~/.ssh/id_ed25519— закрытый ключ, никому не отдавайте и не копируйте на серверы;~/.ssh/id_ed25519.pub— публичный SSH-ключ, его и добавляют на сервер.
В Windows ~ — это папка пользователя, например C:\Users\Имя\.ssh\. Тип ed25519 короче и современнее RSA; RSA нужен только для очень старых систем.
Шаг 2. Как добавить SSH-ключ на сервер
Проще всего — выбрать ключ при создании сервера: почти все провайдеры VPS позволяют вставить публичный ключ в панели, и сервер сразу стартует с ним. Если сервер уже создан и вы входите по паролю, из Linux или macOS:
ssh-copy-id root@IP-сервера
В Windows команды ssh-copy-id нет, то же самое делает такая строка в PowerShell:
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh root@IP-сервера "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Проверьте подключение по ключу: ssh root@IP-сервера должен пустить без пароля от сервера (пароль от самого ключа может спросить — это нормально).
Шаг 3. Отключить вход по паролю SSH
Ключ сам по себе не защищает, пока вход по паролю открыт: перебор идёт именно по нему. Создайте отдельный файл с настройками:
cat > /etc/ssh/sshd_config.d/00-hardening.conf <<'EOF' PasswordAuthentication no KbdInteractiveAuthentication no PermitRootLogin prohibit-password EOF sshd -t && systemctl restart ssh
Почему файл называется с 00-: у SSH-сервера действует первое найденное значение каждого параметра, а файлы из sshd_config.d читаются по алфавиту. На многих образах VPS там уже лежит 50-cloud-init.conf с PasswordAuthentication yes — если ваш файл будет стоять после него, вход по паролю останется включённым. Проверьте, что настройка применилась:
sshd -T | grep -Ei 'passwordauth|kbdinteractive' passwordauthentication no kbdinteractiveauthentication no
Не закрывайте текущую сессию, пока в новом окне не войдёте по ключу. Если что-то пошло не так, из открытой сессии это легко исправить, а из закрытой — только через консоль в панели провайдера.
Шаг 4. Файрвол ufw
ufw — простой файрвол для Ubuntu и Debian. Правило «всё закрыто, кроме нужного» задаётся четырьмя командами. Главное — разрешить SSH до включения, иначе вы отрежете себе доступ:
apt install ufw ufw default deny incoming ufw allow OpenSSH ufw enable
Как открыть порт в ufw для сайта или другого сервиса:
ufw allow 80,443/tcp # сайт ufw allow from 203.0.113.5 to any port 5432 # база только для одного адреса ufw status numbered # правила с номерами ufw delete 3 # удалить правило №3
Ловушка с Docker. Порты, опубликованные контейнерами Docker (-p 8080:80 или ports: в docker-compose.yml), обходят правила ufw — это прямо сказано в документации Docker. ufw status покажет, что порт закрыт, а он будет открыт всему интернету. Если сервис нужен только самому серверу, публикуйте порт на локальный адрес: 127.0.0.1:8080:80.
Шаг 5. fail2ban
fail2ban следит за журналами и на время блокирует адреса, с которых подбирают пароли. После отключения входа по паролю подобрать ничего не выйдет, но fail2ban всё равно полезен: журналы станут чище, а боты уйдут быстрее.
apt install fail2ban cat > /etc/fail2ban/jail.local <<'EOF' [sshd] enabled = true backend = systemd maxretry = 5 findtime = 10m bantime = 1h EOF systemctl enable --now fail2ban fail2ban-client status sshd
Строка backend = systemd важна для Debian 12 и новых Ubuntu: там нет файла /var/log/auth.log, журнал ведёт systemd, и без этой строки fail2ban может не запуститься или ничего не видеть. Последняя команда показывает список забаненных IP и сколько попыток уже отбито.
Шаг 6. Автоматические обновления безопасности
apt update && apt upgrade -y apt install unattended-upgrades dpkg-reconfigure -plow unattended-upgrades
Так сервер будет сам ставить исправления уязвимостей. Перезагружать его после обновления ядра всё равно придётся вам.
Что ещё проверить на новом VPS
- Не заводите пользователей с паролями «на время». Именно так заразился наш сервер: временный пользователь с паролем, три недели — и майнер под руткитом. Как такое найти и вылечить, рассказано в статье вирус-майнер: как обнаружить и удалить.
- Проверьте, что слушает сервер:
ss -tlnp. Всё, что слушает на0.0.0.0и не нужно снаружи, переведите на127.0.0.1или закройте. - Добавьте swap, если памяти 1–2 ГБ: об этом — в статье слабый VPS: swap и чистка диска.
- Если на сервере будет сайт — выпустите для него бесплатный SSL-сертификат Let’s Encrypt.
Когда серверов станет несколько, пригодится мониторинг: как следить за нагрузкой, памятью и дисками всех машин на одном дашборде — в статье Prometheus и Grafana.
Документация: sshd_config, ufw в Ubuntu Server, fail2ban, Docker и файрволы. Проверено 25 сентября 2026 года.








