ClickCease Tutoriel pour les développeurs : Patching en direct d'Oracle Enterprise Linux 7 avec Kpatch - TuxCare

Rejoignez notre populaire bulletin d'information

Rejoignez 4 500+ professionnels de Linux et de l'Open Source !

2 fois par mois. Pas de spam.

Tutoriel pour les développeurs : Corrections en direct d'Oracle Enterprise Linux 7 avec Kpatch

30 juillet 2020 - L'équipe de relations publiques de TuxCare

Développeur Tutorial-min

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 :

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 pour CONFIG_HAVE_LIVEPATCH et CONFIG_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-checkbien 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

1. Installer les paquets de dépendance

  1. Installer et configurer sudo.

    Comme root:

    apt-get install sudo
    adduser <user> sudo

    <user> est le nom d'utilisateur d'un utilisateur normal. (Toutes les commandes suivantes doivent être effectuées en tant que cet utilisateur).

  2. 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
  3. 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
  4. 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
  5. 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

  1. Avant de charger le module de correction, vérifiez le temps de fonctionnement actuel.
    cat /proc/uptime && uptime -p
  2. Chargez le module de correction.
    # kpatch load kpatch-uptime.ko
    chargement du module de patch : kpatch-uptime.ko
  3. Vérifiez à nouveau le temps de fonctionnement.
    cat /proc/uptime && uptime -p
  4. 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
  5. 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.

Vous cherchez à automatiser la correction des vulnérabilités sans redémarrage du noyau, temps d'arrêt du système ou fenêtres de maintenance programmées ?

Découvrez le Live Patching avec TuxCare

Devenez rédacteur invité de TuxCare

Commencer

Courrier

Rejoindre

4,500

Professionnels de Linux et de l'Open Source
!

S'abonner à
notre lettre d'information