ClickCease Tutorial para desarrolladores: Live Patching Oracle Enterprise Linux 7 con Kpatch - TuxCare

Únase a nuestro popular boletín

Únase a más de 4.500 profesionales de Linux y el código abierto.

2 veces al mes. Sin spam.

Tutorial para desarrolladores: Live Patching Oracle Enterprise Linux 7 con Kpatch

30 de julio de 2020 - Equipo de RRPP de TuxCare

Desarrollador Tutorial-min

Live patching permite actualizar el kernel de Linux sin reiniciar el sistema. Este enfoque es sin duda una solución perfecta para grandes empresas con servicios sensibles a las interrupciones, cuando las pausas pueden causar efectos tóxicos a todo el negocio. Pero la actualización del kernel es una necesidad en el mundo actual lleno de vulnerabilidades, problemas de seguridad y lagunas. Sólo una actualización preventiva del núcleo puede garantizar un funcionamiento sin problemas de su empresa.

Es posible que ya haya leído nuestros tutoriales de parcheo en vivo del kernel: Live patching Debian 10 Linux kernel with K patch y Live patching Ubuntu 20.04 LTS Focal Fossa Linux kernel with Kpatch. Y si no, considérelos materiales útiles para compartir con sus colegas y amigos.

En este tutorial, le mostraré cómo parchear el kernel de Linux Oracle Enterprise Linux 7 - UEK4 usando Kpatch sin reiniciarlo.

Kpatch es un proyecto de Red Hat y funciona en RHEL y sus derivados. Red Hat ofrece un servicio comercial de parches en vivo para los clientes de RHEL, al igual que las siguientes empresas, cada una de las cuales se centra en distribuciones diferentes:

Hemos elegido Kpatch para este tutorial porque su código fuente está disponible gratuitamente y se actualiza con regularidad.

Requisitos previos

Estos son los requisitos previos del sistema para seguir este tutorial.

  • Un sistema de prueba (no de producción) que ejecuta Oracle7 UEK4 en una arquitectura x86_64/amd64.
  • 20 Gb de espacio libre en disco. (El código fuente del kernel de Linux ocupa unos 909 Mb en disco, que crecen hasta los 17 Gb cuando se compila).
  • Su núcleo no ha sido personalizado; está utilizando el estándar suministrado por Debian
  • Su kernel tiene parcheado en vivo incorporado. Utilice este comando y espere ver dos valores establecidos en y para CONFIG_HAVE_LIVEPATCH y CONFIG_LIVEPATCH:
grep LIVEPATCH /boot/config-$(uname -r)
  • La versión de gcc instalada coincide con la utilizada para compilar el núcleo original. (La kpatch-build fallará si las versiones no coinciden. Esto se puede anular con la opción --skip-gcc-checkaunque se desaconseja su uso).
    • Para ver la versión de gcc instalada: gcc --version (if gcc not installed run ”sudo apt install gcc”)
    • Para ver la versión de gcc utilizada para compilar el kernel actual: cat /proc/version

1. Instalar paquetes de dependencia

  1. Instalar y configurar sudo.

    En root:

    apt-get install sudo
    adduser <user> sudo

    donde <user> es el nombre de usuario para un usuario normal. (Todos los comandos posteriores deben realizarse como este usuario).

  2. Instalar paquetes.
    sudo yum install elfutils elfutils-devel
    sudo yum install pesign yum-utils zlib-devel binutils-devel newt-devel python-devel 
    perl-ExtUtils-Embed audit-libs numactl-devel pciutils-devel bison patchutils bc rpm-build glib2-devel
  3. Descarga e instala libdtrace:
    wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/x86_64/getPackage/libdtrace-ctf-0.8.0-1.el7.x86_64.rpm
    wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/x86_64/getPackage/libdtrace-ctf-devel-0.8.0-1.el7.x86_64.rpm
    rpm -ivh libdtrace-ctf-0.8.0-1.el7.x86_64.rpm libdtrace-ctf-devel-0.8.0-1.el7.x86_64.rpm
  4. Descargue e instale las fuentes del kernel y los paquetes kernel-devel:
    wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/x86_64/getPackageSource/kernel-uek-4.1.12-124.40.6.3.el7uek.src.rpm
    wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/x86_64/getPackage/kernel-uek-devel-4.1.12-124.40.6.3.el7uek.x86_64.rpm
    rpm -ivh kernel-uek-4.1.12-124.40.6.3.el7uek.x86_64.rpm --nodeps
    rpm -ivh --nodeps kernel-uek-devel-4.1.12-124.40.6.3.el7uek.x86_64.rpm
  5. Descargue e instale los paquetes debuginfo:
wget https://oss.oracle.com/ol7/debuginfo/kernel-uek-debuginfo-4.1.12-124.40.6.3.el7uek.x86_64.rpm
wget https://oss.oracle.com/ol7/debuginfo/kernel-uek-debuginfo-common-4.1.12-124.40.6.3.el7uek.x86_64.rpm
rpm -ivh kernel-uek-debuginfo-4.1.12-124.40.6.3.el7uek.x86_64.rpm kernel-uek-debuginfo-common-4.1.12-124.40.6.3.el7uek.x86_64.rpm

2. Instalar Kpatch

git clone https://github.com/dynup/kpatch.git
cd kpatch && make && sudo make install
cd kmod && make
mkdir /lib/modules/`uname -r`/extra/kpatch
cp core/kpatch.ko /lib/modules/`uname -r`/extra/kpatch
cp core/Module.symvers /lib/modules/`uname -r`/extra/kpatch

3. Obtener una copia del código fuente del núcleo Linux

Descomprime las fuentes del núcleo:

cd /root/rpmbuild/SOURCES
tar xfj linux-4.1.12.tar.bz2

4. Crear el archivo de configuración del núcleo Linux

El núcleo de Linux se compila utilizando los parámetros de un archivo de configuración suministrado con su distribución. Haga una copia y cambie algunos parámetros para que kpatch-build pueda compilar un núcleo Linux con la misma configuración que su núcleo en ejecución.

cd linux-source-5.4.0/
cp /boot/config-$(uname -r) .config

Compruebe que los ajustes necesarios del kernel están habilitados para utilizar Kpatch. Todos deben devolver 'y'.

scripts/config -s RASTREO_DINÁMICO_CON_REGS
scripts/config -s FUNCTION_TRACER
scripts/config -s RASTREO_DINÁMICO_CON_REGLAS
scripts/config -s TENER_FENTRÍA
scripts/config -s HAVE_LIVEPATCH
scripts/config -s KALLSYMS_ALL
scripts/config -s KALLSYMS
scripts/config -s LIVEPATCH
scripts/config -s MÓDULOS
scripts/config -s MODULE_SIG
scripts/config -s SYSFS
scripts/config -s SISTEMA_TRUSTED_KEYRING

Cambia el valor de un elemento de configuración del kernel.

scripts/config --set-str SYSTEM_TRUSTED_KEYS ""

Deje el directorio de origen.

cd ..

5. Crear un parche

Un archivo fuente de parche es la salida de diff ejecutado en los archivos de código fuente original y modificado.

El ejemplo de aplicación de parches que se muestra en la sección "Inicio rápido" del Página de kpatch en github cambia la salida de /proc/meminfo. Muchos otros artículos de Kpatch reproducen este ejemplo, así que quería algo diferente y un poco más interesante, aunque seguro.

Este ejemplo cambia la salida del uptime para darles la ilusión de que el tiempo de actividad de su servidor ha aumentado una década.

1. Todavía en su directorio de trabajo, copie un archivo.

cd /root/rpmbuild/SOURCES
cp linux-4.1.12/fs/proc/uptime.c .

2. Edítalo. En la línea 26, cambie:

(unsigned long) uptime.tv_sec,

a

(unsigned long) uptime.tv_sec + 315576000,

Guarda el archivo.

3. Cree el archivo del parche.

diff -u linux-source-5.4.0/fs/proc/uptime.c ./uptime.c > uptime.patch

4. Cree el módulo del parche. (La primera vez que haga esto, tardará algunas horas, ya que hay que compilar el código fuente del kernel. Las siguientes compilaciones son significativamente más rápidas, del orden de minutos).

kpatch-build -t vmlinux -v /usr/lib/debug/boot/vmlinux-5.4.0-37-generic uptime.patch

 

5. Cuando haya terminado, tendrá un archivo Linux Loadable Kernel Module kpatch-uptime.ko para el parche.

 

6. Prueba del parche

  1. Antes de cargar el módulo de parches, compruebe el tiempo de actividad actual.
    cat /proc/uptime && uptime -p
  2. Carga el módulo patch.
    # kpatch load kpatch-uptime.ko
    cargando módulo patch: kpatch-uptime.ko
  3. Comprueba de nuevo el tiempo de actividad.
    cat /proc/uptime && uptime -p
  4. Descarga el módulo patch.
    # kpatch unload kpatch-uptime.ko
    desactivar módulo de parche: kpatch_uptime
    descargando el módulo patch: kpatch_uptime
  5. Comprueba que el tiempo de actividad ha vuelto a su valor anterior.
    # cat /proc/uptime && uptime -p
    7215.13 27930.41
    up 2 horas

Conclusión

Hemos trabajado a través del proceso de parcheo en vivo del kernel de Linux Oracle Enterprise Linux 7 - UEK4 con Kpatch. Se puede ver que el proceso en sí es bastante simple, pero no es fácil. Y el desarrollo de un parche presenta la principal dificultad. El parche no debe romper el sistema, debe ser compatible con los paquetes anteriores y siguientes. Añade aquí diferentes distribuciones y versiones del kernel, pruebas y soporte, y puedes acabar con un precio notable para una herramienta de parcheo en vivo.

Obtenga una prueba GRATUITA de 7 días con soporte de KernelCare 

 

Puede explorar tres formas diferentes de aplicar parches de seguridad del núcleo Linux en nuestra guía explícita. El artículo explica cómo actualizar los kernels de Linux sin reiniciar, cubriendo tres métodos diferentes para algunos de los kernels de Linux más populares.

¿Desea automatizar la aplicación de parches de vulnerabilidad sin reiniciar el núcleo, dejar el sistema fuera de servicio o programar ventanas de mantenimiento?

Más información sobre Live Patching con TuxCare

Conviértete en escritor invitado de TuxCare

Empezar

Correo

Únete a

4,500

Profesionales de Linux y código abierto

Suscríbase a
nuestro boletín