Tutoriel pour les développeurs : Corrections en direct d'Oracle Enterprise Linux 7 avec Kpatch
Le live patching vous permet de mettre à jour le noyau Linux sans redémarrer votre système. Cette approche est certainement une solution parfaite pour les grandes entreprises dont les services sont sensibles aux interruptions, lorsque les pauses peuvent avoir des effets toxiques sur l'ensemble de l'activité. Mais la mise à jour du noyau est une nécessité dans le monde d'aujourd'hui, plein de vulnérabilités, de problèmes de sécurité et de lacunes. Seule une mise à jour anticipée du noyau peut garantir le bon fonctionnement de votre entreprise.
Vous avez peut-être déjà lu nos tutoriels de correction en direct du noyau : Corriger en direct le noyau Linux de Debian 10 avec Kpatch et Corriger en direct le noyau Linux de Ubuntu 20.04 LTS Focal Fossa avec Kpatch. Si ce n'est pas le cas, considérez-les comme des documents utiles à partager avec vos collègues et amis.
Dans ce tutoriel, je vais vous montrer comment patcher le noyau Linux d'Oracle Enterprise Linux 7 - UEK4 en utilisant Kpatch sans le redémarrer.
Kpatch est un projet Red Hat et fonctionne sur RHEL et ses dérivés. Red Hat offre un service commercial de correctifs en direct pour les clients RHEL, tout comme les entreprises suivantes, qui se concentrent chacune sur des distributions différentes :
- Service Livepatch de Canonical pour Ubuntu ;
- KernelCare pour la plupart des principales distributions Linux ;
- Ksplice pour Oracle Linux ;
- SUSE Live Patching (précédemment connu sous le nom de Kgraft) pour SUSE Enterprise Linux.
Nous avons choisi Kpatch pour ce tutoriel car son code source est disponible gratuitement et est régulièrement mis à jour.
Conditions préalables
Voici les conditions préalables du système pour suivre ce tutoriel.
- Un système de test (non productif) exécutant Oracle7 UEK4 sur une architecture x86_64/amd64.
- 20 Go d'espace disque libre. (Le code source du noyau Linux occupe environ 909 Mo sur le disque, et passe à 17 Go une fois compilé).
- Votre noyau n'a pas été personnalisé ; vous utilisez le noyau standard fourni par Debian.
- Votre noyau dispose d'un correctif en direct intégré. Utilisez cette commande et attendez-vous à voir deux valeurs définies comme suit
y
pourCONFIG_HAVE_LIVEPATCH
etCONFIG_LIVEPATCH
:
grep LIVEPATCH /boot/config-$(uname -r)
- La version de gcc installée correspond à celle utilisée pour construire le noyau d'origine. (Le
kpatch-build
échouera si les versions ne correspondent pas. Ceci peut être surchargé avec l'option--skip-gcc-check
bien que son utilisation soit découragée).- Pour voir la version de gcc installée :
gcc --version (if gcc not installed run ”sudo apt install gcc”)
- Pour voir la version de gcc utilisée pour compiler le noyau actuel :
cat /proc/version
- Pour voir la version de gcc installée :
1. Installer les paquets de dépendance
- Installer et configurer
sudo
.Comme
root
:apt-get install sudo adduser <user> sudo
où
<user>
est le nom d'utilisateur d'un utilisateur normal. (Toutes les commandes suivantes doivent être effectuées en tant que cet utilisateur). - Installer les paquets.
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
- Téléchargez et installez 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
- Téléchargez et installez les sources du noyau et les paquets 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
- Téléchargez et installez les paquets 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. Installez 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. Obtenez une copie du code source du noyau Linux.
Déballez les sources du noyau :
cd /root/rpmbuild/SOURCES tar xfj linux-4.1.12.tar.bz2
4. Créer le fichier de configuration du noyau Linux
Le noyau Linux est compilé en utilisant les paramètres d'un fichier de configuration fourni avec votre distribution. Prenez une copie et changez certains paramètres pour que kpatch-build puisse compiler un noyau Linux avec les mêmes paramètres que votre noyau en cours d'exécution.
cd linux-source-5.4.0/ cp /boot/config-$(uname -r) .config
Vérifiez que les paramètres requis du noyau sont activés pour utiliser Kpatch. Tous devraient retourner 'y'.
scripts/config -s DYNAMIC_FTRACE_WITH_REGS scripts/config -s FUNCTION_TRACER scripts/config -s HAVE_DYNAMIC_FTRACE_WITH_REGS scripts/config -s HAVE_FENTRY scripts/config -s HAVE_LIVEPATCH scripts/config -s KALLSYMS_ALL scripts/config -s KALLSYMS scripts/config -s LIVEPATCH scripts/config -s MODULES scripts/config -s MODULE_SIG scripts/config -s SYSFS scripts/config -s SYSTÈME_TRUSTED_KEYRING
Modifier la valeur d'un élément de configuration du noyau.
scripts/config --set-str SYSTEM_TRUSTED_KEYS ""
Laissez le répertoire source.
cd ..
5. Créer un patch
Un fichier source de patch est la sortie de la commande diff
exécutée sur les fichiers de code source originaux et modifiés.
L'exemple d'application d'un correctif présenté dans la section "Démarrage rapide" de l'outil d'évaluation de la sécurité de l'UE. Page github de kpatch modifie la sortie de /proc/meminfo
. De nombreux autres articles de Kpatch reproduisent cet exemple, je voulais donc quelque chose de différent et d'un peu plus intéressant, tout en restant sûr.
Cet exemple modifie la sortie de la fonction uptime
pour leur donner l'illusion que le temps de fonctionnement de votre serveur a augmenté d'une décennie.
1. Toujours dans votre répertoire de travail, copiez un fichier.
cd /root/rpmbuild/SOURCES cp linux-4.1.12/fs/proc/uptime.c .
2. Modifiez-le. A la ligne 26, changez :
(unsigned long) uptime.tv_sec,
à
(unsigned long) uptime.tv_sec + 315576000,
Enregistrez le fichier.
3. Créez le fichier patch.
diff -u linux-source-5.4.0/fs/proc/uptime.c ./uptime.c > uptime.patch
4. Créez le module de correction. (La première fois que vous faites cela, cela prendra quelques heures, car le code source du noyau doit être compilé. Les constructions ultérieures sont nettement plus rapides, de l'ordre de quelques minutes).
kpatch-build -t vmlinux -v /usr/lib/debug/boot/vmlinux-5.4.0-37-generic uptime.patch
5. Lorsque c'est fait, vous aurez un fichier Linux Loadable Kernel Module kpatch-uptime.ko pour le patch.
6. Testez le patch
- Avant de charger le module de correction, vérifiez le temps de fonctionnement actuel.
cat /proc/uptime && uptime -p
- Chargez le module de correction.
# kpatch load kpatch-uptime.ko chargement du module de patch : kpatch-uptime.ko
- Vérifiez à nouveau le temps de fonctionnement.
cat /proc/uptime && uptime -p
- Déchargez le module de correction.
# kpatch unload kpatch-uptime.ko désactivation du module de patch : kpatch_uptime déchargement du module de correction : kpatch_uptime
- Vérifiez que le temps de fonctionnement est revenu à sa valeur précédente.
# cat /proc/uptime && uptime -p 7215.13 27930.41 up 2 heures
Conclusion
Nous avons travaillé sur le processus de correction en direct du noyau Linux d'Oracle Enterprise Linux 7 - UEK4 avec Kpatch. Vous pouvez constater que le processus en lui-même est assez simple mais qu'il n'est pas facile. Et le développement d'un patch présente la principale difficulté. Le patch ne doit pas casser le système, il doit être compatible avec les paquets précédents et suivants. Ajoutez ici les différentes distributions et versions du noyau, les tests et le support, et vous pouvez vous retrouver avec un prix notable pour un outil de patching en direct.
Obtenez un essai GRATUIT de 7 jours avec assistance de KernelCare
Vous pouvez explorer trois méthodes différentes d'application des correctifs de sécurité du noyau Linux dans notre guide explicite. L'article explique comment mettre à jour les noyaux Linux sans redémarrer, en couvrant trois méthodes différentes pour certains des noyaux Linux les plus populaires.
