Настройка VPS: SSH-ключ, ufw и fail2ban за 15 минут

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

Первая настройка VPS: SSH-ключ, отключение входа по паролю, ufw и fail2ban
Итог пятнадцати минут: вход только по ключу, файрвол включён, fail2ban следит за SSH

Шаг 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 года.

3 / 1
Оцените статью
Да будет Интернет!