Как защитить новый Linux VPS за 10 минут: SSH-ключи, файрвол, Fail2ban, автообновления
Новый VPS с публичным IP начинает получать автоматические попытки входа уже через несколько минут после запуска. Этот чек-лист показывает, как защитить новый Linux VPS примерно за 10 минут: обновить пакеты, создать пользователя с sudo, перейти на вход по SSH-ключу, запретить вход root по паролю, оставить в файрволе только нужные порты, блокировать перебор паролей с помощью fail2ban и включить автоматические обновления безопасности. Команды приведены для Debian/Ubuntu и CentOS/Rocky Linux/AlmaLinux и подходят для любого облачного сервера JUSTG в Йоханнесбурге, Москве, Токио или Сеуле.
Шаг 1: Обновите все пакеты
Войдите как root (см. нашу инструкцию по подключению по SSH) и первым делом установите свежие исправления безопасности:
# Debian / Ubuntu
apt update && apt upgrade -y
# CentOS / Rocky / AlmaLinux
dnf upgrade -y
# reboot if a new kernel was installed
reboot
Шаг 2: Создайте нового пользователя с sudo
Постоянная работа под root делает опасной любую опечатку, а root - первое имя, которое пробуют злоумышленники. Создайте обычного пользователя (здесь deploy) с правами sudo. В Debian/Ubuntu группа администраторов называется sudo, в системах на базе RHEL - wheel.
# Debian / Ubuntu
adduser deploy
usermod -aG sudo deploy
# CentOS / Rocky / AlmaLinux
useradd -m deploy
passwd deploy
usermod -aG wheel deploy
Шаг 3: Настройте аутентификацию по SSH-ключу
SSH-ключи намного надёжнее паролей, их невозможно подобрать. Создайте пару ключей на своём компьютере, а не на сервере, и скопируйте открытый ключ новому пользователю. Защитите закрытый ключ парольной фразой.
# on your own computer (Windows PowerShell, macOS, Linux)
ssh-keygen -t ed25519 -C "my-laptop"
# macOS / Linux: copy the public key to the server
ssh-copy-id [email protected]
# Windows PowerShell (no ssh-copy-id)
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh [email protected] "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Откройте новый терминал и убедитесь, что вход по ключу и sudo работают:
ssh [email protected]
sudo whoami
Шаг 4: Запретите вход root и аутентификацию SSH по паролю
Современные выпуски (Debian 12, Ubuntu 22.04+, Rocky/AlmaLinux 9) читают файлы из /etc/ssh/sshd_config.d/, и действует первое найденное значение. Поэтому назовите файл так, чтобы он шёл первым, например 01-hardening.conf, - это перекроет облачные образы, включающие пароли в 50-cloud-init.conf. В старых системах измените те же строки прямо в /etc/ssh/sshd_config.
sudo nano /etc/ssh/sshd_config.d/01-hardening.conf
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
Проверьте синтаксис и перезапустите SSH:
sudo sshd -t
# Debian / Ubuntu
sudo systemctl restart ssh
# CentOS / Rocky / AlmaLinux
sudo systemctl restart sshd
Снова проверьте из нового терминала: ssh [email protected] должен получать отказ, а ssh [email protected] - работать.
Шаг 5: Файрвол - разрешите только нужные порты
По умолчанию запретите все входящие подключения и откройте только SSH и реально используемые службы (80 и 443 для сайта). Обязательно разрешите SSH до включения файрвола. Если вы меняли порт SSH, разрешите именно его.
# Debian / Ubuntu (ufw)
sudo apt install ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enable
# CentOS / Rocky / AlmaLinux (firewalld)
sudo dnf install firewalld
sudo systemctl enable --now firewalld
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http --add-service=https
sudo firewall-cmd --permanent --remove-service=cockpit
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
И ufw, и firewalld применяют эти правила как к IPv4, так и к бесплатному IPv6-адресу вашего VPS JUSTG.
Шаг 6: Установите fail2ban для защиты от перебора
Даже при отключённых паролях fail2ban избавляет логи от мусора и блокирует сканеры. Он отслеживает неудачные попытки входа и временно банит IP-адрес источника. Бэкенд systemd читает журнал и работает в обоих семействах дистрибутивов.
# Debian / Ubuntu
sudo apt install fail2ban python3-systemd
# CentOS / Rocky / AlmaLinux
sudo dnf install epel-release
sudo dnf install fail2ban python3-systemd
sudo nano /etc/fail2ban/jail.local
[sshd]
enabled = true
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
sudo systemctl enable --now fail2ban
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
Шаг 7: Включите автоматические обновления безопасности
Большинство взломов используют уязвимости, для которых уже есть исправление. Пусть сервер сам ставит обновления безопасности: unattended-upgrades в Debian/Ubuntu и dnf-automatic в CentOS/Rocky/AlmaLinux.
# Debian / Ubuntu
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
sudo unattended-upgrade --dry-run --debug
# CentOS / Rocky / AlmaLinux
sudo dnf install dnf-automatic
sudo nano /etc/dnf/automatic.conf
# upgrade_type = security
# apply_updates = yes
sudo systemctl enable --now dnf-automatic.timer
systemctl list-timers dnf-automatic.timer
Обновления ядра всё равно требуют перезагрузки. Планируйте короткие перезагрузки для обслуживания или проверяйте наличие /var/run/reboot-required в Debian/Ubuntu.
Частые вопросы
После отключения паролей я не могу войти. Как вернуть доступ?
Откройте VNC-консоль в личном кабинете JUSTG, войдите через неё и исправьте файл в /etc/ssh/sshd_config.d/ или правила файрвола. Консоль не зависит от SSH и файрвола.
Нужно ли менять порт SSH?
Перенос SSH с порта 22 уменьшает шум в логах, но сам по себе защитой не является. Если меняете порт, сначала обновите файрвол, а на Rocky/AlmaLinux с SELinux выполните semanage port -a -t ssh_port_t -p tcp 2222.
Подходит ли это для Windows VPS?
Принципы те же: держите Windows Update включённым, используйте надёжный пароль Administrator и ограничьте RDP в брандмауэре Защитника Windows только своими IP-адресами.
Если нужна помощь с защитой сервера, создайте тикет в технической поддержке JUSTG.