33.2. FreeBSD Update

La aplicación de parches de seguridad es una parte importante del mantenimiento del software. Durante mucho tiempo en FreeBSD este proceso no era precisamente de los más sencillos. Había que aplicar los parches al código fuente, recompilarlo para convertirlo en binarios y después reinstalar esos binarios.

Ahora todo ha cambiado, FreeBSD ha incorporado una herramienta fácil de usar llamada freebsd-update. Esta herramienta tiene dos funciones. La primera es permitir la aplicación de actualizaciones de seguridad y erratas sin los pasos compilar e instalar. La segunda es poder aplicar actualizaciones de versión mayores y menos.

Nota: Hay actualizaciones binarias para todas las arquitecturas y versiones de FreeBSD soportadas por el equipo de seguridad; no obstante, ciertas características (como las actualizaciones del sistema operativo, hacen imprescindible la última versión de freebsd-update(8) y FreeBSD 6.3 o superior. Antes de actualizar a una nueva release consulte los avisos de la release actual; es posible que contenga información de su interés. Puede encontrar estos anuncios aquí: http://www.FreeBSD.org/releases/.

Si está usando crontab con freebsd-update tendrá que dejar de hacerlo antes de proseguir con lo que vamos hacer. Puede instalar la última versión de freebsd-update: descargue el tar.gz de la suguienteURL e instálelo del siguiente modo:

# gunzip -c freebsd-update-upgrade.tgz | tar xvf -
# mv freebsd-update.sh /usr/sbin/freebsd-update
# mv freebsd-update.conf /etc

No es necesario actualizar freebsd-update en las releases actuales.

33.2.1. El fichero de configuración

Algunos usuarios pueden querer retocar el fichero de configuración para controlar mejor el proceso. Las opciones disponibles están muy bien documentadas pero hay unas pocas, que veremos a continuación, que quizás necesiten una explicación un poquito más más detallada.

# Components of the base system which should be kept updated.
Components src world kernel

Es decir:

# Componentes del sistema base que deben mantenerse actualizados.
Components src world kernel

Este parámetro controla qué partes de FreeBSD deben actualizarse. Por omisión se actualiza el código fuente del sistema, el sistema base y el kernel. Los componentes posibles son los mismos que se ofrecen durante la instalación, es decir, que si se incluye en la lista de componentes a actualizar «world/games» se actualizaría la distribución «games». Si se incluye «src/bin» actualizará el código fuente bajosrc/bin.

Lo más razonable es dejar éste parámetro tal y como está, puesto que modificarlo de cualquier obligará al usuario a incluir en la lista todos y cada uno de los elementos que quiera actualizar, lo cual puede tener consecuencias desastrosas si el código fuente y los binarios dejan de estar sincronizados.

# Paths which start with anything matching an entry in an IgnorePaths
# statement will be ignored.
IgnorePaths

Es decir:

# Las rutas que estén detrás de IgnorePaths serán ignoradas.
IgnorePaths

Puede incluir como /bin o /sbin para que esos directorios no se toquen durante la actualización si hay en ellos cambios que haya hecho usted.

# 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

Es decir:

# Las rutas que comiencen por algo que esté tras UpdateIfUnmodified solamente
# se actualizarán si el contenido del fichero no ha sido modificado
# por el usuario (salvo que los cambios se hayan importado; siga
# leyendo más abajo.
UpdateIfUnmodified /etc/ /var/ /root/ /.cshrc /.profile

Con esto actualizará los ficheros de configuración que estén en los directorios especificados solamente si no han sido modificados. Cualquier cambio que el usuario pueda hacer en ellos anulará la actualización automática de esos ficheros. Hay otra opción, KeepModifiedMetadata, que le dice a freebsd-update que guarde los cambios que encuentre durante la mezcla de las versiones de los ficheros.

# 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/

Esto es:

# Al actualizar a una nueva release de FreeBSD, en los ficheros que aparezcan
# tras MergeChanges se mezclarán los cambios entre la versión local y la de la nueva release.

MergeChanges /etc/ /var/named/etc/

Lista los directorios con ficheros de configuración en los que freebsd-update debería intentar mezclar cambios locales con los de la nueva versión. El proceso de mezcla consiste en una serie de parches diff(1) similar a ejecutar mergemaster(8) pero con menos opciones: la mezcla se acepta, se abre un editor o freebsd-update se apaga. Si tiene alguna duda haga una copia de seguridad de /etc y acepte la mezcla. Consulte el Capítulo 23 si necesita más información sobre la orden mergemaster.

# Directory in which to store downloaded updates and temporary
# files used by FreeBSD Update.
# WorkDir /var/db/freebsd-update

Esto es:

# Directorios donde descargar actualizaciones y guardar ficheros temporales necesarios para FreeBSD Update.
# WorkDir /var/db/freebsd-update

En este directorio es donde van a parar todos los parches y los ficheros temporales. Cuando el usuario esté haciendo una actualización de versión este directorio puede llegar a ocupar un gigabyte.

# 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

Es decir:

# Durante una actualización entre releases ¿Debe leerse al When upgrading between releases, should the list of Components be
# pie de la letra (StrictComponents yes) o simplemente como una lista
# de componentes que *podrían* instalarse y de las cuales FreeBSD Update
# tendrá que decidir cuáles están instaladas y actualizarlas
# (StrictComponents no)?
# StrictComponents no

Si pone yes freebsd-update asumirá que la lista de Components está completa y no intentará cambiar nada que no esté en ella. Dicho de otro modo, freebsd-update intentará modificar cada fichero que aparezca en la lista Components.

33.2.2. Parches de seguridad

Los parches de seguridad se almacenan en una máquina remota y se pueden descargar e instalar mediante la siguiente orden:

# freebsd-update fetch
# freebsd-update install

Si se ha aplicado algún parche al kernel tendrá que reiniciar. Si todo ha ido bien el sistema el sistema ya está parcheado y freebsd-update puede ejecutarse como trabajo nocturno en cron(8). Esto se hace con una entrada en /etc/crontab:

@daily                                  root    freebsd-update cron

Esta entrada hará que una vez al dia se ejecutará freebsd-update. Al pasarle el argumento cron a freebsd-update solamente intentará saber si existen actualizaciones. Si hay parches disponibles los descargará automáticamente a disco local, pero no los instalará. El usuario root recibirá un correo electrónico avisandole de que puede aplicarlos.

Si algo ha ido mal freebsd-update puede dar marcha atrás al último conjunto de cambios si le da la siguiente orden:

# freebsd-update rollback

Hecho esto el sistema tendrá que reiniciarse si el kernel o cualquier módulo del kernel han sufrido modificaciones. De este modo FreeBSD podrá cargar en memoria los nuevos binarios.

Nota: freebsd-update solamente funciona con el kernel GENERIC. Si hace cualquier cambio a GENERIC o utiliza un kernel personalizado freebsd-update no podrá cumplir su misión: en el primer caso fallará y en el segundo le mostrará un error.

33.2.3. Actualizaciones mayores y menores

Este proceso borrará todos los ficheros de objeto viejos y las librerías que harán fallar la mayoría de las aplicaciones de terceros que tenga en el sistema. Le recomendamos que borre y reinstale todos sus ports o los actualice con ports-mgmt/portupgrade. También le recomendamos que ejecute una compilación de prueba con la siguiente orden:

# portupgrade -af

De esta forma se asegura de uqe todo se reinstalará correctamente. Recuerde que si asigna el valor yes a la variable de entorno BATCH responderá usted que a todas las preguntas que puedan surgir y por tanto requerir intervención manual durante el proceso de compilación.

Las actualizaciones a versiones mayores o menores pueden ejecutarse facilitando a freebsd-update la release a la que queremos llevar al sistema; veamos un ejemplo en el que vamos a actualizar a FreeBSD 6.3:

# freebsd-update -r 6.3-RELEASE upgrade

Una vez que la orden ha sido recibida freebsd-update lee el fichero de configuración y la del sistema para recopilar toda la información necesaria para actualizar el sistema. Se le mostrará una pantalla con una lista con los componentes detectados y tamén con los que no han podido serlo. Veamos un ejemplo:

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

Lo que más o menos vendría a ser:

Buscando réplicas de update.FreeBSD.org ... encontrada 1 réplica.
Descargando firma de metadatos para 6.3-BETA1 from update1.FreeBSD.org... hecho.
Descargando índice de metadatos... hecho.
Inspección del sistema... hecho.

Parece que están instalados los siguientes componentes de FreeBSD:
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

Parece que no están instalados los siguientes componentes:
kernel/generic world/catpages world/dict world/doc world/games
world/proflibs

¿Está de acuerdo? (s/n) s

A partir de aquí freebsd-update intentará descargar todos los ficheros necesarios para la actualización del sistema. En algunos casos le hará preguntas al usuario sobre qué o cómo instalar.

Una vez que todos los parches han sido descargados al disco duro local hay que aplicarlos, es decir, instalarlos. Este proceso puede llevar tiempo dependiendo de la velocidad y la carga de trabajo que esté sacando adelante la máquina. Los ficheros de configuración tendrán que mezclarse: esta parte del proceso requiere intervención del usuario cuando un fichero tenga que ser mezclado, o cuando aparezca un editor en pantalla para que haga una mezcla manual. Los resultados de cada mezcla que concluya satisfactoriamente se irán mostrando al usuario a medida que el proceso vaya avanzando. Si falla o se ignora alguna mezcla el proceso se interrumpirá. Le recomendamos que haga una copia de seguridad de /etc y mezcle manualmente los ficheros importantes (como master.passwd o or group) cuando acabe con la actualización.

Nota: En este punto el sistema sigue sin haber sufrido ningún cambio, pues todo el parcheo y las mezclas están teniendo lugar en un directorio. Cuando todos los parches se hayan aplicado satisfactoriamente, todos los ficheros de configuración hayan sido mezclados y parezca -desde todos los puntos de vista- que el proceso va del todo bien, los cambios tendrán que ser aplicados por el usuario.

Cuando el proceso esté completo la actualización se aplicará al sistema con la siguiente orden:

# freebsd-update install

El kernel y los módulos del kernel se parchean en primer lugar. Tras esto hay que reiniciar la máquina. Debe usar la siguiente orden para reiniciar la máquina y poder así cargar en memoria el nuevo kernel:

# shutdown -r now

Una vez que haya reiniciado el sistema arranque de nuevo freebsd-update. El estado del proceso se ha guardado, así que freebsd-update no empezará desde cero, pero sí que borrará todas las bibliotecas compartidas y ficheros objeto que ya no sean necesarios. Introduzca la siguiente orden:

# freebsd-update install

Nota: Dependiendo de si hay números de versión de bibliotecas que hayan subido habrá dos o tres pasos instalación.

Es necesario recompilar y reinstalar todo el software de terceros. La razón de esto es que el software que tiene instalado puede depender de bibliotecas que van a desaparecer durante el proceso de actualización. Puede utilizar la orden ports-mgmt/portupgrade para automatizar el proceso. Puede usar las siguientes órdenes para comenzar el proceso:

# 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

Una vez terminado esto solamente queda usar una vez más a freebsd-update. Utilice la siguiente orden para concluir el proceso de actualización:

# freebsd-update install

Reinicie la máquina y verá la nueva versión de FreeBSD. El proceso ha terminado.

33.2.4. Comparación de estado del sistema

La orden freebsd-update puede utilizarse para comprobar el estado de una versión instalada de FreeBSD contra una copia confiable. Esta opción compara la versión instalada de las utilidades del sistema, bibliotecas y ficheros de configuración. Para ejecutar la comparación ejecute la siguiente orden:

# freebsd-update IDS >> outfile.ids

AvisoAunque el nombre de la orden sea IDS bajo ningún concepto puede utilizarse como sustituto de un sistema de detección de intrusos [1] como security/snort. Dado que freebsd-update almacena datos en disco las posibilidades de manipulación son evidentes. Puede reducirlas mediante kern.securelevel y guardando los datos de freebsd-update en un medio de solo lectura mientras no estén en uso. O puede hacer algo mejor aún, comparar el sistema con el contenido de un disco seguro, como un DVD o un dispositivo USB almacenado en sitio seguro.

El sistema se va a revisar y se generará una lista de ficheros con sus respectivos valores hash sha256(1). Estos valores son los de la release y de la versión instalada. La salida se envía al fichero outfile.ids porque pasa a una velocidad muy superior a la necesaria para poder leer el texto y muy rápidamente sobrepasa el tamaño del búfer de la consola.

Las líneas del fichero son además extremadamente largas, pero el formato de salida puede manejarse muy fácilmente. Por ejemplo, si quiere obtener una lista de todos los ficheros diferentes de lo que aparece en la release utilice la siguiente orden:

# cat update.ids | awk '{ print $1 }' | more
/etc/master.passwd
/etc/motd
/etc/passwd
/etc/pf.conf

La salida del ejemplo no está completa, hay muchos otros ficheros que diferirán. Algunos de estos ficheros tienen cambios normales, el fichero /etc/passwd es distinto porque se han añadido usuarios nuevos. En ciertos casos puede haber otros ficheros distintos, como módulos del kernel, que serán diferentes porque freebsd-update los habrá actualizado. Si quiere excluir ficheros o directorios específicos use la opción IDSIgnorePaths en /etc/freebsd-update.conf.

Este sistema puede utilizarse como parte de un método muy elaborado de actualización aparte de lo que aquí se ha explicado.

Notas

[1]

IDS son las siglas de sistema de detección de intrusos en inglés: Intrusion Detection System.

Puede descargar éste y muchos otros documentos desde ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Si tiene dudas sobre FreeBSD consulte la documentación antes de escribir a la lista <questions@FreeBSD.org>.
Envíe sus preguntas sobre la documentación a <doc@FreeBSD.org>.