Tutorial para desarrolladores: Live Patching Oracle Enterprise Linux 7 con Kpatch
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:
- Servicio Canonical Livepatch para Ubuntu;
- KernelCare para la mayoría de las principales distribuciones de Linux;
- Ksplice para Oracle Linux;
- SUSE Live Patching (anteriormente conocido como Kgraft) para SUSE Enterprise Linux.
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
paraCONFIG_HAVE_LIVEPATCH
yCONFIG_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-check
aunque 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
- Para ver la versión de gcc instalada:
1. Instalar paquetes de dependencia
- 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). - 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
- 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
- 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
- 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
- Antes de cargar el módulo de parches, compruebe el tiempo de actividad actual.
cat /proc/uptime && uptime -p
- Carga el módulo patch.
# kpatch load kpatch-uptime.ko cargando módulo patch: kpatch-uptime.ko
- Comprueba de nuevo el tiempo de actividad.
cat /proc/uptime && uptime -p
- Descarga el módulo patch.
# kpatch unload kpatch-uptime.ko desactivar módulo de parche: kpatch_uptime descargando el módulo patch: kpatch_uptime
- 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.
