Свежий VPS в интернете начинает получать brute-force SSH-попытки в первые 5 минут после регистрации IP. Через 24 часа — тысячи попыток, если стоит слабый пароль — взлом.
Ниже — минимальный чек-лист из 12 пунктов, которые нужно сделать в первые 30 минут после получения нового VPS. Без параноидальных крайностей, но с реальной защитой от 99 % автоматизированных атак.
1. Обновить систему
Первым делом — свежие security-патчи ядра, OpenSSH, glibc, TLS-стека.
sudo apt update && sudo apt upgrade -y
sudo apt autoremove -y
sudo reboot # если было обновление ядра2. Создать non-root user
Работать от root — плохая практика. Создаём отдельного user'а с sudo.
sudo adduser deploy
sudo usermod -aG sudo deploy
# проверка
sudo -u deploy sudo whoami # root — работает3. Настроить SSH-ключ
На локальной машине генерируем ключ Ed25519 (быстрее и безопаснее RSA), копируем на сервер.
# на локалке
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/vps-deploy
# копируем публичный ключ
ssh-copy-id -i ~/.ssh/vps-deploy.pub [email protected]
# проверка входа
ssh -i ~/.ssh/vps-deploy [email protected]4. Отключить SSH-пароли и root-логин
Правим /etc/ssh/sshd_config (осторожно — держите вторую SSH-сессию открытой на случай ошибки).
sudo nano /etc/ssh/sshd_config
# ключевые строки:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
X11Forwarding no
MaxAuthTries 3
LoginGraceTime 20
sudo sshd -t # синтакс-проверка
sudo systemctl reload sshdПеред reload — откройте вторую SSH-сессию и убедитесь, что вход по ключу под deploy работает. Иначе можете заблокировать себя.
5. Сменить порт SSH (опционально)
Смена порта не защищает от целевой атаки, но снижает шум от bot-сканеров на 90 %. Плюс — освобождает логи. Выбираем 22000-64000, не занятый.
# в /etc/ssh/sshd_config
Port 22042
# не забыть открыть в firewall (шаг 6)
sudo systemctl reload sshd
# теперь ssh -i ~/.ssh/vps-deploy -p 22042 [email protected]6. Настроить UFW firewall
Ubuntu Firewall — обёртка над iptables. Deny by default, разрешаем только нужное.
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22042/tcp # ваш SSH-порт
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose7. Установить fail2ban
Автобан IP после N неудачных попыток входа. Против bot-scanner'ов.
sudo apt install -y fail2ban
# /etc/fail2ban/jail.local
sudo tee /etc/fail2ban/jail.local <<'EOF'
[DEFAULT]
bantime = 24h
findtime = 10m
maxretry = 3
[sshd]
enabled = true
port = 22042
EOF
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd8. Unattended upgrades
Автоматическая установка security-патчей.
sudo apt install -y unattended-upgrades apt-listchanges
sudo dpkg-reconfigure -plow unattended-upgrades
# правим /etc/apt/apt.conf.d/50unattended-upgrades:
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";
# тест
sudo unattended-upgrades --dry-run --debug9. Отключить неиспользуемые сервисы
Меньше открытых портов — меньше поверхности атаки.
sudo ss -tulpn | grep LISTEN # что слушает
# отключить лишнее
sudo systemctl disable --now avahi-daemon
sudo systemctl disable --now cups
sudo systemctl disable --now bluetooth 2>/dev/null || true
# на облачном VPS обычно ничего лишнего нет — но проверить стоит10. Настроить логирование и мониторинг
Минимум — auditd для отслеживания важных изменений + jourrnal-центральный сбор.
sudo apt install -y auditd
sudo systemctl enable --now auditd
# наблюдение за /etc/passwd, /etc/shadow, sudo
sudo auditctl -w /etc/passwd -p wa -k passwd
sudo auditctl -w /etc/shadow -p wa -k shadow
sudo auditctl -w /etc/sudoers -p wa -k sudoers
# постоянные правила: /etc/audit/rules.d/audit.rules11. Настроить бэкапы
Взлом с шифровальщиком — реальный сценарий. Бэкап на offsite S3-хранилище (restic + B2) — единственная защита.
См. отдельный гайд по restic + S3.
12. 2FA на панель хостера
Панель хостера — точка полного контроля над VPS. Утечка пароля = потеря всего. 2FA обязательна.
У нас на elistrax — TOTP + hardware key (FIDO2/WebAuthn) поддерживаются, включаются в 30 сек в личном кабинете. Включите сразу, до того, как что-то важное окажется на VPS.
Хороший финальный тест — попробуйте войти в VPS через ssh [email protected] с паролем: должно быть отказано (PermitRootLogin=no, PasswordAuthentication=no). Если пускает — вы что-то пропустили.