Шаг 2 · Для начинающих · 30 минут

Закрываем двери: SSH‑ключи, firewall и Fail2ban

Новый VPS начинают сканировать автоматические боты почти сразу. Паниковать не нужно: уберём вход по паролю, закроем ненужные порты и включим блокировку перебора.

Главное правило статьи: не закрывайте рабочую SSH‑сессию до финальной проверки во втором окне. Так вы сможете отменить ошибочную настройку.

Что именно мы защищаем

У сервера есть сетевые порты — условные двери для разных служб. SSH обычно использует порт 22, сайты — 80 и 443. Firewall решает, какие двери открыты. SSH‑ключ заменяет пароль длинной криптографической парой: приватная часть остаётся у вас, публичная хранится на сервере.

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

Выполняйте этот блок не на VPS, а в терминале своего компьютера:

ssh-keygen -t ed25519 -C "ratehost-vps"

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

2. Копируем публичную часть

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

На Windows без ssh-copy-id выведите ключ командой type $env:USERPROFILE\.ssh\id_ed25519.pub, скопируйте строку и добавьте её на сервере в ~/.ssh/authorized_keys.

Новое подключение должно пройти по ключу. Если ключ защищён парольной фразой, терминал запросит именно её.

3. Запрещаем опасные способы входа

На сервере создайте отдельный файл настроек:

sudo nano /etc/ssh/sshd_config.d/99-ratehost-security.conf

Вставьте:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
AllowUsers deploy

PermitRootLogin no запрещает прямой вход root, а PasswordAuthentication no оставляет только ключи. Сначала проверим синтаксис:

sudo sshd -t

Пустой вывод означает, что ошибок нет. Только после этого применяйте настройки:

sudo systemctl restart ssh

Откройте третье окно и снова выполните ssh deploy@IP_СЕРВЕРА. Не продолжайте, пока вход не работает.

4. Включаем UFW

UFW — простой интерфейс к системному firewall. Сначала разрешаем SSH, потом включаем блокировку всего остального:

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status verbose

В таблице должно быть правило 22/tcp ALLOW. Когда появится сайт, мы отдельно откроем 80 и 443. Порт приложения 8000 наружу открывать не нужно.

5. Блокируем перебор

sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd

Fail2ban читает журнал SSH и временно блокирует адреса с множеством неудачных попыток. Если jail sshd ещё не отображается, подождите несколько секунд и повторите проверку.

6. Автоматические исправления безопасности

sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades

В открывшемся окне выберите Yes. Крупные обновления приложения всё равно устанавливайте осознанно после бэкапа.

7. Смотрим, что доступно

sudo ss -tulpn
sudo ufw status numbered
sudo systemctl --failed
last -a | head

ss показывает слушающие порты. Адрес 127.0.0.1 доступен только внутри сервера, 0.0.0.0 — на всех интерфейсах. Последняя команда показывает недавние входы.

Как не запереть себя снаружи

  • Сначала проверяем ключ, потом запрещаем пароль.
  • Сначала разрешаем OpenSSH, потом включаем UFW.
  • Всегда держим запасную сессию открытой.
  • Знаем, где в панели хостинга находится веб‑консоль.

Что дальше

Безопасный фундамент готов. Теперь установим Docker и разберёмся, зачем он нужен →