Применение обновлений безопасности - важный момент в сопровождении программного обеспечения, особенно такого как операционная система. Для FreeBSD этот процесс не был простым в течение долгого времени. На исходный код нужно было накладывать патчи, перестраивать код в двоичные файлы, а затем эти двоичные файлы требовалось переустановить.
Теперь это давно не так, и FreeBSD включает программу с простым
названием freebsd-update
. Эта программа
предоставляет две различные функции. Во-первых, она позволяет
применить к базовой системе FreeBSD обновления безопасности и критические
исправления в двоичном виде, без необходимости сборки и установки.
Во-вторых, программа поддерживает обновление системы со сменой
старшего или младшего номера версии.
Двоичные обновления доступны для всех архитектур и версий,
поддерживаемых группой безопасности; тем не менее, для работы
некоторых из возможностей, таких как смена версии операционной
системы FreeBSD, требуется последняя версия freebsd-update(8)
и по крайней мере FreeBSD 6.3. Перед обновлением до новой версии
следует ознакомиться с объявлением о выпуске текущей версии, так
как там может содержаться важная информация, применимая к версии,
на которую намечен переход. С соответствующими объявлениями можно
ознакомиться, перейдя по следующей ссылке: http://www.FreeBSD.org/releases/
.
Если имеется задание crontab
, запускающее
freebsd-update
, то перед началом выполнения
следующих действий его обязательно нужно выключить.
Некоторые пользователи могут пожелать изменить конфигурационный файл для лучшего контроля над процессом обновления. Все параметры подробно задокументированы, но для некоторых из них может понадобиться дополнительное разъяснение:
# Components of the base system which should be kept updated. Components src world kernel
Данный параметр определяет, какие части FreeBSD будут обновлены.
По умолчанию обновляется исходный код (src), вся базовая система
(world) и ядро (kernel). Компоненты те же самые, что и во время
установки; в частности, добавление "world/games" позволяет
обновить игры. Использование "src/bin" позволяет обновить
исходный код в src/bin
.
Лучшим вариантом будет оставить всё как есть, поскольку изменение этого перечня с целью добавления особых пунктов потребует от пользователя указания подряд всех пунктов, которые пользователь захочет обновить. Это может привести к негативным последствиям из-за возможной рассинхронизации между исходными текстами и двоичными файлами.
# Paths which start with anything matching an entry in an IgnorePaths # statement will be ignored. IgnorePaths
Добавьте сюда пути к каталогам (например, /bin
или /sbin
), которые вы хотели бы
оставить нетронутыми в процессе обновления. Этот параметр можно
использовать для предотвращения перезаписывания локальных
изменений программой freebsd-update
.
# Paths which start with anything matching an entry in an UpdateIfUnmodified # statement will only be updated if the contents of the file have not been # modified by the user (unless changes are merged; see below). UpdateIfUnmodified /etc/ /var/ /root/ /.cshrc /.profile
Обновлять конфигурационные файлы в указанных каталогах, только
если они не содержат изменений. При наличии каких-либо изменений
со стороны пользователя автоматическое обновление таких файлов
отменяется. Есть другой параметр
KeepModifiedMetadata
, который предписывает
команде freebsd-update
сохранять изменения во
время процесса слияния.
# When upgrading to a new FreeBSD release, files which match MergeChanges # will have any local changes merged into the version from the new release. MergeChanges /etc/ /var/named/etc/
Список каталогов с конфигурационными файлами, для которых
freebsd-update
попытается выполнить слияние.
Процесс слияния файла представляет собой набор изменений
в формате diff(1), похож на mergemaster(8), но с
меньшим количеством параметров: результат слияния принимается,
открывается редактор или freebsd-update
прекращает свою работу. В случае сомнений сделайте резервную
копию /etc
и просто
согласитесь со всеми изменениями. Для получения подробной
информации по команде mergemaster
смотрите
Раздел 21.6.11.1, <<mergemaster
>>.
# Directory in which to store downloaded updates and temporary # files used by FreeBSD Update. # WorkDir /var/db/freebsd-update
Этот каталог предназначен для размещения патчей и временных файлов. В случае, когда пользователь выполняет обновление со сменой версии, в этом месте должен иметь по крайней мере гигабайт дискового пространства.
# When upgrading between releases, should the list of Components be # read strictly (StrictComponents yes) or merely as a list of components # which *might* be installed of which FreeBSD Update should figure out # which actually are installed and upgrade those (StrictComponents no)? # StrictComponents no
Если выставлено значение yes
, то
freebsd-update
будет исходить из того, что
список Components
является полным, и не будет
пытаться выполнить изменения за пределами этого списка.
В действительности freebsd-update
попытается
обновить все файлы, которые принадлежат списку
Components
.
Обновления безопасности хранятся на удалённой машине и могут быть загружены и установлены с использованием следующей команды:
#
freebsd-update fetch
#
freebsd-update install
Если были установлены обновления ядра, то после этого
нужно перезагрузить систему. Если все пошло хорошо, система
должна быть с установленными исправлениями, и
freebsd-update
можно запускать в качестве ночного
задания cron(8). Для этого достаточно добавить следующую
запись в /etc/crontab
:
@daily root freebsd-update cron
Эта запись означает, что freebsd-update
будет
запускаться ежедневно. В данном случае, в соответствии с аргументом
cron
freebsd-update
ограничится
проверкой доступных обновлений. В случае наличия обновлений они
будут автоматически загружены и сохранены на локальном диске.
Пользователю root
будет отправлено
соответствующее письмо, так что эти обновления можно будет
установить самостоятельно.
На случай, если что-то пошло не так, в
freebsd-update
предусмотрен механизм возврата
последнего набора изменений с использованием следующей команды:
#
freebsd-update rollback
Если после завершения всех действий было изменено ядро или какой-либо из его модулей, система должна быть перезагружена. Это позволит FreeBSD загрузить новые двоичные файлы в память.
Команда freebsd-update
работает только
с ядром GENERIC
. Если в
GENERIC
присутствуют изменения или
используется собственная конфигурация ядра,
freebsd-update
завершится неудачно.
Этот процесс удаляет старые объектные файлы и библиотеки, что может нарушить работу большинства сторонних приложений. Все установленные порты рекомендуется либо удалить и переустановить заново, либо обновить с использованием программы ports-mgmt/portupgrade. Большинство пользователей предпочтут выполнить тестовое построение, запустив для этого следующую команду:
#
portupgrade -af
Это позволит убедиться в том, что всё будет переустановлено
правильно. Обратите внимание, что если переменной окружения
BATCH
присвоить значение yes
,
то на все вопросы в течение этого процесса будет возвращаться
ответ yes
, что позволит исключить необходимость
ручного вмешательства в процесс построения.
Обновления со сменой старшей и младшей версий можно выполнить,
указав значение версии, на которую будет произведен переход, в
качестве аргумента команды freebsd-update
.
Так, например, можно выполнить обновление до версии
FreeBSD 6.3:
#
freebsd-update -r 6.3-RELEASE upgrade
После своего запуска freebsd-update
анализирует содержимое конфигурационного файла и собирает
необходимую для проведения обновления информацию о текущей
установленной системе. На экран будет выдан перечень компонентов,
которые удалось и не удалось обнаружить установленными.
Например:
Looking up update.FreeBSD.org mirrors... 1 mirrors found. Fetching metadata signature for 6.3-BETA1 from update1.FreeBSD.org... done. Fetching metadata index... done. Inspecting system... done. The following components of FreeBSD seem to be installed: kernel/smp src/base src/bin src/contrib src/crypto src/etc src/games src/gnu src/include src/krb5 src/lib src/libexec src/release src/rescue src/sbin src/secure src/share src/sys src/tools src/ubin src/usbin world/base world/info world/lib32 world/manpages The following components of FreeBSD do not seem to be installed: kernel/generic world/catpages world/dict world/doc world/games world/proflibs Does this look reasonable (y/n)? y
Следующим шагом freebsd-update
попытается
загрузить по сети файлы, необходимые для выполнения обновления.
В некоторых случаях может потребоваться ответить на вопросы
относительно того, что и как устанавливать.
После того, как все изменения были загружены, они будут
применены. Этот процесс может занять определённое время, в
зависимости от производительности и текущей загруженности
компьютера. Затем будет выполнено слияние конфигурационных файлов
- эта часть процесса требует от пользователя определённого
вмешательства, так как для файла можно выполнить слияние
автоматически, а можно открыть текстовый редактор для слияния
вручную. Результат успешного слияния будет показан на экране.
Неудачное или пропущенное слияние вызовет преждевременное завершение
программы. Можно подготовить резервную копию каталога /etc
для таких важных файлов как
master.passwd
и group
и
выполнить их слияние вручную позднее.
На данном этапе система еще не модифицирована, и все изменения и слияния происходят в отдельном каталоге. Теперь, когда все изменения успешно применены, все конфигурационные файлы слиты и кажется, что процесс должен пройти плавно, пользователь должен установить изменения.
После завершения этого процесса, изменения могут быть установлены на диск с помощью следующей команды.
#
freebsd-update install
В первую очередь изменения будут применены к ядру и его модулям. После этого компьютер должен быть перезагружен. Следующая команда выполнит перезагрузку компьютера, после чего будет загружено новое ядро:
#
shutdown -r now
После перезагрузки нужно повторно запустить команду
freebsd-update
. Команда прочитает, на каком
этапе она находится, и перейдёт к удалению старых объектных файлов
и совместно используемых библиотек. Чтобы перейти к этому этапу,
выполните следующую команду:
#
freebsd-update install
Количество этапов установки обновлений может быть два вместо трёх и зависит от того, были ли изменены номера версий каких-либо совместно используемых библиотек.
Теперь понадобится пересобрать и переустановить всё стороннее программное обеспечение. Это необходимая операция, так как установленное программное обеспечение может зависеть от библиотек, которые были удалены в процессе смены версии операционной системы. Для автоматизации этого процесса можно воспользоваться командой ports-mgmt/portupgrade. Начать можно со следующих команд:
#
portupgrade -f ruby
#
rm /var/db/pkg/pkgdb.db
#
portupgrade -f ruby18-bdb
#
rm /var/db/pkg/pkgdb.db /usr/ports/INDEX-*.db
#
portupgrade -af
После этого завершите процесс обновления последним запуском
freebsd-update
. Выполните следующую команду,
чтобы убедиться, что ничего не забыто в процессе обновления:
#
freebsd-update install
Перезагрузите компьютер с новой версией FreeBSD. На этом процесс завершён.
Утилита freebsd-update
может быть
использована для проверки состояния установленной версии FreeBSD
относительно известной хорошей копии. Оценивается текущая версия
системных утилит, библиотек и конфигурационных файлов. Для того,
чтобы начать сравнение, выполните следующую команду:
#
freebsd-update IDS >> outfile.ids
Не смотря на то, что команда называется
IDS, это ни в коей мере не должно являться
заменой системе обнаружения вторжений, такой как security/snort. Поскольку
freebsd-update
сохраняет свои данные на
диске, возможность подмены становится очевидной. И хотя эта
возможность может быть уменьшена при использовании настройки
kern.securelevel
, а также используя для
записи данных freebsd-update
файловую
систему, которая в остальное время смонтирована только на
чтение, лучшим решением будет сравнить систему относительно
эталона на физически защищенном носителе, таком как
DVD или внешний USB диск
с включённой защитой от записи.
Теперь запустится проверка системы, в результате которой будет
выведен список файлов с их контрольными суммами в sha256(1) с
известным значением для файла из релиза и значением для текущего
в системе. Результат выводится слишком быстро для наглядного
сравнения и вскоре заполняет консольный буфер. По этой причине в
данном примере вывод перенаправлен в файл
outfile.ids
.
Эти строки также очень длинные, но зато такой формат вывода удобен для разбора. Так, для получения списка всех отличающихся от релиза файлов достаточно выполнить такую команду:
#
cat outfile.ids | awk '{ print $1 }' | more
/etc/master.passwd /etc/motd /etc/passwd /etc/pf.conf
Вывод специально обрезан, на самом деле файлов намного больше.
Некоторые из них изменены в ходе нормальной работы: так, файл
/etc/passwd
был изменён после заведения
пользователей в системе. В некоторых случаях могут быть и другие
файлы, такие как модули ядра, которые могли измениться вследствие
обновления через freebsd-update
. Для
исключения из проверки конкретных файлов и каталогов укажите их
в качестве значения параметра IDSIgnorePaths
в /etc/freebsd-update.conf
.
Эта система может использоваться как часть более сложной процедуры обновления, в отличие от описанного выше способа.
Этот, и другие документы, могут быть скачаны с http://ftp.FreeBSD.org/pub/FreeBSD/doc/.
По вопросам, связанным с FreeBSD, прочитайте
документацию прежде чем писать в
<questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите в рассылку
<doc@FreeBSD.org>.