Свежий сервер Ubuntu нельзя оставлять «как установили»: сначала нужно обновить систему, закрыть лишние входы, настроить SSH, firewall, пользователей, автоматические обновления и базовый мониторинг. Этот гайд помогает привести VPS или выделенный сервер к более безопасному состоянию без сложной корпоративной инфраструктуры.

Базовая защита Ubuntu начинается до установки приложений
Первичная настройка безопасности Linux — это не установка одного «волшебного» антивируса и не набор случайных команд из интернета. Это последовательность простых решений, которые уменьшают площадь атаки сервера.
Площадь атаки — это всё, через что к серверу можно подключиться, что можно просканировать, подобрать, сломать или использовать с ошибкой администратора. На новом Ubuntu-сервере обычно уже есть SSH-доступ, пакетный менеджер, системные службы, журналы, пользователи и сетевые настройки. Этого достаточно, чтобы сервер начал попадать в автоматические сканирования почти сразу после появления в интернете.
Задача первоначальной настройки — не сделать сервер «абсолютно неуязвимым». Такой цели в реальной админской практике нет. Задача проще и полезнее: убрать очевидные слабые места, включить предсказуемые правила доступа и подготовить систему к дальнейшей эксплуатации.
В качестве примера будем рассматривать Ubuntu Server 24.04 LTS и более новые LTS-релизы. Большинство команд также подходит для Ubuntu 22.04 LTS, Debian-подобных систем и типичного VPS. Для production-сервера команды стоит выполнять внимательно, особенно если вы подключены по SSH и можете случайно закрыть себе доступ.
Обновления закрывают известные уязвимости быстрее ручного администрирования
Первый шаг после входа на сервер — обновить список пакетов и установить доступные исправления.
sudo apt update
sudo apt upgrade -yПосле крупных обновлений, особенно ядра, библиотек и системных служб, серверу может потребоваться перезагрузка:
sudo rebootПроверить, требуется ли перезагрузка, можно так:
test -f /var/run/reboot-required && cat /var/run/reboot-requiredДля сервера, который будет работать постоянно, важно включить автоматическую установку обновлений безопасности. В Ubuntu для этого используется механизм unattended-upgrades. Согласно документации Ubuntu Server, автоматические security updates в Ubuntu Server включены по умолчанию, а unattended-upgrades обычно выполняется раз в день. Официальная документация также указывает, что управление периодичностью находится в /etc/apt/apt.conf.d/20auto-upgrades, а подробные логи — в /var/log/unattended-upgrades.
Проверить наличие пакета можно так:
dpkg -l | grep unattended-upgradesЕсли пакет отсутствует:
sudo apt install unattended-upgrades -yПроверка базовой конфигурации:
cat /etc/apt/apt.conf.d/20auto-upgradesОбычно там должны быть строки такого вида:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";Первая строка отвечает за регулярное обновление списков пакетов, вторая — за автоматическую установку разрешённых обновлений.
Для небольшого VPS автоматические security updates часто полезнее, чем редкое ручное обслуживание. Но есть нюанс: на сложных production-системах обновления могут перезапускать службы или требовать перезагрузки. Поэтому для критичных проектов стоит заранее продумать окно обслуживания, резервные копии и порядок проверки после обновлений.
Новый пользователь снижает риск работы от имени root
Многие VPS-провайдеры выдают первый доступ к серверу под пользователем root. Это удобно для установки, но плохо для повседневной работы. Если вы постоянно работаете от имени root, любая ошибочная команда выполняется с максимальными правами.
Создайте отдельного пользователя:
adduser adminuserДобавьте его в группу sudo:
usermod -aG sudo adminuserПроверьте вход под новым пользователем в отдельной SSH-сессии:
ssh adminuser@SERVER_IPПосле входа проверьте sudo-доступ:
sudo whoamiЕсли команда вернула root, пользователь настроен корректно.
Важное правило: не закрывайте текущую root-сессию, пока не убедились, что новый пользователь входит по SSH и может выполнять команды через sudo. Это простая страховка от ситуации, когда вы сами заблокировали себе доступ.
SSH требует ключей, запрета root-входа и аккуратной проверки конфигурации
SSH — главный вход на сервер. Если он настроен небрежно, сервер может месяцами получать попытки перебора паролей. Базовая цель — перейти на вход по SSH-ключу, отключить парольную авторизацию и запретить прямой вход root.
SSH-ключ безопаснее обычного пароля
На локальном компьютере создайте ключ, если его ещё нет:
ssh-keygen -t ed25519 -C "admin@example"Скопируйте публичный ключ на сервер:
ssh-copy-id adminuser@SERVER_IPЕсли ssh-copy-id недоступен, можно добавить содержимое публичного ключа вручную в файл:
~/.ssh/authorized_keysНа сервере права должны быть строгими:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keysПроверьте, что вход по ключу работает:
ssh adminuser@SERVER_IPТолько после успешной проверки можно переходить к отключению парольного входа.
Конфигурацию SSH лучше менять через отдельный файл
В современных Ubuntu настройки OpenSSH могут подключаться не только из /etc/ssh/sshd_config, но и из каталога /etc/ssh/sshd_config.d/. Поэтому удобно создать отдельный файл с локальными правилами:
sudo nano /etc/ssh/sshd_config.d/99-hardening.confДобавьте базовые параметры:
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
X11Forwarding no
MaxAuthTries 3Смысл параметров:
PermitRootLogin noзапрещает прямой вход root по SSH;PasswordAuthentication noотключает вход по паролю;KbdInteractiveAuthentication noотключает keyboard-interactive авторизацию, которую иногда забывают закрыть вместе с паролями;PubkeyAuthentication yesоставляет вход по SSH-ключу;X11Forwarding noотключает ненужную для большинства серверов пересылку графических приложений;MaxAuthTries 3уменьшает число попыток авторизации в рамках одного соединения.
В официальной документации OpenSSH параметр PermitRootLogin описан как настройка, определяющая, разрешён ли вход root через SSH. Значение no полностью запрещает такой вход, а значение prohibit-password запрещает root-вход по паролю и keyboard-interactive, но может оставлять доступ по ключу.
Перед перезапуском SSH обязательно проверьте конфигурацию:
sudo sshd -tЕсли ошибок нет, перезапустите службу:
sudo systemctl restart sshИ снова проверьте вход в новой сессии:
ssh adminuser@SERVER_IPНе закрывайте старую сессию до проверки новой.
Firewall разрешает только нужные входящие подключения
Firewall на сервере нужен не для красоты. Он задаёт понятные правила: какие входящие подключения разрешены, а какие должны быть отброшены. В Ubuntu стандартным удобным инструментом для базовой настройки является UFW — Uncomplicated Firewall. В документации Ubuntu указано, что UFW является стандартным инструментом настройки firewall в Ubuntu Server и по умолчанию изначально отключён.
Проверить статус:
sudo ufw status verboseБазовая безопасная логика для типичного веб-сервера:
sudo ufw default deny incoming
sudo ufw default allow outgoingПеред включением firewall нужно разрешить SSH, иначе можно потерять доступ:
sudo ufw allow OpenSSHЕсли SSH работает на нестандартном порту, например 2222, правило должно быть другим:
sudo ufw allow 2222/tcpДля веб-сервера обычно нужны HTTP и HTTPS:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcpПосле этого можно включить UFW:
sudo ufw enableПроверка правил:
sudo ufw status numberedПример ожидаемой логики:
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN AnywhereЕсли сервер используется только для API за reverse proxy, базы данных или внутреннего сервиса, открывать 80/443 может быть не нужно. Главное правило: открывайте только те порты, которые действительно используются.
Минимальный набор служб упрощает защиту сервера
Чем больше служб слушает сеть, тем сложнее понимать, что реально доступно извне. После установки сервера полезно посмотреть открытые порты:
sudo ss -tulpnКоманда покажет TCP/UDP-порты и процессы, которые их слушают. Для свежего сервера обычно ожидаем SSH. Для веб-сервера позже появятся Nginx или Apache на 80/443.
Посмотреть активные systemd-службы:
systemctl --type=service --state=runningЕсли вы видите службу, которую точно не используете, не спешите удалять её вслепую. Сначала проверьте назначение:
systemctl status SERVICE_NAME
apt show PACKAGE_NAMEОтключение лишней службы:
sudo systemctl disable --now SERVICE_NAMEУдаление пакета:
sudo apt remove PACKAGE_NAMEДля начинающего администратора безопаснее двигаться осторожно: сначала отключить, проверить работу сервера, потом удалять. На production-сервере перед такими действиями должны быть резервные копии и план отката.
Fail2ban помогает снизить шум от перебора паролей
Fail2ban не заменяет правильную настройку SSH и firewall. Его задача — читать журналы, находить повторяющиеся неудачные попытки входа и временно блокировать источник.
Установка:
sudo apt install fail2ban -yСоздайте локальный конфигурационный файл:
sudo nano /etc/fail2ban/jail.localМинимальный пример для SSH:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = %(sshd_log)s
maxretry = 5
findtime = 10m
bantime = 1hЗапуск и включение автозагрузки:
sudo systemctl enable --now fail2banПроверка статуса:
sudo fail2ban-client status
sudo fail2ban-client status sshdFail2ban особенно полезен, если парольная авторизация ещё не отключена или если сервер постоянно сканируют. Но при входе только по ключам, запрете root-входа и закрытом firewall он становится дополнительным слоем, а не главным средством защиты.
Права sudo должны быть выданы только тем, кто администрирует сервер
На небольшом сервере часто достаточно одного технического пользователя с sudo-доступом. Чем больше пользователей имеют административные права, тем выше риск ошибки, утечки ключа или неправильной настройки.
Посмотреть пользователей с sudo-доступом можно так:
getent group sudoУдалить пользователя из группы sudo:
sudo deluser username sudoСоздать пользователя без административных прав:
sudo adduser appuserТакой пользователь может использоваться для отдельного приложения, если оно не должно работать от root. Например, веб-приложение, скрипт обработки задач или сервисный процесс.
Важный принцип: приложению не нужны права root, если оно не управляет системой. Чем меньше прав у процесса, тем меньше ущерб при его компрометации.
Журналы позволяют увидеть проблемы до аварии
Без журналов администрирование превращается в угадывание. В Ubuntu основные события можно смотреть через journalctl.
Ошибки текущей загрузки:
sudo journalctl -p warning..alert -bЖурнал SSH-службы:
sudo journalctl -u sshПоследние записи в режиме наблюдения:
sudo journalctl -fПопытки входа можно проверять через auth.log, если файл используется в вашей версии и конфигурации системы:
sudo grep "Failed password" /var/log/auth.logДля Ubuntu на systemd-системах часто удобнее использовать journalctl, потому что часть событий централизованно попадает в systemd journal.
Полезно также проверять место на диске:
df -hИ размер каталогов журналов:
sudo du -sh /var/log/*Переполненный диск может остановить базу данных, веб-сервер, очереди, обновления и даже нормальный вход в систему. Поэтому мониторинг свободного места — это тоже часть безопасности.
Резервные копии защищают лучше любой красивой настройки
Без резервных копий сервер остаётся уязвимым не только к взлому, но и к ошибке администратора, сбою диска, неудачному обновлению, удалению файла или повреждению базы данных.
Минимальный подход:
- хранить копии вне самого сервера;
- регулярно проверять восстановление;
- отдельно учитывать файлы приложения, базу данных и конфигурации;
- не хранить единственную копию на том же VPS;
- ограничивать доступ к хранилищу бэкапов.
Для простого сайта на Ubuntu обычно нужны:
/etc/nginx или /etc/apache2
/etc/ssh
/etc/ufw
/home или /var/www
дампы баз данных
.env и другие конфигурации приложенияПример ручного дампа MySQL/MariaDB:
mysqldump -u USER -p DATABASE_NAME > backup.sqlПример архива каталога сайта:
tar -czf site-files.tar.gz /var/www/example.comРучной бэкап лучше, чем ничего, но для реального проекта нужна автоматизация: расписание, ротация, уведомления об ошибках и периодическая тестовая распаковка.
Базовая защита веб-сервера строится вокруг минимальных прав и HTTPS
Если на сервере будет сайт, API или панель управления, после системной настройки нужно аккуратно подойти к веб-слою.
Для Nginx или Apache базовые принципы одинаковые:
- включить HTTPS;
- не размещать секреты в публичном каталоге;
- запретить выполнение лишних файлов там, где это не требуется;
- не давать веб-пользователю права на системные каталоги;
- разделять владельца кода и пользователя веб-сервера;
- не открывать наружу базу данных, Redis, панели администрирования и внутренние сервисы.
Для Ubuntu-сервера с Nginx публичный каталог сайта часто находится в /var/www/.... Файл .env, конфигурации приложения, дампы базы данных, архивы и логи не должны быть доступны по прямой ссылке из браузера.
Плохой пример:
/var/www/site/public/backup.sql
/var/www/site/public/.env
/var/www/site/public/storage/logs/laravel.logХороший подход:
/var/www/site/
├── app
├── storage
├── .env
└── publicВеб-сервер должен смотреть только в public, а не в корень проекта.
Типичные ошибки делают сервер уязвимым даже после установки firewall
Начинающие администраторы часто выполняют отдельные правильные действия, но оставляют рядом грубые слабые места.
Открытый SSH по паролю сохраняет риск перебора
Даже сложный пароль хуже ключевой авторизации для сервера в интернете. Если парольный вход включён, сервер будет получать постоянные попытки подбора. Fail2ban может снижать шум, но правильнее отключить парольный вход после проверки SSH-ключей.
Firewall включён, но разрешены лишние порты
Команда sudo ufw enable сама по себе не делает сервер безопасным. Важны правила. Если открыты 3306, 6379, 9200, 8080 или панель администрирования без необходимости, firewall настроен плохо.
Root-вход запрещён только на бумаге
В новых версиях OpenSSH часть настроек может переопределяться файлами из sshd_config.d. Поэтому после изменения SSH нужно проверять итоговое поведение, а не просто считать, что строка в одном файле всё решила.
Проверка конфигурации перед перезапуском:
sudo sshd -tПроверка входа root:
ssh root@SERVER_IPОжидаемый результат — отказ во входе.
Обновления включены, но перезагрузки никто не контролирует
Security updates могут установить важные пакеты, но часть исправлений начинает работать только после перезагрузки службы или сервера. Поэтому нужно проверять /var/run/reboot-required, планировать окна обслуживания и не копить месяцами обновления ядра без перезапуска.
Резервные копии существуют, но восстановление не проверялось
Бэкап, который ни разу не восстанавливали, — это предположение, а не гарантия. Минимум иногда нужно проверять, что архив открывается, дамп базы импортируется, а нужные файлы действительно попали в копию.
Практический чек-лист помогает не пропустить важные шаги
Ниже — последовательность, которую можно использовать после установки Ubuntu на VPS.
Первый вход и обновление
sudo apt update
sudo apt upgrade -y
test -f /var/run/reboot-required && sudo rebootПользователь для администрирования
adduser adminuser
usermod -aG sudo adminuserПроверить вход новым пользователем и sudo-доступ:
ssh adminuser@SERVER_IP
sudo whoamiSSH-ключи и запрет паролей
На локальном компьютере:
ssh-keygen -t ed25519 -C "admin@example"
ssh-copy-id adminuser@SERVER_IPНа сервере:
sudo nano /etc/ssh/sshd_config.d/99-hardening.confСодержимое:
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
X11Forwarding no
MaxAuthTries 3Проверка и перезапуск:
sudo sshd -t
sudo systemctl restart sshFirewall
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status numberedЕсли это не веб-сервер, правила 80/443 не нужны.
Автоматические обновления безопасности
sudo apt install unattended-upgrades -y
cat /etc/apt/apt.conf.d/20auto-upgradesПроверка логов:
sudo ls -la /var/log/unattended-upgrades/Fail2ban
sudo apt install fail2ban -y
sudo nano /etc/fail2ban/jail.localСодержимое:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = %(sshd_log)s
maxretry = 5
findtime = 10m
bantime = 1hЗапуск:
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshdПроверка открытых портов и служб
sudo ss -tulpn
systemctl --type=service --state=runningКонтроль журналов
sudo journalctl -p warning..alert -b
sudo journalctl -u ssh
df -hПервичная настройка не заменяет дальнейшее сопровождение
После выполнения базовых шагов сервер становится заметно аккуратнее: вход по ключам, root закрыт, firewall ограничивает порты, обновления безопасности устанавливаются автоматически, а подозрительные попытки входа могут блокироваться Fail2ban.
Но это только первый слой. Дальше безопасность зависит от того, что именно будет работать на сервере: WordPress, Laravel, Docker, база данных, Telegram-бот, API, почтовый сервис или панель управления. У каждого сценария будут свои настройки, права, обновления, секреты и риски.
Хороший следующий шаг — описать для себя простую карту сервера:
Какие домены ведут на сервер
Какие порты открыты наружу
Какие приложения установлены
Где лежат конфигурации
Где хранятся секреты
Как создаются резервные копии
Как понять, что сервер сломан или атакованТакой документ кажется скучным, но именно он помогает быстро восстановить контроль, когда что-то пошло не так.
Безопасный сервер начинается с дисциплины
Первоначальная настройка безопасности Ubuntu — это фундамент, который нужно выполнить до установки сайта, панели, базы данных и дополнительных сервисов. Обновления закрывают известные уязвимости, SSH-ключи защищают вход, UFW ограничивает сеть, отдельный пользователь снижает риск ошибок, Fail2ban уменьшает шум от автоматических атак, а журналы и бэкапы помогают не потерять контроль.
Для небольшого VPS этого уже достаточно, чтобы уйти от состояния «сервер открыт как попало» к нормальной базовой защите. Дальше нужно усиливать безопасность под конкретную задачу: веб-сервер, CMS, Docker, базу данных, CI/CD или внутренние сервисы.