Настройка безопасности VPS: первые 15 минут на Ubuntu и Debian
Чтобы защитить новый VPS, обновите систему, заведите пользователя с sudo, входите по SSH-ключу, отключите вход по паролю и под root, откройте в ufw только нужные порты, а перебор паролей и патчи безопасности доверьте fail2ban и unattended-upgrades. На Ubuntu 24.04 или Debian 12 это занимает около 15 минут, и сделать это стоит до установки всего остального.
Что понадобится
- Любой тариф VPS с Ubuntu 24.04 или Debian 12. Чек-лист одинаков для Pulse (2 vCPU, 2 ГБ, $10 в месяц) и для Titan, да и для выделенного сервера тоже.
- IP-адрес и пароль root из кабинета и первый вход, как описано в статье о подключении по SSH.
Не закрывайте первую сессию под root до самого конца. Это ваш путь назад, если какой-то шаг пойдёт не так.
1. Обновите систему
apt update && apt full-upgrade -y
[ -f /var/run/reboot-required ] && reboot
Если обновилось ядро, сервер перезагрузится. Зайдите снова под root.
2. Создайте пользователя с sudo
apt install -y sudo
adduser deploy
usermod -aG sudo deploy
deploy — просто пример имени. В образах Debian sudo может не быть, поэтому первая строка.
3. Вход по ключу
На своём компьютере (не на сервере):
ssh-keygen -t ed25519
ssh-copy-id deploy@203.0.113.10
ssh deploy@203.0.113.10
sudo whoami
Последняя команда должна вывести root. Продолжайте, только когда вход по ключу и sudo работают в новом окне.
4. Отключите вход по паролю и под root
cat > /etc/ssh/sshd_config.d/00-hardening.conf <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
EOF
sshd -t && systemctl restart ssh
sshd -T | grep -Ei 'permitrootlogin|passwordauthentication'
sshd берёт первое найденное значение, а файлы в sshd_config.d/ читает по алфавиту. Префикс 00- гарантирует, что ваш файл победит остальные, например 50-cloud-init.conf, который может снова включить вход по паролю. Последняя команда должна показать no для обоих параметров.
5. Файрвол ufw
apt install -y ufw
ufw allow 22/tcp
ufw enable
ufw status verbose
По умолчанию ufw блокирует входящий трафик и разрешает исходящий. Остальные порты открывайте по мере надобности, например ufw allow 80,443/tcp для сайта. Если пользуетесь Docker, прочитайте про ловушку с ufw: опубликованные порты контейнеров обходят эти правила.
6. fail2ban против перебора
apt install -y fail2ban python3-systemd
cat > /etc/fail2ban/jail.local <<'EOF'
[sshd]
enabled = true
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
EOF
systemctl restart fail2ban
fail2ban-client status sshd
backend = systemd важен на Debian 12: там логи пишутся в журнал, а /var/log/auth.log по умолчанию нет. При входе только по ключу перебор и так не сработает, но fail2ban держит логи чистыми, а ботов — подальше.
7. Автоматические обновления безопасности
apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades
unattended-upgrade --dry-run --debug | tail -n 5
В диалоге ответьте «Yes». После этого обновления безопасности ставятся ежедневно. Сам сервер не перезагружается: чтобы разрешить это, задайте Unattended-Upgrade::Automatic-Reboot "true"; в /etc/apt/apt.conf.d/50unattended-upgrades.
8. Защитите и аккаунт
Тот, кто попал в ваш аккаунт, может оттуда переустановить сервер или сбросить пароль root. Включите для аккаунта двухфакторную аутентификацию и храните коды восстановления не на телефоне.
Частые ошибки
- Нет доступа после шага 4. Обычно ключ скопировали для root, а не для нового пользователя, или взяли не тот файл
.pub. Исправьте из сессии root, которую оставили открытой. ufw enableраньшеufw allow 22/tcp. Текущая сессия живёт, новые не подключаются. Разрешите SSH из этой сессии.- Забанили сами себя.
fail2ban-client set sshd unbanip <ваш IP>. - Войти нельзя совсем. Последний вариант — переустановка из кабинета, она стирает диск. Резервные копии — ваша задача, так что держите копии данных в другом месте.