Buscar en este blog

23.11.17

Gestión de actualizaciones de seguridad en Ubuntu (16.04)

Ubuntu dispone del paquete "unattended-upgrades", que usando "cron" y "aptitude" descarga e instala las actualizaciones del sistema de forma automática.
Resulta útil pero tiene algunos problemas como la pérdida de control de las propias actualizaciones. Las actualizaciones se buscan, descargan e instalan de forma desatendida.

A continuación se explica como hacer una gestión menos agresiva de las actualizaciones de seguridad en Ubuntu 16.04 Server, manteniendo el control de cuando instalarlas.
Además se permite que el sistema busque las actualizaciones de seguridad, que puede ser útil para avisar al operador (vía correo automático, sistema de monitorización, etc) del número de actualizaciones de seguridad disponibles.

Deshabilitar las actualizaciones automáticas

  • En la instalación, Ubuntu pregunta sobre esto. Si se deshabilitaron en aquel momento no es necesario hacer nada más por ahora.
  • Comprobar que está instalado el paquete "unattended-upgrades". En caso negativo, instalarlo. 
  • Editar "/etc/apt/apt.conf.d/10periodic
[...]
APT::Periodic::Unattended-Upgrade "0";
[...]
Nota: Si la linea no existe, no es necesario añadirla. El efecto es el mismo.


Permitir que el sistema busque automáticamente las actualizaciones

  • Editar "/etc/apt/apt.conf.d/10periodic 
[...]
APT::Periodic::Update-Package-Lists "1";
[...]
Nota: El valor '1' hace referencia a la frecuencia, en días, que se ejecuta la búsqueda. El efecto es similar a ejecutar "apt-get update".

Bloquear paquetes 'problemáticos'

Algunos paquetes, como el kernel, pueden bloquearse para que no se actualicen mediante procesos automáticos (habrá que actualizarlos manualmente). Para bloquear el kernel:
apt-mark hold linux-image-generic
apt-mark hold linux-headers-generic
Nota: Los paquetes marcados con hold no aparecen en la lista de paquetes a actualizar.

Listar los paquetes con actualizaciones de seguridad pendientes

Existen varias formas de obtener esta información:
  • Ejecutar:
 /usr/lib/update-notifier/apt_check.py
 Devuelve una cadena de formato XX;YY, donde XX es el número de actualizaciones totales e YY es el número de actualizaciones de seguridad.
  • Ejecutar:
apt-get -s dist-upgrade | grep "^Inst" |  grep -i security
Aparece una lista de los paquetes con actualizaciones pendientes.
  • A partir de aquí se puede elaborar un script como este:
#!/bin/bash
bold=$(tput bold)
normal=$(tput sgr0)
echo "Refrescando lista de paquetes..."
apt-get update
NUMERO_ACTUALIZACIONES=$(apt-get -s dist-upgrade | grep "^Inst" |  grep -i security | wc -l)
echo "Actualizaciones de seguridad pendientes: ${bold}$NUMERO_ACTUALIZACIONES${normal}"
echo ""
apt-get -s dist-upgrade | grep "^Inst" |  grep -i security

Actualizar los paquetes (solo actualizaciones de seguridad)

Se puede actualizar cada paquete de uno en uno o ejecutar una orden para todos del tipo:
    apt-get -s dist-upgrade | grep "^Inst" | grep -i security | awk -F " " {'print $2'} | xargs apt-get install
O un script un poco más elaborado:
#!/bin/bash

echo "Actualizaciones de seguridad disponibles:"
echo "-----------------------------------------"
apt-get -s dist-upgrade | grep "^Inst" |  grep -i security
echo ""
read -r -p "¿Actualizar estos paquetes? [y/N] " response
if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]]
then
    echo "Actualizar..."
    apt-get -s dist-upgrade | grep "^Inst" | grep -i security | awk -F " " {'print $2'} | xargs apt-get install
else
    echo "No Actualizar"
fi

if [ -f /var/run/reboot-required ]; then
    echo ""
    echo "Reboot is Required!!!!"
fi

echo ""
echo "Es posible que deja ejecutar apt autoclean para eliminar paquetes antiguos"

Últimos detalles (posible reinicio y limpieza)

Cuando se actualizan paquetes que requieren o recomiendan el reinicio de la máquina, se genera el archivo vacío
/var/run/reboot-required
Para eliminar las cachés de paquetes descargados y liberar espacio en disco se puede ejecutar:
apt-get autoclean