Первые 10 шагов после покупки VPS: безопасность
Пароли к новому серверу начинают подбирать через несколько минут после того, как у него появился публичный IP. Ниже — десять шагов, которые за час закрывают самые частые дыры: команды для Ubuntu и Debian, отличия для AlmaLinux и Rocky Linux и проверки, без которых легко потерять доступ к собственному серверу.
Сервер, который вы только что оплатили, уже виден всему интернету. Боты перебирают адреса подряд и пробуют войти по SSH под root с популярными паролями, так что в журнале первые чужие попытки появляются в тот же час. Хорошая новость в том, что от массовых атак защищают простые вещи: вход только по ключу, закрытые лишние порты и обновления. Всё ниже делается один раз, примерно за час, лучше до того, как на сервер попадут сайт и данные.
Команды даны для Ubuntu и Debian, отличия для AlmaLinux и Rocky Linux отмечены отдельно. Выполняйте их от root или через sudo.
Перед началом: запасной вход
Найдите в панели хостера консоль сервера: она называется VNC, KVM-консоль или аварийная консоль и открывает экран сервера прямо в браузере. Через неё можно войти, даже если SSH уже не пускает. Пока вы меняете настройки входа, держите открытой текущую сессию SSH и проверяйте каждое изменение во втором окне. Так ошибка в конфигурации стоит пары минут, а не переустановки системы.
1. Обновите систему
Шаблоны систем у хостеров собирают заранее, и к моменту установки в них часто набирается десяток неустановленных исправлений безопасности.
apt update && apt full-upgrade -y # Ubuntu, Debian
dnf upgrade -y # AlmaLinux, Rocky Linux
Если обновилось ядро, перезагрузите сервер. В Ubuntu и Debian об этом говорит файл /var/run/reboot-required: если он есть, нужна перезагрузка.
2. Заведите отдельного пользователя
Работать постоянно под root неудобно и опасно: любая опечатка выполняется с полными правами, а имя root знают все боты. Создайте своего пользователя и дайте ему право на sudo:
adduser deploy
usermod -aG sudo deploy # Ubuntu, Debian
usermod -aG wheel deploy # AlmaLinux, Rocky Linux
В AlmaLinux и Rocky Linux команда adduser ничего не спрашивает, пароль задаётся отдельно: passwd deploy. Имя возьмите любое, кроме очевидных admin и user.
3. Войдите по SSH-ключу
Ключ невозможно подобрать перебором, в отличие от пароля. Создайте пару ключей на своём компьютере, а не на сервере, и скопируйте открытую часть на сервер:
ssh-keygen -t ed25519 -C "laptop"
ssh-copy-id deploy@IP_сервера
В Windows 10 и 11 клиент OpenSSH встроен, а ssh-copy-id нет. Тогда откройте файл .pub и вставьте его строку на сервере в /home/deploy/.ssh/authorized_keys; у папки .ssh должны быть права 700, у файла — 600, владелец — сам пользователь. Многие хостеры позволяют добавить ключ ещё при заказе, тогда он уже лежит у root.
Проверьте в новом окне, что вход работает без пароля и sudo доступен: ssh deploy@IP_сервера, затем sudo -v. Только после этого переходите к следующему шагу.
4. Запретите вход по паролю и под root
Удобнее всего не править основной файл, а положить свои настройки отдельным файлом в /etc/ssh/sshd_config.d/. Важная деталь: для каждого параметра sshd берёт первое найденное значение, а файлы из этой папки читает по алфавиту. В образах Ubuntu для облака там бывает файл 50-cloud-init.conf со строкой PasswordAuthentication yes, поэтому свой файл назовите с номером меньше 50, например /etc/ssh/sshd_config.d/10-hardening.conf:
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
Проверьте синтаксис и то, какие значения сервер реально применит, затем перечитайте настройки:
sshd -t && sshd -T | grep -Ei 'permitrootlogin|passwordauthentication'
systemctl reload ssh # Ubuntu, Debian
systemctl reload sshd # AlmaLinux, Rocky Linux
Не закрывайте старую сессию, пока во втором окне не войдёте под своим пользователем по ключу. Попытка войти под root должна получить отказ.
Менять порт SSH с 22 на другой не обязательно. Это убирает из журнала почти все автоматические попытки входа, но защиту даёт ключ, а не номер порта. Если всё же меняете, сначала откройте новый порт в файрволе. В Ubuntu 22.10 и новее SSH запускается через сокет systemd, и после смены Port нужно выполнить systemctl daemon-reload и systemctl restart ssh.socket, иначе сервер продолжит слушать 22.
5. Включите файрвол
Правило простое: все входящие соединения запрещены, кроме тех, что идут к службам, которые должны быть видны снаружи. Для сайта это SSH, 80 и 443. В Ubuntu удобен ufw, в Debian его нужно поставить командой apt install ufw:
ufw default deny incoming
ufw default allow outgoing
ufw allow OpenSSH
ufw allow 80,443/tcp
ufw enable
ufw status verbose
Порядок важен: сначала разрешите SSH, потом включайте. В AlmaLinux и Rocky Linux уже работает firewalld, и SSH в нём разрешён по умолчанию; веб-порты открываются так:
firewall-cmd --permanent --add-service=http --add-service=https
firewall-cmd --reload
firewall-cmd --list-all
Если на сервере будет Docker, учтите его особенность: он сам пишет правила iptables, и опубликованный порт контейнера, например -p 3306:3306, становится доступен из интернета, даже если в ufw он не разрешён. Служебные порты публикуйте только на локальный адрес: -p 127.0.0.1:3306:3306. Тарифы под контейнеры собраны в подборке VPS для Docker.
У многих хостеров в панели есть ещё и сетевой файрвол перед сервером. Он не заменяет системный, но полезен как второй слой. Защита от DDoS — отдельная услуга на уровне сети хостера, тарифы с ней в подборке VPS с защитой от DDoS.
6. Поставьте fail2ban
fail2ban читает журналы и на время запрещает доступ адресам, которые раз за разом ошибаются при входе. При входе только по ключу он в основном разгружает журнал, но пригодится и для других служб: панели управления, почты, страницы входа сайта.
apt install fail2ban python3-systemd
Свои настройки пишите в /etc/fail2ban/jail.local, а не в jail.conf, который перезапишется при обновлении:
[sshd]
enabled = true
backend = systemd
maxretry = 5
bantime = 1h
Строка backend = systemd нужна в Debian 12 и новее: там по умолчанию нет файла /var/log/auth.log, журнал входов живёт в journald, и без этой строки fail2ban не находит, что читать. Без своих настроек он банит адрес на 10 минут после 5 неудачных попыток за 10 минут. После правки выполните systemctl restart fail2ban и проверьте: fail2ban-client status sshd. В AlmaLinux и Rocky Linux пакет берётся из репозитория EPEL: dnf install epel-release, затем dnf install fail2ban и systemctl enable --now fail2ban.
7. Включите автоматические обновления безопасности
Большинство взломов серверов используют уязвимости, для которых исправление уже вышло, просто его не поставили. В Ubuntu пакет unattended-upgrades установлен и включён по умолчанию, проверьте это командой systemctl status unattended-upgrades. В Debian его ставят и включают так:
apt install unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades
По умолчанию он ставит только обновления безопасности. Ядро без перезагрузки не обновится: либо перезагружайте сервер сами по признаку из шага 1, либо включите автоматическую перезагрузку в ночное время параметрами Unattended-Upgrade::Automatic-Reboot и Automatic-Reboot-Time в /etc/apt/apt.conf.d/50unattended-upgrades.
В AlmaLinux и Rocky Linux то же делает dnf-automatic. Поставьте пакет dnf install dnf-automatic, в /etc/dnf/automatic.conf задайте upgrade_type = security и apply_updates = yes (без этого обновления только скачиваются) и включите таймер: systemctl enable --now dnf-automatic.timer.
8. Проверьте, что сервер слушает
Шаблоны хостеров и панели управления иногда запускают службы, о которых вы не просили. Посмотрите все открытые порты:
ss -tulpn
Всё, что слушает на 0.0.0.0 или [::], доступно снаружи, если файрвол это пропускает. Кроме SSH и веб-сервера таких служб быть не должно. Базы данных MySQL, MariaDB, PostgreSQL и Redis должны слушать только 127.0.0.1: в пакетах Debian и Ubuntu так и задано по умолчанию, но после установки через Docker или сторонний скрипт это стоит проверить. Ненужные службы остановите и уберите из автозапуска: systemctl disable --now имя_службы. Посмотреть на сервер глазами постороннего можно с другого компьютера: nmap -Pn IP_сервера.
9. Время, журналы и мониторинг
Проверьте командой timedatectl, что часы синхронизируются (строка System clock synchronized: yes). Неверное время ломает проверку сертификатов, одноразовые коды и разбор журналов. Кто и когда входил на сервер, показывают last -a | head и journalctl -u ssh --since today (в AlmaLinux служба называется sshd).
Подключите внешний мониторинг доступности: бесплатных сервисов, которые раз в минуту открывают сайт и пишут вам при ошибке, много. Отдельно настройте оповещение о заполнении диска: переполненный диск — частая причина того, что сайт и база перестают работать ночью.
10. Сделайте точку отката и закройте панель хостера
Когда сервер настроен, сделайте снимок диска в панели хостера, если такая функция есть: к чистой настроенной системе можно будет вернуться за минуты. Снимок не заменяет резервных копий, потому что хранится у того же хостера. Как устроить настоящие копии вне сервера, разобрано в статье Резервные копии VPS.
Включите двухфакторный вход в личный кабинет хостера. Через кабинет сервер можно переустановить, сбросить пароль root или открыть консоль, и защищённый SSH ничего не даст, если кабинет откроется по украденному паролю. Закрытый ключ SSH храните только на своих устройствах и защитите его парольной фразой.
Чего не делать
- Не отключайте SELinux в AlmaLinux и Rocky Linux при первой ошибке доступа. Почти всегда хватает правильной метки на папке сайта или одного разрешения через
setsebool. - Не ставьте права 777 на папки сайта. Владельцем файлов должен быть пользователь веб-сервера или отдельный пользователь сайта, права папок — 755, файлов — 644.
- Не запускайте приложения от root. Боту, сайту и очереди задач хватает своего пользователя без
sudo. - Не публикуйте панель управления и phpMyAdmin на стандартных адресах для всех. Разрешите вход в них только со своего IP или через SSH-туннель.
Систему для нового сервера удобно выбирать по подборкам VPS с Ubuntu, VPS с Debian и VPS с AlmaLinux. Если сервер берётся под сайт с хостинга, следующий шаг описан в статье Как перенести сайт с хостинга на VPS, а на что смотреть при выборе самого тарифа — в статье Как выбрать VPS.