Системное администрирование

Базовая защита Ubuntu-сервера: firewall и обновления

Базовая защита Ubuntu-сервера: firewall и обновления

Если на сервере Ubuntu открыт SSH и больше ничего не настроено, это уже повод заняться базовой защитой. Минимальный набор действий простой: закрыть все лишние входящие порты, оставить только нужные сервисы и регулярно ставить обновления безопасности. Для Ubuntu стандартным инструментом управления брандмауэром является UFW, а автоматические security-обновления выполняет unattended-upgrades.

Зачем вообще начинать с firewall и обновлений

Большинство атак на VPS и серверы не выглядят как «хакерский взлом из кино». Чаще всего это автоматические сканеры, которые перебирают открытые порты, ищут забытые панели, старые версии сервисов и слабые настройки. По моему опыту, на свежем VPS первые же минуты после получения IP начинают сыпаться попытки подбора паролей к SSH — это боты, сканирующие весь интернет. Если порт открыт, а пароль слабый, взлом становится вопросом времени. Поэтому первое, что я делаю на новом сервере — настраиваю UFW и ставлю обновления.

Если на сервере открыт только SSH, а всё остальное закрыто, поверхность атаки уже заметно меньше. Обновления нужны по той же причине: уязвимости в Linux-пакетах и прикладных сервисах регулярно закрываются патчами. Документация Ubuntu Server прямо рекомендует регулярно обновлять систему и использовать автоматическую установку security-обновлений.

Что входит в базовую защиту Ubuntu-сервера

  • Закрыть все входящие соединения по умолчанию.
  • Оставить только нужные порты, например SSH, 80 и 443 для веб-сервера.
  • Включить логирование firewall.
  • Настроить регулярные обновления системы.
  • Проверять статус правил и список пакетов после изменений.

Этого уже достаточно для старта, если сервер используется для типового сайта, тестового окружения или небольшого приложения. Позже вы добавите fail2ban, настроите SSH по ключам, возможно, смените порт. Но начинать нужно именно с firewall и патчей — это минимальная программа, которая закрывает самые очевидные дыры.

UFW: простой firewall для Ubuntu

UFW — это стандартный инструмент Ubuntu для настройки host-based firewall. Под капотом он генерирует правила netfilter (iptables или nftables), но вам не нужно помнить сложные цепочки — достаточно нескольких команд. Он создан, чтобы упростить работу с правилами сети и не заставлять вручную разбирать низкоуровневые механизмы фильтрации пакетов.

Какой принцип работы выбрать

Базовая логика такая:

  • всё входящее запрещено;
  • всё исходящее разрешено;
  • отдельно разрешаются нужные службы.

Это безопаснее, чем пытаться закрывать лишнее вручную. Если вы забыли какой-то порт, он просто не будет доступен извне. Я всегда начинаю с политик по умолчанию: sudo ufw default deny incoming и sudo ufw default allow outgoing. Это гарантирует, что ни один входящий пакет не пройдёт, пока я явно не разрешу.

Базовые команды UFW

UFW — стандартный инструмент, рекомендуемый в документации Ubuntu. Вот основные команды, которые вам понадобятся в повседневной работе:

  • sudo ufw status — показывает, активен ли firewall и какие правила загружены. Для детального вывода используйте sudo ufw status verbose.
  • sudo ufw enable — включает firewall и добавляет его в автозагрузку. Правила применяются немедленно, перезагрузка не требуется.
  • sudo ufw disable — полностью отключает firewall.
  • sudo ufw allow <порт или служба> — разрешает входящие соединения. Можно указывать номер порта, протокол (tcp/udp) или имя службы из /etc/services.
  • sudo ufw deny <порт> — явно запрещает порт (полезно для переопределения более широких правил).
  • sudo ufw delete <правило> — удаляет правило. Удобнее всего использовать sudo ufw status numbered, чтобы увидеть номера правил, а затем sudo ufw delete 3.
  • sudo ufw logging on — включает логирование заблокированных и разрешённых пакетов (логи пишутся в /var/log/ufw.log).

Этих команд хватит для 99% повседневных задач. Более сложные конструкции вроде ограничения по IP или лимита подключений мы разберём дальше.

Пошаговая настройка firewall на Ubuntu

Шаг 1. Проверить, установлен ли UFW

На большинстве современных установок Ubuntu UFW уже доступен, но лучше проверить статус.

sudo ufw status

Если команда показывает, что firewall неактивен (Status: inactive), это не ошибка — это обычная ситуация на многих свежих серверах. UFW есть в системе, просто не включён.

Шаг 2. Разрешить SSH до включения firewall

Это критически важно. Я сам однажды на боевом сервере сначала включил UFW, а потом вспомнил про SSH. Благо был доступ через консоль провайдера, но осадочек остался. Всегда сначала разрешайте SSH.

sudo ufw allow ssh

Или, если нужен явный порт:

sudo ufw allow 22/tcp

Для серверов с нестандартным SSH-портом разрешают именно его, например sudo ufw allow 2222/tcp.

Шаг 3. Разрешить нужные сервисы

Для веб-сервера обычно нужны:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Для почты, базы данных, VPN и других сервисов набор будет другим. Разрешайте только то, что реально используется. Не забывайте, что некоторые панели управления требуют дополнительные порты — сверьтесь с документацией.

Шаг 4. Включить firewall

sudo ufw enable

После этой команды правила применяются сразу и сохраняются в автозагрузке. Перезагружать сервер не нужно. Если всё сделано правильно, вы не потеряете SSH-доступ.

Шаг 5. Проверить правила

sudo ufw status numbered

Так удобнее смотреть, какие правила активны, и удалять лишние по номеру. Например, sudo ufw delete 3 удалит третье правило. После каждого изменения я всегда прогоняю эту команду, чтобы убедиться, что ничего лишнего не открыто.

Рекомендуемый базовый набор правил

Сценарий Что открыть Комментарий
Администрирование по SSH 22/tcp или другой SSH-порт Открывать только свой IP дополнительно ещё лучше, если есть статический адрес
Обычный веб-сайт 80/tcp, 443/tcp HTTP и HTTPS
Панель управления Только нужный порт Лучше ограничить по IP
База данных По возможности не открывать наружу Безопаснее оставить доступ только локально или через туннель

Ограничение по IP делается командой sudo ufw allow from 192.168.1.100 to any port 22. Если у вас динамический IP, это не подойдёт, но можно использовать VPN или промежуточный сервер.

Полезные привычки при работе с firewall

Ограничивайте доступ по IP, если это возможно

Если сервером пользуетесь только вы из офиса или дома с постоянным адресом, SSH можно ограничить конкретным IP. Это намного безопаснее, чем оставлять порт доступным всему интернету. Я всегда так делаю для SSH, если работаю из офиса с белым статическим IP. Это сразу отсекает 99% попыток подбора.

Не открывайте лишние порты «на всякий случай»

Самая частая ошибка новичков — добавить правило и забыть о нём. Через пару месяцев сервер уже светит наружу чем угодно: от тестовой базы до временной панели. Помню, как на тестовом сервере оставил открытым порт 3306 для MySQL, потому что «потом пригодится». Через неделю в логах обнаружил попытки подключения к базе из Китая. Закрыл и больше так не делаю.

Смотрите на список правил после каждого изменения

После установки нового сервиса сразу проверьте, не потребовал ли он отдельный порт. Если нет нужды в доступе извне, лучше ничего не открывать. Кстати, некоторые приложения (например, Docker) могут добавлять свои правила в iptables в обход UFW. Поэтому периодически стоит проверять не только ufw status, но и sudo iptables -L для полной картины.

Включайте логирование, если разбираетесь в событиях

UFW умеет логировать действия. Это полезно, когда нужно понять, кто пытается подключаться к серверу и какие запросы режутся firewall. По умолчанию логирование может быть выключено. Включается через sudo ufw logging on. Логи пишутся в /var/log/ufw.log. Там видно, какие пакеты блокируются, и можно выявить аномалии — например, частые попытки подключения к нестандартным портам.

Обновления Ubuntu: второй обязательный слой защиты

Firewall закрывает лишний доступ, но не чинит уязвимости в самих пакетах. Если в SSH-сервере или веб-сервере есть дыра, злоумышленник, уже прошедший аутентификацию, сможет её использовать. Поэтому патчи критичны. Я обычно сразу после настройки UFW запускаю полное обновление системы. Документация Ubuntu security рекомендует регулярно обновлять систему и отмечает, что автоматические security-обновления доступны через unattended-upgrades, который в современных установках обычно уже есть по умолчанию.

Базовая ручная команда обновления

sudo apt update && sudo apt upgrade -y

Иногда удобнее использовать более явную форму:

sudo apt update
sudo apt upgrade

Смысл простой: сначала обновляется список пакетов, потом устанавливаются доступные обновления. Перед обновлением полезно посмотреть, что именно будет обновлено: apt list --upgradable. Если видите обновление ядра или критических библиотек, запланируйте перезагрузку сервера. Для большинства типовых серверов upgrade достаточно, но иногда может потребоваться apt full-upgrade, который умеет удалять конфликтующие пакеты и корректно обновлять ядро.

Автоматические обновления безопасности

Если сервер живой и вы не заходите на него каждый день, автоматические обновления безопасности — разумный минимум. Документация Ubuntu Server указывает, что unattended-upgrades автоматически применяет security updates и запускается раз в сутки.

Как это работает

  • система получает список обновлений;
  • security-пакеты ставятся автоматически;
  • обычные обновления можно оставить на ручную проверку, если так удобнее;
  • сервер меньше зависит от человеческого фактора.

Для части серверов этого достаточно, чтобы не пропускать критические патчи из-за занятости или выходных. По умолчанию unattended-upgrades устанавливает только обновления из репозитория security.ubuntu.com, не трогая остальные пакеты. Это разумный компромисс между стабильностью и безопасностью.

Проверка и настройка

Пакет unattended-upgrades обычно уже установлен и включён по умолчанию в Ubuntu Server. Проверить его статус можно так:

systemctl status unattended-upgrades.service

Для симуляции того, что будет установлено, используйте:

sudo unattended-upgrades --dry-run

Конфигурация лежит в /etc/apt/apt.conf.d/50unattended-upgrades. Там можно настроить, какие обновления ставить (только security или все), и нужно ли автоматически перезагружать сервер при обновлении ядра. На боевых серверах без присмотра авто-перезагрузку лучше отключить — если ядро обновится некорректно, сервер может не подняться.

Когда автообновления подходят, а когда нет

Подходят, если:

  • сервер небольшой;
  • на нём обычный веб-сайт или тестовый проект;
  • нет сложной совместимости между версиями пакетов;
  • нужен быстрый уровень базовой безопасности.

Не лучший вариант, если:

  • сервер поддерживает критичный бизнес-сервис;
  • есть строгие окна обслуживания;
  • обновления нужно сначала проверять на стенде;
  • изменения пакетов могут ломать совместимость.

В таких случаях разумнее оставить security-обновления включёнными, но общий апгрейд пакетов делать по регламенту. Например, для сервера с простым сайтом на WordPress автообновления безопасности — отличный выбор. А вот для сервера, где крутится самописный проект на Python с кучей зависимостей, лучше обновлять пакеты вручную после тестирования на dev-стенде.

Типовые ошибки новичков

  • Включить firewall, не разрешив SSH, и потерять доступ.
  • Открыть все порты подряд, а потом «разбираться позже».
  • Забыть, что веб-приложение использует дополнительный порт.
  • Думать, что firewall заменяет обновления.
  • Откладывать патчи на неопределённый срок.
  • Не проверять активные правила после установки нового софта.
  • Использовать ufw allow без указания протокола (tcp/udp), забывая, что некоторые сервисы требуют оба.
  • Не проверять, что после перезагрузки UFW запускается (хотя он должен, но бывают исключения).
  • Игнорировать IPv6 — UFW по умолчанию управляет и IPv6 правилами, но если вы вручную правили iptables, можно пропустить.

Мини-чек-лист для нового Ubuntu-сервера

  • Разрешён SSH-доступ.
  • Закрыты все лишние входящие порты.
  • Открыты только нужные сервисы.
  • UFW включён и правила проверены.
  • Логика доступа понятна: что, откуда и зачем открыто.
  • apt update и apt upgrade выполняются регулярно.
  • unattended-upgrades включён, если сервер не требует ручного контроля.
  • После установки новых сервисов проверяется их сетевой доступ.
  • Проверено, что unattended-upgrades активен и не выдаёт ошибок в логах.

Практический сценарий для веб-сервера

Если это обычный Ubuntu-сервер под сайт, базовая схема выглядит так:

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
sudo apt update && sudo apt upgrade -y
sudo systemctl enable --now unattended-upgrades

После этих команд я обычно сразу проверяю доступность SSH с другого терминала, не закрывая текущую сессию. И только потом продолжаю настройку. Это не «всё, что нужно для идеальной безопасности», но это очень хороший старт. Для большинства небольших проектов именно здесь и начинается разумная защита.

Что ещё стоит проверить после базовой настройки

  • Не торчит ли наружу лишний сервис через ss -tulpen.
  • Не открыт ли порт базы данных в интернет.
  • Не остались ли тестовые правила после установки панелей и CMS.
  • Не использует ли приложение старую и уже небезопасную версию PHP, Python или другого рантайма.
  • Не нужно ли ограничить SSH по ключам и отключить вход по паролю.
  • Проверьте, не слушает ли какой-то сервис на 0.0.0.0, если он должен быть только локальным. Например, Redis или MongoDB часто по умолчанию слушают все интерфейсы. Используйте ss -tulpn и смотрите на столбец Local Address. Если видите 0.0.0.0:27017, а база не должна быть доступна снаружи, это проблема.

FAQ

Нужно ли ставить отдельный firewall, если уже есть UFW?

Нет, для 99% задач UFW хватает с головой. Это официальный инструмент Ubuntu, и он прекрасно справляется с host-based фильтрацией. Если вам нужны сложные правила маршрутизации или шейпинг, тогда смотрят в сторону iptables/nftables напрямую, но для начала UFW — то, что доктор прописал.

Что открывать первым делом на сервере?

Сначала SSH, иначе можно потерять доступ. Потом уже добавляют HTTP/HTTPS или другие нужные службы. Я всегда сначала разрешаю SSH, проверяю, что правило появилось в ufw status, и только потом включаю firewall.

Обновления лучше ставить вручную или автоматически?

Для обычного сервера с типовой нагрузкой удобнее включить автоматические security-обновления. Ubuntu поддерживает такой режим через unattended-upgrades. Это снижает риск пропустить критический патч из-за человеческого фактора. Если сервер критичный, оставьте автообновления только для security, а остальное обновляйте по регламенту.

Можно ли обойтись только firewall без обновлений?

Нет. Firewall закрывает доступ, но не исправляет уязвимости в уже запущенных пакетах и сервисах. Это как поставить железную дверь, но оставить окна открытыми. Уязвимость в том же SSH-сервере может позволить злоумышленнику получить доступ, даже если порт открыт только для вас.

Как понять, что firewall реально работает?

Проверьте sudo ufw status verbose, а затем убедитесь, что нужный порт доступен извне, а лишний — нет. Можно использовать telnet или nmap с другого хоста. Например, nmap -p 22,80,443 ваш_сервер покажет, какие порты открыты. Также загляните в логи /var/log/ufw.log — там будут записи о заблокированных пакетах.

Вывод

Базовая защита Ubuntu-сервера строится вокруг двух вещей: firewall и обновлений. UFW закрывает лишние входящие соединения, а регулярные патчи и автоматические security-обновления уменьшают риск взлома через известные уязвимости.

Если делать только один шаг, начните с правила «всё закрыто, кроме нужного». Если делать два — сразу добавьте обновления. Именно эта связка даёт самый заметный эффект при минимуме усилий. Это та база, с которой должен начинать каждый, кто поднимает сервер — будь то тестовый стенд в Бугульме или продакшен в облаке.