Actualizaciones automáticas con actualizaciones desatendidas en Debian y Ubuntu
Las versiones de Linux se actualizan a menudo, y las actualizaciones de seguridad deben instalarse con prontitud. Debian y Ubuntu utilizan el sistema APT, y aunque es relativamente fácil instalar manualmente todas las actualizaciones pendientes, puede que el administrador no se acuerde de hacerlo o prefiera dormir por la noche en lugar de comprobar si hay actualizaciones. Este artículo se refiere principalmente a las instalaciones en servidores.
Actualizar e instalar paquetes manualmente mediante apt upgrade sigue siendo posible cuando se utiliza unattended-upgrades. Si una actualización iniciada por actualizaciones desatendidas se está ejecutando cuando se utiliza apt desde la línea de comandos, el sistema apt informa al usuario de que ya hay una operación en curso y el usuario debe esperar a que termine antes de continuar con la emisión de comandos apt.
Una forma fácil para administradores ocupados
Instalar actualizaciones desatendidas, comprobar que están activadas y supervisar su funcionamiento a partir de los archivos de registro.
apt install unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades
El comando -dpkg-reconfigure muestra un cuadro de diálogo preguntando si quieres o no descargar e instalar automáticamente actualizaciones de seguridad estables. Comprueba que la respuesta es sí.
unattended-upgrades busca actualizaciones dos veces al día a horas aleatorias, e instala actualizaciones de seguridad estables.
Controla lo que ocurre leyendo los archivos de registro en el directorio /var/log/unattended-upgrades/ y el archivo /var/log/dpkg.log.
Dónde encontrar la documentación
El archivo de configuración /etc/apt/apt.conf.d/50unattended-upgrades tiene documentación en los comentarios. Este documento se refiere a ese archivo a partir de ahora como 50unattended-upgrades.
El archivo readme /usr/share/doc/unattended-upgrades/README.md.gz contiene instrucciones útiles. Puede leerse con el comando zless (disponible en el paquete gzip). Este documento se refiere a ese archivo a partir de ahora como README.
La wiki de Debian tiene una página https://wiki.debian.org/UnattendedUpgrades.
La página de documentación del servidor Ubuntu tiene un capítulo «Actualizaciones automáticas» sobre actualizaciones desatendidas.
Página man de unattended-upgrade, man unattended-upgrade.
Configuración avanzada
Usando la forma fácil te darás cuenta de que no todas las actualizaciones se instalan automáticamente. También es posible que quieras tener más control sobre lo que ocurre automáticamente además de instalar las actualizaciones.
El archivo de configuración /etc/apt/apt.conf.d/50unattended-upgrades tiene documentación incluida en los comentarios, así que lee el archivo para examinar qué configuraciones están disponibles. Es muy útil configurar las actualizaciones desatendidas para que envíen correos electrónicos cuando ocurra algo.
Es importante saber que el archivo de configuración se crea al instalar o actualizar el paquete de actualizaciones desatendidas, por lo que cuando se actualiza el propio actualizaciones desatendidas o cuando se pasa a la siguiente versión del SO, las ediciones realizadas en este archivo provocan conflictos que deben resolverse manualmente. El archivo de documentación README sugiere crear el archivo 52unattended-upgrades-local en lugar de modificar el archivo de configuración original.
Si quieres, puedes comprobar que el archivo /etc/apt/apt.conf.d/20auto-upgrades contiene estas líneas:
APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Unattended-Upgrade "1";
Si ejecutaste el comando -dpkg-reconfigure y respondiste afirmativamente, las líneas deberían estar ahí. Las líneas controlan la activación de las actualizaciones automáticas.
Enviar correo electrónico
Para que funcione el envío de correo electrónico, el host debe tener un sistema de correo electrónico operativo que pueda enviar correos electrónicos. Compruébalo primero.
Habilita el envío de correo electrónico desde actualizaciones desatendidas editando el archivo de configuración 52unattended-upgrades-local (crea el archivo si no existe en el directorio /etc/apt/apt.conf/). Copia la línea
//Unattended-Upgrade::Mail "";
de 50actualizaciones-asistidas, descoméntala y añade la dirección de correo electrónico de destino entre las «-comillas».
También hay un ajuste para configurar si el correo electrónico se envía siempre que unattended-upgrades hace una actualización, o sólo en caso de error.
// Set this value to "true" to get emails only on errors. Default // is to always send a mail if Unattended-Upgrade::Mail is set //Unattended-Upgrade::MailOnlyOnError "false";
Si quieres cambiar la configuración, copia las líneas en 52unattended-upgrades-local, descomenta la línea de configuración y cambia «false» por «true».
Comprobar con
unattended-upgrade --dry-run -d
después de modificar el archivo de configuración.
Al menos en Debian 10, 11 y Ubuntu 22.04, la instalación de unattended-upgrades hace un enlace simbólico unattended-upgrades a unattended-upgrade en el directorio /usr/bin/ y/o /bin/, por lo que ambos comandos funcionan igual.
$ ls -lhi /bin/unattended-upgrade* 11404505 -rwxr-xr-x 1 root root 98K tammi 15 2022 /bin/unattended-upgrade 11407087 lrwxrwxrwx 1 root root 18 tammi 15 2022 /bin/unattended-upgrades -> unattended-upgrade
Añadir repositorio
Añadir un repositorio desde el que actualizar automáticamente se hace añadiendo líneas a Unattended-Upgrade::Origins-Pattern. Hay documentación sobre esto en el archivo de configuración.
El README indica que los ajustes del archivo de configuración posterior 52unattended-upgrades-local anulen los ajustes por defecto. Lo he intentado y he comprobado que la configuración de Unattended-Upgfade::Origins-Pattern no anula completamente lo establecido en el archivo predeterminado, sino que se añade a los valores predeterminados. Por tanto, no es necesario copiar por completo el patrón por defecto de Desaparición Desatendida: :Orígenes, sino que se puede añadir.
Por ejemplo, el paquete goaccess no se actualiza automáticamente cuando se instala desde el Repositorio Oficial de GoAccess. Se actualizaría automáticamente si se instalara desde el repositorio habitual de Debian (está disponible en ambos). Añadir el repositorio GoAccess al patrón-orígenes hace que las actualizaciones desatendidas realicen la actualización.
Examina la situación con apt list –upgradable:
root@posti:~# LANG=C apt list --upgradable Listing... Done goaccess/unknown 2:1.6.3-buster amd64 [upgradable from: 2:1.6.2-buster] php-tcpdf/buster-backports 6.5.0+dfsg1-1~bpo10+1 all [upgradable from: 6.3.5+dfsg1-1~bpo10+1] root@posti:~#
Así que hay dos paquetes que no fueron actualizados automáticamente por actualizaciones-desatendidas. Examinar goaccess muestra que procede del repositorio oficial de GoAccess (y una versión anterior del repositorio habitual de Debian).
root@posti:~# LANG=C apt policy goaccess goaccess: Installed: 2:1.6.2-buster Candidate: 2:1.6.3-buster Version table: 2:1.6.3-buster 500 500 https://deb.goaccess.io buster/main amd64 Packages *** 2:1.6.2-buster 100 100 /var/lib/dpkg/status 1:1.2-4+b10 500 500 http://mirror.hetzner.de/debian/packages buster/main amd64 Packages 500 http://deb.debian.org/debian buster/main amd64 Packages root@posti:~#
Ejecutar unattended-upgrade –dry-run -d muestra qué orígenes tienen los paquetes no instalados. Esto puede ayudar a averiguar qué hay que añadir a Origins-Pattern.
Examinar el registro de la última ejecución de actualizaciones desatendidas muestra qué orígenes se tienen en cuenta al actualizar automáticamente:
2022-09-05 08:28:08,955 INFO Checking if system is running on battery is skipped. Please install powermgmt-base package to check power status and skip installing updates when the system is running on battery. 2022-09-05 08:28:08,960 INFO Initial blacklist : 2022-09-05 08:28:08,960 INFO Initial whitelist: 2022-09-05 08:28:08,960 INFO Starting unattended upgrades script 2022-09-05 08:28:08,960 INFO Allowed origins are: origin=Debian,codename=buster,label=Debian, origin=Debian,codename=buster,label=Debian-Security
El repositorio GoAccess aún no está ahí, así que ahora lo añado a /etc/apt/apt.conf.d/52unattended-upgrades-local.
Como apunte, si has instalado unattended-upgrades en un portátil, considera la posibilidad de instalar powermgmt-base. De este modo, unattended-upgrades no inicia las actualizaciones cuando funciona con batería, como informa el mensaje de información del registro. Si se ejecuta en un servidor que siempre funciona con alimentación de línea, ese mensaje informativo ya no se muestra con Unattended-Upgrade::OnlyOnACPower «false»; añadido a la configuración.
Unattended-Upgrade::Origins-Pattern { // Taleman added GoAccess 2022-09-05 "o=GoAccess Repository, n=buster, l=Official GoAccess Repository"; }; Unattended-Upgrade::OnlyOnACPower "false";
La política apt no mostraba el campo a para GoAccess, así que utilicé o, n y l. Encuentra información sobre estos campos en README.
Se admite la sustitución de variables para ${distro_id} que contiene la salida de lsb_release -i y ${distro_codename} que contiene la salida de lsb_release -c. Así que en lugar de n=buster podría haber escrito n=${distro_codename}.
Había dos paquetes que no se actualizaron automáticamente, el otro que sigue sin actualizarse es php-tcpdf. Por supuesto, se puede actualizar con apt upgrade, pero se puede añadir a unattended-upgrades para que se actualice automáticamente. El procedimiento es el mismo que para goaccess.
Primero examina la situación con la política de apt php-tcpdf. Eso muestra que está instalado desde la sección buster-backports del repositorio Debian.
En unattended-upgrades.log se puede ver que buster-backports no está entre los orígenes permitidos. Está en el archivo 50unattended-upgrades pero está comentado. Para activarlo, copia la línea
// "o=Debian Backports,a=${distro_codename}-backports,l=Debian Backports";
en 52actualizaciones-desatendidas-local dentro de la configuración Orígenes-Patrón y descomenta.
Después de editar el archivo, comprueba con unattended-upgrades –dry-run -d que el repositorio añadido está ahora entre los «Orígenes permitidos» y que php-tcpd está entre los paquetes que se actualizarán.
Tiempos de control
Las actualizaciones desatendidas se ejecutan a horas aleatorias para aliviar la carga de los servidores de repositorios. Esto se hace para evitar los grandes picos de carga que se producirían si todos los hosts empezaran a hacer actualizaciones al mismo tiempo. Piénsatelo bien si decides cambiar este comportamiento. Si ejecutas tu propio repositorio o un repositorio espejo, entonces los picos de carga afectan a tu servidor de repositorios y evitas molestar a los administradores de repositorios en Internet.
Es systemd quien controla a qué horas se inician las actualizaciones desatendidas. El archivo /lib/systemd/system/apt-daily.timer tiene la sección Timer que inicia las actividades de descarga de apt dos veces al día con 12 horas de retraso aleatorio. Te sugiero que no modifiques esto, o que tengas muy buenas razones para modificarlo.
El resto de las configuraciones de tiempo se hacen en los archivos 50unattended-upgrades y 52unattended-upgrades-local.
La configuración Actualización desatendida::Días-de-actualización controla los días de la semana en que se ejecuta la actualización desatendida. Por defecto está vacío, lo que significa que se ejecuta todos los días. Se puede configurar para que se ejecute, por ejemplo, sólo los sábados y domingos.
Reinicio automático
Actualizaciones desatendidas puede configurarse para que se reinicie cuando las actualizaciones instaladas requieran un reinicio. Esto puede configurarse para que ocurra inmediatamente o a la hora deseada. Estas configuraciones utilizan los ajustes
//Unattended-Upgrade::Automatic-Reboot "false"; //Unattended-Upgrade::Automatic-Reboot-WithUsers "true"; //Unattended-Upgrade::Automatic-Reboot-Time "02:00";
Por defecto no hay reinicio automático. Si cambias la configuración a «verdadero», el reinicio se produce inmediatamente después de instalarse la actualización. La Hora de Reinicio Automático puede configurarse para que el reinicio se produzca a la hora deseada si hay actualizaciones instaladas que requieran un reinicio.
Listas negras, listas blancas
Una lista negra impide que se actualice un paquete que, de otro modo, se actualizaría mediante actualizaciones desatendidas. La configuración Lista negra de paquetes contiene expresiones regulares. Si el nombre del paquete coincide, se excluye de la actualización automática.
No he utilizado esta función, creo que puede ser más útil si se ejecuta una versión de desarrollo en la que tiene sentido evitar la actualización automática de paquetes críticos. El archivo de configuración 50unattended-upgrades proporciona ejemplos de paquetes incluidos en la lista negra.
El README habla de la configuración de la Lista Negra de Paquetes. La descripción dice «Sólo se marcarán para actualización los paquetes que coincidan con las expresiones regulares de esta lista». No ofrece ejemplos para aclarar en qué casos sería conveniente establecer la lista blanca. Según mis experimentos, parece que añadir paquetes a la lista blanca significa que sólo esos paquetes se actualizan automáticamente, nada más.
Conclusión
Ahora ya sabes lo que puede hacer la actualización desatendida y cómo hacer que haga lo que quieres.
Hay casos en los que las actualizaciones desatendidas no hacen la actualización porque el comando apt upgrade retiene un paquete. Esto ocurre cuando la actualización eliminaría un paquete o instalaría un paquete previamente desinstalado. Para que se realice la actualización, hazlo tú mismo con el comando apt full-upgrade, que puede eliminar paquetes o instalar nuevos paquetes previamente desinstalados. Si las actualizaciones desatendidas están configuradas para enviar un correo electrónico, éste contendrá la línea
Packages with upgradable origin but kept back:
Un último ejemplo de 52unattended-upgrades-local de uno de mis hosts:
Unattended-Upgrade::Origins-Pattern { // Taleman added 2022-09-05 "o=GoAccess Repository, n=buster, l=Official GoAccess Repository"; "o=Debian Backports,a=${distro_codename}-backports,l=Debian Backports"; "origin=deb.sury.org,archive=${distro_codename}"; }; Unattended-Upgrade::Mail "[email protected]"; Unattended-Upgrade::OnlyOnACPower "false";