El sistema de parcheado

Como en el resto de Unices, en Solaris un parche se define como un grupo de ficheros y directorios que reemplaza o actualiza ficheros y directorios existentes en el sistema para tratar de garantizar la ejecución correcta del software ([Mic98]); con la instalación de parches aumentamos - al menos teóricamente - la seguridad y la disponibilidad de un sistema, y es muy recomendable seguir una política de parcheado estricta, al menos en cuanto a parches de seguridad se refiere.

Sun Microsystems distribuye entre sus clientes con contrato de mantenimiento los parches para Solaris y el resto de sus productos vía CD-ROM cada pocas semanas, pero - mucho más rápido -, también los ofrece a través de Internet, desde http://sunsolve.sun.com/; aunque el acceso a ciertos parches está restringido a clientes con contrato, los relativos a la seguridad de los sistemas y los recomendados son completamente públicos.

Desde Sun Microsystems, cada parche es referenciado mediante un dos números: un `patch id', que es el realmente el identificador del parche, y un número de revisión del parche, separados ambos por un guión; de esta forma cuando descargamos un parche desde SunSolve y lo descomprimimos, o cuando lo recibimos en un CD-ROM, dicho parche estará contenido en un directorio cuyo nombre es justamente esa referencia:
anita:/var/tmp# ls 110899-01/
README.110899-01  SUNWcsu
anita:/var/tmp#
Dentro del directorio anterior encontraremos generalmente un fichero donde se nos explica la utilidad del parche, los problemas que soluciona y la forma de aplicarlo; además, existirán una serie de subdirectorios cuyos nombres son los paquetes de software a los que ese parche afecta directamente (es decir, de los que sustituye o actualiza directorios o archivos). Como podemos ver, en el ejemplo anterior sólo encontramos uno de estos subdirectorios, SUNWcsu, lo que indica que el parche sólo afectará a ficheros de ese paquete. A su vez, dentro de cada uno de los directorios que diferencian paquetes software encontramos más archivos y subdirectorios que contienen realmente las versiones actualizadas de programas, así como órdenes post-instalación, descripción del software actualizado, información sobre archivos y directorios modificados, etc.

Desde Sun Microsystems se definen cinco modelos básicos de parches; los standard son parches que solucionan un problema software o hardware específico, por lo que si ese problema no afecta a nuestros sistemas no tenemos por qué instalarlos. Los parches recommended son aquellos que Sun recomienda sea cual sea nuestro entorno para prevenir problemas en el futuro, y los security son los que resuelven problemas de seguridad; evidentemente ambos son de instalación casi obligatoria. Un cuarto tipo son los parches Y2K, que como su nombre indica son los que aseguran el cumplimiento con el año 2000 en todos los productos de Sun; a no ser que trabajemos con versiones de software o hardware antiguo, rara vez tendremos que instalar uno de estos parches, ya que los productos más o menos nuevos no han de tener problemas con el año 2000. Finalmente, el quinto tipo de parches son los patch clusters; no son realmente otro modelo, sino que se trata de agrupaciones de los anteriores que se distribuyen en un único archivo para descargarlos e instalarlos más cómodamente: incluyen un script denominado `install_cluster' que instala en el orden adecuado todos los parches del grupo, lo que evita al administrador tener que hacerlo uno a uno.

Para instalar un parche podemos utilizar la orden `patchadd' en Solaris 7 o superior, o
`installpatch'
en la versión 2.6 o anteriores, en ambos casos evidentemente como root del sistema; suele ser recomendable, en función del tipo de parche y su criticidad, situar a la máquina en modo monousuario antes de aplicarlo, para evitar que actividades de los usuarios puedan interferir con el proceso de parcheado. De esta forma, si queremos aplicar el parche anterior (110899-01), los pasos a seguir serían los siguientes:
anita:/var/tmp# who -r
   .       run-level S  Jun  8 06:37     S      0  ?
anita:/var/tmp# unzip 110899-01.zip
anita:/var/tmp# patchadd 110899-01/

Checking installed patches...
Verifying sufficient filesystem capacity (dry run method)...
Installing patch packages...

Patch number 110899-01 has been successfully installed.
See /var/sadm/patch/110899-01/log for details

Patch packages installed:
  SUNWcsu

anita:/var/tmp#
Muchos parches necesitan un reinicio del sistema para aplicarse correctamente, en especial aquellos que modifican algún parámetro del núcleo de Solaris; si instalamos bloques de parches más o menos grandes, como los Maintenance Updates o los Recommended and Security, el reinicio es casi seguro.

Para comprobar qué parches para el operativo tenemos instalados en una máquina podemos utilizar las órdenes `showrev -p' o `patchadd -p':
anita:/# showrev -p |grep 110899-01
Patch: 110899-01 Obsoletes:  Requires:  Incompatibles:  Packages: SUNWcsu
anita:/#
Es importante resaltar lo de `para el operativo', ya que estas órdenes no muestran en ningún caso los parches aplicados a la OBP; además, hemos de tener presente que si un parche necesita que se reinicie el sistema, `showrev' nos dirá que está instalado, pero aunque la orden no muestre ningún mensaje de error, el parche no tendrá efecto hasta el siguiente reinicio de la máquina. Siguiendo con nuestro ejemplo para ver la información que se nos muestra de cada parche, podemos ver que el parche que hemos instalado afecta al paquete SUNWcsu (algo que ya sabíamos), no deja obsoletas a versiones anteriores, no necesita que esté aplicado otro parche para poder instalarse, y tampoco tiene incompatibilidades.

Si por cualquier motivo deseamos eliminar del sistema un parche que hemos instalado con anterioridad podemos usar la orden `patchrm' en Solaris 7 o superior, o `backoutpatch' si utilizamos versiones más antiguas. Esto restaurará el estado que poseía el sistema - en cuanto a ficheros y directorios - antes de aplicar el parche:
anita:/# who -r
   .       run-level S  Jun  8 06:37     S      0  ?
anita:/# patchadd -p|grep 110899-01
Patch: 110899-01 Obsoletes: Requires: Incompatibles: Packages: SUNWcsu
anita:/# patchrm 110899-01

Checking installed patches...

Backing out patch 110899-01...

Patch 110899-01 has been backed out.

anita:/# patchadd -p|grep 110899-01
anita:/#
El hecho de poder desinstalar un parche con tanta facilidad es debido a que, si no indicamos lo contrario, cuando utilizamos `patchadd' para añadirlo esta orden hace una copia de seguridad de los ficheros y directorios que van a modificar o actualizar, y la guarda en /var/; podemos utilizar la opción `-d' del comando si no queremos esta copia se genere, pero si lo hacemos hemos de tener presente que no podremos desinstalar el parche aplicado: por tanto esto sólo es recomendable en los casos en los que el espacio libre en /var/ sea muy limitado y no tengamos opción de aumentarlo (por ejemplo, ampliando el filesystem o simplemente borrando o comprimiendo archivos).

Sun Microsystems distribuye entre sus clientes con contrato la utilidad PatchDiag, una herramienta realmente útil para mantener al día nuestro nivel de parcheado (y con él, nuestra seguridad); la principal función de este software es determinar el nivel de parcheado de una máquina y compararlo con la lista de parches Recommended and Security de Sun. Esta lista contiene los parches cuya instalación es básica de cara a garantizar la seguridad o el correcto funcionamiento de los sistemas Solaris, y representa los parches que obligatoriamente deben estar instalados en sistemas críticos, como los cortafuegos, si queremos que sean seguros. PatchDiag no aplica estos parches en ningún momento, sino que se limita únicamente a indicar cuáles son necesarios en la máquina donde se ejecuta.
© 2002 Antonio Villalón Huerta