Ошибки безопасности VPS и как их исправить
root, настроить SSH-ключи, включить фаервол UFW, защититься от брутфорса через Fail2ban и настроить автономные бэкапы. Начните с чек-листа на 10 минут, затем перейдите к детальной настройке для долговременной защиты.Ваш сервер — не крепость, а стандартная дверь с заводским замком. Пока вы читаете этот абзац, автоматические сканеры уже проверяют его порты на наличие известных уязвимостей. Недавний эксперимент с чистым Ubuntu-сервером показал: первый запрос на незащищённый SSH пришёл менее чем через минуту после запуска, а за час набралось свыше двухсот попыток входа.
Jan 21 10:15:23 vps-ubuntu sshd[12345]: Invalid user admin from 103.207.38.123 port 54321
Jan 21 10:15:25 vps-ubuntu sshd[12346]: Invalid user administrator from 103.207.38.123 port 54322
Jan 21 10:15:27 vps-ubuntu sshd[12347]: Invalid user root from 103.207.38.123 port 54323
Jan 21 10:15:29 vps-ubuntu sshd[12348]: Failed password for invalid user test from 103.207.38.123 port 54324
Jan 21 10:15:31 vps-ubuntu sshd[12349]: Failed password for invalid user guest from 103.207.38.123 port 54325
Jan 21 10:15:34 vps-ubuntu sshd[12350]: Invalid user user from 103.207.38.123 port 54326
Jan 21 10:15:37 vps-ubuntu sshd[12351]: Failed password for invalid user admin from 45.142.120.200 port 47891
Jan 21 10:15:39 vps-ubuntu sshd[12352]: Invalid user ubuntu from 45.142.120.200 port 47892
Jan 21 10:15:42 vps-ubuntu sshd[12353]: Failed password for invalid user deploy from 45.142.120.200 port 47893
Jan 21 10:15:45 vps-ubuntu sshd[12354]: Invalid user test from 185.231.59.150 port 31234
Jan 21 10:15:48 vps-ubuntu sshd[12355]: Failed password for invalid user oracle from 185.231.59.150 port 31235
Jan 21 10:15:51 vps-ubuntu sshd[12356]: Invalid user postgres from 185.231.59.150 port 31236
Jan 21 10:15:54 vps-ubuntu sshd[12357]: Failed password for invalid user nagios from 103.207.38.123 port 54327
Jan 21 10:15:57 vps-ubuntu sshd[12358]: Invalid user ftp from 103.207.38.123 port 54328
Jan 21 10:16:02 vps-ubuntu sshd[12359]: Failed password for invalid user pi from 45.142.120.200 port 47894
Jan 21 10:16:05 vps-ubuntu sshd[12360]: Invalid user student from 45.142.120.200 port 47895
Jan 21 10:16:08 vps-ubuntu sshd[12361]: Failed password for invalid user teacher from 185.231.59.150 port 31237
Jan 21 10:16:12 vps-ubuntu sshd[12362]: Invalid user webmaster from 185.231.59.150 port 31238
Jan 21 10:16:15 vps-ubuntu sshd[12363]: Failed password for invalid user mysql from 103.207.38.123 port 54329
Jan 21 10:16:18 vps-ubuntu sshd[12364]: Invalid user info from 103.207.38.123 port 54330
Jan 21 10:16:21 vps-ubuntu sshd[12365]: Failed password for invalid user sales from 45.142.120.200 port 47896
Jan 21 10:16:24 vps-ubuntu sshd[12366]: Invalid user support from 45.142.120.200 port 47897
Jan 21 10:16:27 vps-ubuntu sshd[12367]: message repeated 3 times: [ Failed password for invalid user admin from 103.207.38.123 port 54331]
Jan 21 10:16:30 vps-ubuntu sshd[12368]: Connection closed by authenticating user root 103.207.38.123 port 54332 [preauth]
Jan 21 10:16:33 vps-ubuntu sshd[12369]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=45.142.120.200
Jan 21 10:16:36 vps-ubuntu sshd[12370]: Failed password for root from 185.231.59.150 port 31239 ssh2
Jan 21 10:16:39 vps-ubuntu sshd[12371]: Received disconnect from 103.207.38.123 port 54333:11: Bye Bye [preauth]
Jan 21 10:16:42 vps-ubuntu sshd[12372]: Invalid user git from 45.142.120.200 port 47898
Jan 21 10:16:45 vps-ubuntu sshd[12373]: Failed password for invalid user jenkins from 185.231.59.150 port 31240
Jan 21 10:16:48 vps-ubuntu sshd[12374]: Invalid user deployer from 103.207.38.123 port 54334
Jan 21 10:16:51 vps-ubuntu sshd[12375]: Failed password for invalid user www-data from 45.142.120.200 port 47899
Jan 21 10:16:55 vps-ubuntu sshd[12376]: Connection reset by 185.231.59.150 port 31241 [preauth]Хорошая новость: злоумышленникам не нужен ваш конкретный сервер. Им нужен любой уязвимый. Плохая новость: если вы не закрыли базовые векторы атак, вы автоматически попадаете в их список целей.
Эта статья — не теория, а готовый чек-лист действий. Вы выполните базовые шаги за 10 минут, а затем детально настроите каждую линию обороны, превратив стандартную "дверь" в укреплённый периметр.
Если нет времени: сделайте это за 10 минут прямо сейчас
Если проект уже запущен и каждая минута на счету, выполните этот минимум, чтобы закрыть самые критические дыры. Но обязательно вернитесь позже и пройдите полный чек-лист.
# 1. Обновить всё
sudo apt update && sudo apt upgrade -y
# 2. Создать пользователя без прав root
adduser deployer && usermod -aG sudo deployer
# 3. Настроить базовый файрвол
sudo apt install ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw enable
# 4. Защититься от брутфорса
sudo apt install fail2ban
sudo systemctl enable fail2ban
# 5. Заблокировать вход для root
sudo passwd -l rootГотово? Отлично. Эти пять команд — ваш аварийный щит. Они закрывают самые частые и опасные векторы атак. Теперь давайте разберём каждую область защиты подробно, чтобы вы понимали почему эти шаги работают и как их правильно настроить на долгосрочную перспективу.
Жёсткий контроль доступа
Цель — закрыть все очевидные двери, через которые могут проникнуть автоматические скрипты и злоумышленники.
Вход под пользователем root
root может всё. Одна опечатка в команде или компрометация сессии — и система может быть необратимо повреждена или полностью захвачена.
Решение:
Создайте обычного пользователя с привилегиями:
adduser deployer
usermod -aG sudo deployerВыйдите из сессии
root, войдите какdeployerи убедитесь, чтоsudoработает.Позже мы полностью отключим вход для
root.
Использование пароля для SSH
Пароли можно подобрать. Ключи SSH криптографически стойки и не поддаются взлому перебором. Однако их безопасность напрямую зависит от сохранности закрытого ключа на вашем локальном компьютере.
Решение:
Сгенерируйте ключ на своей локальной машине (если его нет):
ssh-keygen -t ed25519 -C "your-email@example.com"Скопируйте его на сервер:
ssh-copy-id deployer@your-server-ipНастройте SSH, запретив небезопасные методы входа. Отредактируйте
/etc/ssh/sshd_config:PermitRootLogin no # Главное! Запрещаем вход root
PasswordAuthentication no # Отключаем аутентификацию паролем
PermitEmptyPasswords no
MaxAuthTries 3 # Ограничиваем попытки
AllowUsers deployer # Разрешаем вход только конкретному пользователюПерезагрузите службу SSH:
sudo systemctl restart sshd
Отсутствие защиты от брутфорса
Даже с ключами боты будут бесконечно стучаться в вашу дверь, засоряя логи и расходуя ресурсы.
Решение: Установите Fail2ban — он превратит ваш сервер из пассивной жертвы в активного защитника.
Установите пакет:
sudo apt install fail2banСоздайте локальный конфиг:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.localВ файле
/etc/fail2ban/jail.localнастройте блок[sshd]:[sshd]
enabled = true
port = ssh
maxretry = 3 # Количество неудачных попыток
bantime = 3600 # Время блокировки в секундах (1 час)
findtime = 600 # Окно для подсчёта попыток (10 минут)Проще говоря: 3 неудачных попытки за 10 минут = блокировка на час.
Перезапустите:
sudo systemctl restart fail2ban && sudo systemctl enable fail2ban
Сокращаем периметр атаки
Когда вы контролируете, кто может зайти, нужно ограничить, к чему можно подключиться.
Отсутствие файрвола
Без файрвола каждый порт на вашем сервере потенциально доступен из интернета для сканирования и атак.
Решение: Настройте простой, но эффективный файрвол ufw.
sudo apt install ufw
sudo ufw default deny incoming # Блокировать всё входящее по умолчанию
sudo ufw default allow outgoing # Разрешить всё исходящее
sudo ufw allow ssh # Разрешить SSH (порт 22)
sudo ufw allow 80/tcp # Разрешить HTTP, если нужен веб-сервер
sudo ufw allow 443/tcp # Разрешить HTTPS
sudo ufw enable # Включить и активировать правилаПомните: каждый открытый порт — это потенциальная точка входа. Открывайте только то, что используете.
Запуск ненужных служб
Каждая активная служба — это дополнительный код, который может содержать уязвимости.
Решение:
Посмотрите, что слушает сетевые порты:
sudo ss -tulpnОбратите внимание на столбец
Local Address:Port. Запись0.0.0.0:xxxxозначает, что служба доступна из любой сети, а127.0.0.1:xxxx— только локально.Остановите и отключите автозапуск для служб, которые не используете (например,
cups— сервер печати):sudo systemctl stop cups
sudo systemctl disable cups
Задайте себе вопрос: Действительно ли мне необходима эта служба?
Надёжный фундамент и план на случай провала
Безопасность — это не только стены, но и их прочность, а также умение восстановить то, что внутри.
Необновлённое программное обеспечение
Каждое обновление часто содержит заплатки для недавно обнаруженных уязвимостей. Не устанавливая их, вы оставляете дверь открытой для атак с готовыми эксплойтами.
Решение:
Прямо сейчас:
sudo apt update && sudo apt upgrade -yНа постоянной основе: Включите автоматические обновления безопасности.
sudo apt install unattended-upgrades
# Или для детальной настройки: sudo dpkg-reconfigure unattended-upgradesСервер, работающий 400 дней без перезагрузки, — не повод для гордости, а фактор риска. Патчи нужно применять.
Отсутствие резервных копий
Резервная копия — это ваш план эвакуации при пожаре. Без неё компрометация сервера означает не просто временную недоступность, а полную потерю данных и недели на восстановление вручную. Настройка автономного резервного копирования — это последний, но критически важный элемент безопасности, который позволит вам быстро восстановить чистую копию системы.
Решение: Настройте регулярное автономное резервное копирование.
Храните бэкапы на отдельном сервере или в облаке, а не на том же VPS.
Простой скрипт для начала (
/usr/local/bin/backup.sh):#!/bin/bash
BACKUP_DIR="/backup"
DATE=$(date +%Y-%m-%d)
tar -czf $BACKUP_DIR/backup-$DATE.tar.gz /home /etc /var/www 2>/dev/null
# Команда для отправки в облако (например, rclone или S3 CLI) добавится здесь
find $BACKUP_DIR -name "backup-*.tar.gz" -mtime +7 -deleteДобавьте задание в планировщик (
sudo crontab -e):0 2 * * * /usr/local/bin/backup.sh # Каждый день в 2 ночи
Полный чек-лист для нового VPS
Для каждой новой виртуальной машины пройдите по списку. Особое внимание уделите пунктам, выделенным жирным — они блокируют самые распространённые атаки:
- Обновить все пакеты (
apt update && apt upgrade) - Включить автоматические обновления безопасности
- Создать пользователя без прав
rootи добавить вsudo - Настроить аутентификацию по SSH-ключу
- Отключить аутентификацию по паролю для SSH
- Запретить вход для пользователя
root - Настроить файрвол (
ufw) - Установить и настроить
Fail2ban - Отключить неиспользуемые сетевые службы
- Настроить регулярные автономные бэкапы
Что дальше
Выполнив этот базовый чек-лист, вы серьёзно повысили безопасность своего сервера. Для тех, кто хочет пойти дальше, рассмотрите следующие шаги:
- Нестандартный порт SSH: Измените порт по умолчанию (
22) на другой в файле/etc/ssh/sshd_config(директиваPort). Это значительно снизит уровень шума в логах. Важно: после смены порта не забудьте указывать его при подключении:ssh -p <новый_порт> deployer@your-server-ip, а также обновить правило файрволаufw. - Мониторинг логов: Настройте простой мониторинг с помощью утилит вроде
logwatchили просто регулярно проверяйте ключевые логи:sudo tail -f /var/log/auth.log. - Углублённая настройка под ваши сервисы: Если вы используете Nginx, WordPress или другое ПО — изучите и примените рекомендации по его безопасной настройке. Например, настройте
fail2banдля защиты веб-интерфейсов.
FAQ: Частые вопросы и проблемы
Я выполнил все шаги, включая отключение паролей и root. Теперь я не могу зайти на сервер! Что делать?
Самая вероятная причина — ошибка при копировании SSH-ключа или некорректные права на файлы ключей.
- Проверьте подключение с ключом вручную, указав путь к нему:
ssh -i ~/.ssh/id_ed25519 deployer@your-server-ip. - Если это не помогло, и у вас ещё есть открытая сессия, проверьте логи SSH на сервере:
sudo tail -f /var/log/auth.log. Попробуйте подключиться заново и посмотрите, что пишет лог. - Если сессия потеряна, вам придётся использовать восстановление (рекавери) через панель управления вашего VPS-провайдера (например, VNC-консоль). Это экстренная мера, которая лишний раз подтверждает важность тестирования новой сессии перед закрытием старой.
Команда sudo apt upgrade требует перезагрузки. Это обязательно?
Если среди обновлений было ядро (linux-image-*) или критичные системные библиотеки (например, glibc), то да, перезагрузка необходима для полного применения обновлений. Система может работать, но будет использовать устаревшую, потенциально уязвимую версию ядра. После upgrade выполните sudo reboot в удобное время.
Fail2ban забанил мой собственный IP-адрес. Как разблокировать?
Это обычная ситуация, если вы несколько раз ошиблись с паролем или ключом.
- Подключитесь к серверу через консоль восстановления от провайдера (VNC/Rescue).
- Разблокируйте IP командой:
sudo fail2ban-client set sshd unbanip <ваш_ip>. - Чтобы избежать этого в будущем, добавьте свой IP в «белый список». В файле
/etc/fail2ban/jail.localв секцию[sshd]добавьте строку:ignoreip = 127.0.0.1/8 <ваш_постоянный_ip>.
Я открыл порты 80 и 443 для веб-сервера, но подключиться по-прежнему нельзя. В чём дело?
Файрвол ufw разрешает подключения, но это не значит, что на сервере есть служба, которая «слушает» эти порты.
- Убедитесь, что ваш веб-сервер (Nginx/Apache) установлен, запущен и настроен:
sudo systemctl status nginx. - Проверьте ещё раз, что служба слушает нужные порты:
sudo ss -tulpn | grep :80. Если список пуст — проблема в настройке веб-сервера, а не файрвола.
Насколько безопасно включать автоматические обновления (unattended-upgrades)? Они не сломают что-нибудь?
Пакет unattended-upgrades по умолчанию настраивается на установку только обновлений безопасности, что является наименее рискованной практикой. Риск сломать что-то есть, но он значительно ниже риска быть взломанным из-за известной, но неисправленной уязвимости. Для критически важных продакшен-серверов рекомендуется иметь тестовое окружение и проводить обновления с контролируемым окном простоя.
Где лучше хранить бэкапы? «Отдельный сервер» — это сложно.
«Отдельный сервер» — это принцип. На практике для начала подойдут:
- Объектное хранилище вашего же хостинг-провайдера (например, S3-совместимое).
- Специализированный сервис бэкапов (BorgBase, rsync.net).
- Другой, более дешёвый VPS у другого провайдера (принцип географического и инфраструктурного разделения).
- Локальный компьютер (но это не защитит от физического повреждения сервера дата-центра). Главное — автоматизация и проверка восстановления.
Я сделал всё из чек-листа. Мой сервер теперь неуязвим?
Нет, и ни один сервер не может быть «неуязвимым».
Вы закрыли базовый, обязательный минимум, который защищает от 99% автоматических атак методом «подбора по шаблону». Безопасность — это процесс, а не состояние. Новые уязвимости обнаруживаются постоянно, а целевые атаки (на вас лично) требуют более глубоких мер. Данное руководство — прочный фундамент, на котором уже можно строить дальнейшую защиту (например, из раздела «Что дальше?»).
Эти инструкции подойдут для CentOS/RHEL или Debian?
Принципы — универсальны. Конкретные команды (менеджер пакетов apt, имена пакетов ufw, fail2ban) предназначены для дистрибутивов на основе Debian/Ubuntu. Для RHEL/CentOS/Fedora потребуется использовать yum/dnf, firewalld вместо ufw, а некоторые пакеты могут иметь другие имена. Логика шагов (пользователь, SSH-ключи, файрвол, обновления) остаётся точно такой же.
Заключение
Большинство злоумышленников действуют по шаблону: они ищут стандартные пароли, непатченное ПО и открытые порты.
Сделав свой сервер сложнее для взлома, чем следующий в списке сканирования, вы заставите 99% ботов и хакеров просто пройти мимо.
Шаги в этом руководстве не требуют глубоких знаний. Полдня работы закладывают фундамент, который выдержит подавляющее большинство автоматических атак.
Сделайте это до того, как это станет необходимо. Не после.