Как обновлять FreeBSD и проверять уязвимые пакеты
FreeBSD обновляет базовую систему через freebsd-update, а пакеты проверяет командой pkg audit. Это два отдельных инструмента и два источника уведомлений.
Как FreeBSD обрабатывает обновления безопасности
FreeBSD использует два отдельных инструмента для обновлений безопасности, потому что сервер FreeBSD состоит из двух отдельных частей. Базовая система, то есть ядро и пользовательское окружение, поставляемые с релизом, обновляется с помощью freebsd-update. Всё, что вы установили поверх неё, является пакетом, и пакеты обновляются с помощью pkg. Если выполнить одну команду и пропустить другую, половина системы останется без исправлений, а система никак об этом не сообщит.
SSD Nodes не предлагает образы FreeBSD. Наши тарифы работают на Linux. Эта статья всё равно нужна, потому что аудитория полностью пересекается: пользователи наших серверов Ubuntu и Debian также запускают FreeBSD на межсетевом экране или на единственном унаследованном сервере. Именно разделённая модель обновления чаще всего вводит администратора Linux в заблуждение, поэтому её важно описать. Все приведённые ниже команды, форматы уведомлений и даты поддержки проверены по странице безопасности FreeBSD и справочным страницам проекта в августе 2026 года.
Перед командами нужно сделать одно замечание. FreeBSD не устанавливает sudo в базовую систему. Для всех описанных действий требуются права root. Используйте su - либо сначала установите из пакетов sudo или doas.
Базовая система и пакеты — это отдельные среды
В Ubuntu apt управляет всей системой. Ядро, openssl, nginx и собственные инструменты поставляются как .deb файлы из одного инструмента, а apt upgrade обновляет их одновременно.
FreeBSD разделяет это на две части. Базовая система собирается как единое целое и версионируется как единое целое: 15.1-RELEASE-p3 — это один номер, который охватывает ядро, библиотеку C, sshd и копию OpenSSL в /usr/lib. Ничего из этого не поступает из pkg. Всё остальное находится в /usr/local, устанавливается как бинарный пакет, собранный из дерева ports, и имеет собственную версию.
Поэтому в одной системе могут находиться две копии OpenSSL: базовая копия в /usr/lib, которую исправляет только freebsd-update, и пакетная копия в /usr/local/lib, которую исправляет только pkg. Программа использует ту копию, с которой она была слинкована, а программное обеспечение, установленное из пакетов, обычно линкуется с пакетной копией. Исправление одной копии ничего не меняет в другой.
Три команды показывают текущее состояние системы:
freebsd-version -u
freebsd-version -k
uname -rfreebsd-version -u выводит уровень исправлений установленной пользовательской среды. freebsd-version -k выводит уровень исправлений установленного ядра, а freebsd-version(1) явно объясняет, почему это не то же самое, что uname: «если новое ядро установлено, но система ещё не перезагружена, freebsd-version выведет версию и уровень исправлений нового ядра». uname -r выводит ядро, которое запущено прямо сейчас. Есть также freebsd-version -r. Она выводит запущенное ядро, но «не зависит от переменных среды». Это важно внутри jail, где UNAME_r часто имеет другое значение.
Уведомления о безопасности и исправления ошибок
Команда FreeBSD Security Team выпускает уведомления двух типов. Они обозначают разные проблемы.
Security Advisory описывает уязвимость в системе base. Идентификатор выглядит так: FreeBSD-SA-26:55.elf. Он состоит из букв SA, двух последних цифр года, порядкового номера уведомления в этом году и затронутого компонента. Уведомления FreeBSD-SA-26:52.if_wg и FreeBSD-SA-26:50.kqueue были опубликованы 2026-07-29. Полный список находится на странице уведомлений FreeBSD о безопасности.
Errata Notice описывает проблему корректности или стабильности, которую необходимо исправить в ветке выпуска, но которая не связана с безопасностью. Формат тот же, но вместо SA используется EN: FreeBSD-EN-26:19.zfs, FreeBSD-EN-26:18.tzdata. Классический пример — обновление данных часовых поясов. Устаревшие данные часовых поясов нельзя использовать для атаки, но до установки исправления временные метки будут неправильными. Список Errata находится на странице уведомлений FreeBSD об исправлениях ошибок.
Оба типа уведомлений подписываются PGP-ключом Security Officer и хранятся в архиве по адресу security.FreeBSD.org. На вашу машину оба типа доставляются через freebsd-update.
Здесь Linux-администраторы часто ошибаются. Ни один из этих типов уведомлений не относится к пакетам. На странице безопасности это прямо указано: проблемы в FreeBSD Ports Collection «рассматриваются отдельно в документе FreeBSD VuXML». Удалённая уязвимость в пакете nginx никогда не получит номер SA. Если вы отслеживаете только ленту уведомлений о безопасности, вы никогда о ней не узнаете.
Как получать уведомления об обновлениях безопасности FreeBSD?
Подпишитесь на список freebsd-security-notifications. Он модерируется и имеет небольшой объём сообщений. В нём публикуются сами уведомления о безопасности и сообщения об исправлениях. Подписаться можно на сайте lists.freebsd.org.
Список freebsd-announce также модерируется. В нём публикуются уведомления о безопасности и объявления о выпусках. Он подходит, если вы хотите получать всё в одном списке. freebsd-security — список для обсуждений. Его полезно читать, но уведомления о необходимости установить обновления публикуются не там.
Все эти списки содержат только новости базовой системы. Информация об уязвимостях пакетов по электронной почте не рассылается. Её нужно получать с помощью команды.
pkg audit и база данных, которая стоит за ним
VuXML (Vulnerabilities and Exposures Markup Language) — это реестр проблем безопасности в ports и пакетах проекта FreeBSD. В каждой записи указаны затронутый пакет, уязвимые диапазоны версий, идентификаторы CVE (common vulnerabilities and exposures) и краткое описание. Весь набор записей доступен в индексе VuXML, где их можно сортировать по пакету, CVE или дате.
pkg audit — это инструмент, который читает эту базу:
pkg audit -F-F перед проверкой загружает свежую копию базы данных. Используйте этот ключ каждый раз. Без -F выполняется сравнение с копией, которая уже есть на машине. Она может не обновляться несколько месяцев, поэтому чистый результат ничего не означает. Команда сравнивает версии всех установленных пакетов со всеми записями VuXML, выводит каждое совпадение с номерами CVE и ссылкой на страницу VuXML, а затем добавляет строку с числом найденных проблем и количеством затронутых установленных пакетов.
Стоит знать ещё два ключа из pkg-audit(8). pkg audit -r также «выводит пакеты, которые зависят от уязвимых пакетов и поэтому тоже могут быть уязвимы». Так можно выяснить, что уязвимая библиотека важна, потому что с ней связаны шесть установленных компонентов. pkg audit -R выводит тот же результат в JSON или другом машинном формате. Этот вывод можно передать проверке системы мониторинга.
Пакет pkg устанавливает периодический скрипт в /usr/local/etc/periodic/security/410.pkg-audit. Скрипт запускается как часть ежедневной проверки безопасности и отправляет результат по почте пользователю root. Убедитесь, что он включён, проверив строку в /etc/periodic.conf:
daily_status_security_pkgaudit_enable="YES"Это ежедневное письмо — ближайший аналог автоматической установки обновлений без участия администратора в Ubuntu. Разница здесь принципиальна: unattended-upgrades устанавливает исправление, пока вы спите, а pkg audit только сообщает, что исправление необходимо. pkg audit формирует отчёты. Он не устанавливает исправления. В стандартной системе FreeBSD обновления безопасности не устанавливаются без вашего участия.
Исправление уязвимого пакета
pkg update
pkg upgradeВ репозиториях пакетов FreeBSD нет отдельного репозитория только для обновлений безопасности. Ubuntu может получать пакеты только из noble-security, оставляя все остальные пакеты без изменений. В FreeBSD эквивалента нет. Поэтому исправление одного уязвимого пакета означает установку версии, которую сейчас предлагает репозиторий, а также всех зависимостей, обновившихся вместе с ним. Планируйте обновление пакетов как изменение конфигурации, а не как фоновую задачу.
От выбранной ветки репозитория зависит скорость получения исправления. По умолчанию используется quarterly-ветка. В handbook указано, что она обеспечивает «более предсказуемую и стабильную работу», принимая только обновления без новых функций. latest-ветка получает самые новые версии всех пакетов. Поэтому если pkg audit -F сообщает, что пакет уязвим, а pkg upgrade говорит, что выполнять нечего, исправление ещё не попало в вашу ветку. Именно это вызывает такое расхождение.
Чтобы перевести систему на latest-ветку, скопируйте файл репозитория, поставляемый вместе с системой, и отредактируйте копию:
mkdir -p /usr/local/etc/pkg/repos
cp /etc/pkg/FreeBSD.conf /usr/local/etc/pkg/repos/FreeBSD.confЗамените quarterly на latest в строке url копии, затем выполните pkg update -f, чтобы получить новый каталог пакетов. Копируйте файл, а не вводите имя репозитория по памяти: имя в /etc/pkg/FreeBSD.conf — это имя, которое фактически использует ваша система, а файл в /usr/local/etc/pkg/repos переопределяет только репозиторий с точно таким же именем.
Применение исправлений базовой системы
freebsd-update fetch
freebsd-update installfetch загружает исправления для текущего выпуска и выводит список файлов, которые будут изменены. Если обновлять нечего, команда выводит No updates needed to update system to 15.1-RELEASE-p3. и завершает работу. Если обновления есть, команда завершает работу с указанием выполнить команду установки. Обновления не применяются, пока вы не выполните freebsd-update install, поэтому fetch можно безопасно запускать в любое время.
freebsd-update(8) предоставляет бинарные обновления для версий ALPHA, BETA, RC и RELEASE, но не для PRERELEASE, STABLE или CURRENT. Если вы используете stable/15, систему нужно собирать из исходного кода, поэтому этот инструмент вам не подходит.
Автоматизируйте загрузку, но выполняйте установку вручную. Строка из руководства для /etc/crontab:
@daily root freebsd-update cronfreebsd-update cron ожидает случайный промежуток времени от 1 до 3600 секунд, затем загружает обновления точно так же, как fetch, и отправляет сообщение пользователю root, если доступны ожидающие установки обновления. Случайная задержка нужна, чтобы все машины FreeBSD в Интернете не обращались к зеркалам обновлений в одну и ту же секунду.
Вывод содержит 2 момента, которые часто сбивают с толку. src component not installed, skipped — это нормально для сервера без дерева исходного кода, и ошибкой не является. Набор компонентов задаётся строкой Components в файле /etc/freebsd-update.conf. Допустимые варианты: src, world и kernel.
Если установка завершилась ошибкой, freebsd-update rollback удаляет последние установленные обновления. В системе с корневой файловой системой на ZFS можно поступить надёжнее и заранее создать boot environment:
bectl create pre-patch
freebsd-update fetch installЕсли система с установленными исправлениями не загружается, выберите старый boot environment в меню загрузчика. После этого система вернётся в исходное состояние. Такая возможность восстановления — одна из практических причин использовать ZFS в качестве корневой файловой системы. Пока два окружения не разошлись, дополнительное место на диске почти не требуется.
Поддерживается ли моя версия FreeBSD?
Каждый выпуск поддерживается в течение фиксированного периода. Этот период опубликован в виде таблицы веток на странице безопасности. По состоянию на August 2026 таблица выглядит так:
releng/15.1, то есть 15.1-RELEASE, до 31 March 2027releng/15.0, то есть 15.0-RELEASE, до 30 September 2026releng/14.4, то есть 14.4-RELEASE, до 31 December 2026stable/15до 31 December 2029stable/14до 30 November 2028
Промежуточные выпуски поддерживаются недолго. Срок поддержки 15.0-RELEASE истекает примерно через семь недель после публикации этой статьи, потому что вышел 15.1, и для 15.0 начался отсчёт. Стабильные ветки поддерживаются годами. Это ветки исходного кода, которые freebsd-update не обслуживает.
Проверьте свою версию с помощью freebsd-version -u и сравните результат с таблицей. Команда freebsd-update также выводит предупреждение. При приближении даты fetch выводит:
WARNING: FreeBSD 15.0-RELEASE is approaching its End-of-Life date.
It is strongly recommended that you upgrade to a newer
release within the next 2 months.После наступления этой даты предупреждение меняется на WARNING: FreeBSD 15.0-RELEASE HAS PASSED ITS END-OF-LIFE DATE. Неподдерживаемый выпуск продолжает работать. Он перестаёт получать уведомления о безопасности. Это означает, что устранение следующей уязвимости в базовой системе становится вашей постоянной задачей.
Обновление до следующего выпуска выполняется так: freebsd-update -r 15.1-RELEASE upgrade, затем freebsd-update install, затем перезагрузка, затем freebsd-update install во второй раз, затем pkg-static upgrade -f для переустановки всех пакетов с учётом новых библиотек, а затем финальная команда freebsd-update install. В руководстве указано, что вместо трёх этапов установки может быть только два. Это зависит от того, изменялись ли номера версий библиотек. Запланируйте окно обслуживания и перед началом работы ознакомьтесь с руководством по настройке сервера FreeBSD 15.
Перезагрузка или достаточно перезапустить сервис?
FreeBSD позволяет ответить на этот вопрос одним сравнением:
freebsd-version -k
uname -rfreebsd-version -k — это kernel на диске. uname -r — это kernel в памяти. Разные строки означают, что установлен новый kernel, но система его ещё не использует. В этом случае выполните перезагрузку. Одинаковые строки означают, что патч не затронул kernel и перезагрузка ничего не даст.
После установки патча для userland перезапустите все процессы, которые используют изменённый код. Исправление в базовой библиотеке OpenSSL в /usr/lib ничего не изменит для sshd, запущенного три недели назад и до сих пор использующего старую библиотеку, отображённую в его адресное пространство. Файл на диске уже новый. Запущенный процесс — нет.
service sshd restartТо же правило действует для пакетов. pkg upgrade заменяет бинарный файл на диске, пока запущенный процесс продолжает использовать старую версию, поэтому service nginx restart — это шаг, который фактически применяет исправление.
В базовой системе нет аналога Debian needrestart, поэтому система не выводит подсказки и не ведёт такой список. Отслеживайте, какие сервисы связываются с каждой обновлённой библиотекой, либо выполняйте перезагрузку после любого патча, затрагивающего базовые библиотеки. На сервере с конфигурацией под контролем системы управления версиями перезагрузка — обычная операция. Это намного дешевле, чем считать систему обновлённой, когда на самом деле это не так.
Исправление уязвимостей на машине с jail
Jail использует ядро хоста, поэтому рекомендация по обновлению ядра относится к хосту, а уязвимость наследует каждый jail на этой машине. Установите обновления на хосте и перезагрузите его — после этого часть, связанная с ядром, будет исправлена для всех jail. Userland внутри каждого jail представляет собой отдельную установку со своим уровнем обновлений, который хост показывает с помощью freebsd-version -j <jail>. Пакеты внутри jail также являются отдельными, а pkg -j <jail> audit -F проверяет их без входа в jail. Такое разделение общего ядра и отдельного userland — то же структурное различие, которое определяет сравнение jail с Docker-контейнерами.
Перевод для Ubuntu
Для каждой привычки FreeBSD есть аналог, поэтому этот порядок действий можно применять в обеих системах.
- Исправления базовой системы: сначала
freebsd-update fetch, затемfreebsd-update install. В Ubuntu используетсяapt update && apt upgrade, которая сразу охватывает базовую систему и всё остальное. - Стороннее программное обеспечение: в FreeBSD используется
pkg update && pkg upgrade. В Ubuntu снова используетсяapt. - Проверка известных уязвимостей: в FreeBSD используется
pkg audit -F. В Ubuntu 24.04 ближайшая команда —pro security-status. Она показывает обновления безопасности для установленных пакетов, включая содержимое Expanded Security Maintenance. - Автоматическая установка:
unattended-upgradesв Ubuntu самостоятельно устанавливает обновления безопасности. В FreeBSD нет прямого аналога, поэтомуfreebsd-update cronзагружает и отправляет сообщения по электронной почте, а устанавливать обновления приходится вручную. - Лента уведомлений:
freebsd-security-notificationsсодержит записи FreeBSD-SA и FreeBSD-EN.ubuntu-security-announceсодержит Ubuntu Security Notices. - База данных уязвимостей: VuXML для портов и пакетов FreeBSD. Для пакетов Ubuntu используется Ubuntu CVE tracker.
- Проверка необходимости перезагрузки: в FreeBSD —
freebsd-version -kиuname -r. В Ubuntu — наличие/var/run/reboot-required. - Период поддержки: таблица веток на странице безопасности FreeBSD. В Ubuntu — график выпусков и
pro security-status.
Основной порядок действий в обеих системах одинаков: подписаться на ленту, запускать аудит по расписанию, а затем решать, что устанавливать и когда выполнять перезапуск. В FreeBSD вторую часть приходится выполнять явно, поскольку система не делает этого самостоятельно. В разделе Более широкое сравнение Linux и FreeBSD как серверных платформ описаны другие изменения, с которыми вы столкнётесь при переносе рабочей нагрузки между этими системами.
FAQ
Исправляет ли freebsd-update также установленные пакеты?
Нет. freebsd-update охватывает только базовую систему, то есть ядро и пользовательское окружение, поставляемые с выпуском. Программное обеспечение, установленное в /usr/local, поступает из пакетов и исправляется с помощью pkg upgrade. Выполните pkg audit -F, чтобы узнать, в каких установленных пакетах есть известные уязвимости: рекомендации по безопасности базовой системы их не упоминают, а списки рассылки по безопасности о них не сообщают.
Как определить, требуется ли перезагрузка после обновления FreeBSD?
Сравните freebsd-version -k и uname -r. Первая команда выводит ядро, установленное на диске, в том числе ядро, которое только что записано, но ещё не загружалось. Вторая команда выводит запущенное ядро. Разные строки означают, что нужна перезагрузка. Совпадающие строки означают, что исправления затронули только пользовательское окружение. В этом случае вместо перезагрузки перезапустите затронутые сервисы, например service sshd restart, поскольку запущенный процесс продолжает использовать старую библиотеку, пока не будет перезапущен.
В чём разница между Security Advisory и Errata Notice?
Security Advisory, например FreeBSD-SA-26:55.elf, устраняет уязвимость в базовой системе. Errata Notice, например FreeBSD-EN-26:18.tzdata, исправляет проблему корректности или стабильности, не связанную с безопасностью, например устаревшие данные часовых поясов. Оба типа уведомлений используют формат: год, двоеточие, порядковый номер, компонент. Оба подписываются Security Officer и доставляются через freebsd-update. Ни один из них не охватывает программное обеспечение, установленное из ports или пакетов.
Есть ли в FreeBSD аналог unattended-upgrades?
В базовой системе такого механизма нет. freebsd-update cron загружает доступные исправления базовой системы и отправляет уведомление root, но не устанавливает их. Скрипт periodic, который устанавливает pkg, ежедневно запускает pkg audit и отправляет результат по почте, но ничего не обновляет. Автоматическую установку нужно реализовать самостоятельно с помощью задания cron. Кроме того, обновление пакета FreeBSD устанавливает новейшую версию, а не backport только исправления безопасности. Поэтому большинство администраторов просматривают уведомления и устанавливают обновления вручную.
Как проверить, поддерживается ли ещё мой выпуск FreeBSD?
Выполните freebsd-version -u, чтобы узнать версию пользовательского окружения, затем сравните её с таблицей поддерживаемых веток на странице безопасности FreeBSD. Для точечных выпусков предусмотрены короткие периоды поддержки: по состоянию на August 2026 поддержка 15.0-RELEASE заканчивается 30 September 2026, а 15.1-RELEASE продолжается до 31 March 2027. freebsd-update fetch предупреждает о приближении этой даты. После её наступления команда выводит строку о том, что выпуск HAS PASSED ITS END-OF-LIFE DATE. После этого на данный выпуск больше не распространяются рекомендации по безопасности.