A pesar de que lo mío es más el software, también hago mucho (¡demasiado!) de sistemas. Y aunque mi especialidad es Windows/IIS, también me toca de vez en cuando gestionar sistemas Linux, aunque mi control es limitado. Lo bueno es que, cuando tengo que hacerlo, aprendo muchas cosas nuevas. Así que las documento para no olvidarme. Hoy, comparto una de estas cosas que creo que le puede resultar de utilidad a mucha gente.

Aviso: ya digo que no soy experto en Linux. Voy aprendiendo a medida que lo necesito, por lo que puede que algún detalle que comente no sea el más eficiente o ideal. Pero lo que sí puedo asegurar es que a mi me funciona. Si tú sí eres experto en Linux y ves algún detalle así, estaré encantado de que me lo digas en los comentarios para mejorar el post y así  aprender y ayudar mejor a todos. ¡Gracias!

Y es que, por defecto, Ubuntu Linux Server se actualiza cuando tú se lo dices, y no de manera automática. Lo cual tiene su lógica, porque dependiendo de la utilidad que le estés dando no quieres que cualquier cambio automático te pueda "tocar" lo que no debe. Sin embargo, en mi caso, lo que quiero es que el sistema esté actualizado siempre con lo último, excepto una aplicación concreta que gestiono y que sólo quiero actualizar a mano cuando me interese, pues se me cambian algunas personalizaciones que he hecho y además quiero probarlo a fondo en un servidor de pruebas antes de pasarlo a producción. También te puede interesar que el sistema incorpore automáticamente al menos las actualizaciones de seguridad (sobre todo si está conectado a Internet), pero no el resto de actualizaciones del sistema y las aplicaciones instaladas.

Voy a explicar cómo puedes hacer que Linux Server se actualice solo pero al mismo tiempo puedas mantener el control sobre qué cosas se actualizan y cuáles no.

¡Vamos allá!

Pasos a seguir para activar las actualizaciones automática en Linux

  1. Primero nos aseguramos de que está el sistema ya está actualizado antes de comenzar:
sudo apt update && sudo apt upgrade

Truco: si vas a meter muchas instrucciones como "root" usando sudo todo el tiempo, puedes abrir una sesión interactiva con privilegios elevados escribiendo: sudo -i o bien sudo -s. En ambos casos dejarás de tener que poner sudo todo el tiempo para actuar con privilegios de root. La diferencia es que en el primer caso tendrás el entorno bash del root (es decir no se usará tu archivo ~/.bashrc) y en el segundo caso serás root pero se usará tu entorno de bash (o sea se usará lo indicado en tu archivo ~/.bashrc).

  1. Para lograr las actualizaciones automáticas vamos a usar el paquete unattended upgrades de Ubuntu, con sus paquetes relacionados, que debemos instalar así junto a otros dos:
sudo apt install unattended-upgrades apt-listchanges bsd-mailx

El segundo paquete, apt-listchanges conserva un log de los cambios en las listas de paquetes. El último paquete, bsd-mailx es un servidor de correo simple que se encargará de notificarnos por email cada vez que haya una actualización, con los detalles de lo que se ha actualizado. Al instalarlo nos saltará un diálogo para configurarlo:

Diálogo de bsd-mailx

Al pulsar Ok debemos elegir una de las opciones que se ven en la figura anterior para decirle cómo queremos que nos envíe el correo con las actualizaciones. Por ejemplo, si ya tenemos un servidor de email externo en nuestra red de servidores podemos elegir la segunda opción "El correo se envía y recibe directamente usando SMTP" (lo de "recibe" es un poco raro porque SMTP es solo para enviar, pero bueno), eligiendo el servidor que queremos usar:

Diálogo de bsd-mailx

Una vez configurado el coreo (si no lo quieres, no instales el paquete bsd-mailx), ahora activamos las actualizaciones desatendidas configurando el paquete correspondiente con el siguiente comando:

sudo dpkg-reconfigure -plow unattended-upgrades

Diálogo informativo

Aceptamos en el diálogo que aparece  y ya quedan activadas, pero todavía falta configurarlo.

  1. La configuración hay que hacerla en el archivo llamado 50unattended-upgrades, que podemos abrir con cualquier editor de línea de comandos (por ejemplo  a mi me gusta nano, que es muy simple pero efectivo):
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

En este archivo tenemos las listas de repositorios de paquetes que se pueden actualizar. Por defecto tiene los del sistema operativo:

Configuración por defecto

Con esta configuración por defecto, tal cual abrimos el archivo y se ve en la figura, se instalan las actualizaciones de seguridad e importantes.

Para obtener las actualizaciones del sistema y las aplicaciones, y no solo las de seguridad, deberíamos descomentar la línea "${distro_id}:${distro_codename}-updates";. De este modo se actualizarán todos los productos "nativos", y no solo los problemas de seguridad del sistema. Fíjate en que en este caso no se usa una cadena constante sino que lo que va entre ${...} se sustituye automáticamente para que use siempre los valores actuales para el sistema operativo.

Si queremos que se actualicen también otros repositorios de paquetes de terceros, muy habitual, y no solo los del sistema, podemos añadir sus URLs en sendas líneas dentro de esa primera lista de orígenes.

Si no queremos actualizar ciertas aplicaciones o servicios concretos, basta con añadirlos a la configuración Unattended-Upgrade::Package-Blacklist como se ve en la figura, lo que puede ser muy útil.

Además, en mi opinión (poco experta), es recomendable activar las siguientes opciones:

  • Unattended-Upgrade::Remove-Unused-Dependencies "true";: para eliminar las dependencias que ya dejen de ser necesarias tras una actualización, liberando espacio en disco y probablemente cargando menos el sistema.
  • Unattended-Upgrade::Automatic-Reboot "true"; hace que el sistema se reinicie solo cuando sea necesario tras la actualización.
  • Unattended-Upgrade::Automatic-Reboot-Time "02:00";: para que el reinicio anterior se produzca a la hora que deseemos, por ejemplo a las 2 de la mañana u otra hora en la que probabilidad de impactar a los usuarios sea menor.

Si hemos utilizado el paquete de email bsd-mailx debemos configurar algunas opciones más, en concreto:

  • Unattended-Upgrade::MailOnlyOnError "true";: para que sólo nos envíe un email en caso de que se produzca algún error.
  • Unattended-Upgrade::Mail "[email protected]";: para establecer la dirección a la que escribir cuando haya algo que notificar. Si se quiere usar más de un email se pueden separar por comas.

Nota: para grabar lo que cambies en el archivo con nano usa las teclas CTRL+O y luego ENTER. Para salir sin grabar usa CTRL+X.

  1. También es necesario configurar la tarea de actualizaciones automáticas, de modo que se verifiquen cada "x" tiempo, etc. para esto editamos el archivo 20auto-upgrades:
sudo nano /etc/apt/apt.conf.d/20auto-upgrades

Al editarlo (puede estar vacío) debemos asegurarnos de que tiene las siguientes líneas configuradas:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";

Esto hace que se actualicen automáticamente los listados de paquetes, los listados de descargas, y que se comprueben e instalen las novedades diariamente (última línea). La penúltima línea hace una limpieza de las descargas locales una vez a la semana.

Todas las opciones disponibles están explicadas en la cabecera del archivo /etc/cron.daily/apt.

  1. Ahora podemos probar si todo funciona como debiera simulando la ejecución de las actualizaciones, así:
sudo unattended-upgrades --dry-run --debug

por ejemplo, en este caso produce un error por mala configuración en la línea 60 de 50unattended-upgrades y hay que editar de nuevo el archivo y corregirlo:

Error de configuración

Nota: en nano para saber en qué línea del archivo estás puedes pulsar CTRL+C (no, no vale para copiar😃) y te la mostrará en la parte de abajo.

Normalmente este tipo de errores los da si te has olvidado de poner un punto y coma ; al final de alguna línea de configuración. Algunas de las que vienen comentadas y descomentas al editarlas no lo tienen y hay que ponérselo.

Si todo va bien deberías ver algo similar a esto:

Resultado de simulación correcta

También puedes consultar el log de las actualizaciones automáticas mostrando el contenido de este archivo:

sudo cat /var/log/unattended-upgrades/unattended-upgrades.log

o también:

sudo cat /var/log/unattended-upgrades/unattended-upgrades.log
sudo tail -f /var/log/unattended-upgrades/unattended-upgrades.log
sudo grep 'linux-image' /var/log/unattended-upgrades/unattended-upgrades.log

para localizar solo lo último y más reciente.

En resumen

Aunque puede tener sus peligros, poder mantener tus servidores Linux actualizados automáticamente te quita trabajo y, lo que es más importante, evita que te olvides de actualizarlos o que una actualización retrasada demasiado tiempo te suponga un problema de seguridad. En este post hemos visto cómo lograr que se actualicen solos y obtener un buen control sobre cómo quieres lograrlo. Además, recibir avisos a través de correo electrónico con las actualizaciones o solo cuando haya algún problema (que será casi nunca).

¡Espero que te resulte util!

💪🏻 ¿Este post te ha ayudado?, ¿has aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor

Escrito por un humano, no por una IA