ClickCease Entwickler-Tutorial: Live-Patching von Oracle Enterprise Linux 7 mit Kpatch - TuxCare

Abonnieren Sie unseren beliebten Newsletter

Schließen Sie sich 4.500+ Linux- und Open-Source-Experten an!

2x im Monat. Kein Spam.

Entwickler-Tutorial: Live-Patching von Oracle Enterprise Linux 7 mit Kpatch

30. Juli 2020. TuxCare PR Team

Entwickler-Tutorial-min

Live-Patching ermöglicht es Ihnen, den Linux-Kernel zu aktualisieren, ohne Ihr System neu zu starten. Dieser Ansatz ist definitiv eine perfekte Lösung für große Unternehmen mit unterbrechungsanfälligen Diensten, bei denen Unterbrechungen schädliche Auswirkungen auf das gesamte Unternehmen haben können. In der heutigen Welt voller Schwachstellen, Sicherheitsprobleme und Lücken ist ein Kernel-Update jedoch ein Muss. Nur eine vorausschauende Kernel-Aktualisierung kann einen störungsfreien, reibungslosen Betrieb Ihres Unternehmens garantieren.

Vielleicht haben Sie bereits unsere Tutorials zum Live-Patching des Kernels gelesen: Live patching Debian 10 Linux kernel with Kpatch und Live patching Ubuntu 20.04 LTS Focal Fossa Linux kernel with Kpatch. Und wenn nicht, betrachten Sie sie als nützliche Materialien, die Sie mit Ihren Kollegen und Freunden teilen können.

In diesem Tutorial zeige ich Ihnen, wie Sie den Oracle Enterprise Linux 7 - UEK4 Linux Kernel mit Kpatch patchen können, ohne ihn neu zu starten.

Kpatch ist ein Projekt von Red Hat und arbeitet mit RHEL und seinen Derivaten. Red Hat bietet einen kommerziellen Live-Patch-Service für RHEL-Kunden an, ebenso wie die folgenden Unternehmen, die sich jeweils auf unterschiedliche Distributionen konzentrieren:

Wir haben Kpatch für dieses Tutorial gewählt, weil sein Quellcode kostenlos verfügbar ist und regelmäßig aktualisiert wird.

Voraussetzungen

Hier sind die Systemvoraussetzungen für die Teilnahme an diesem Lernprogramm.

  • Ein Testsystem (nicht produktiv) mit Oracle7 UEK4 auf einer x86_64/amd64-Architektur.
  • 20 GB freier Festplattenplatz. (Der Quellcode des Linux-Kernels benötigt etwa 909 MB auf der Festplatte und wächst nach der Kompilierung auf 17 GB an).
  • Ihr Kernel wurde nicht angepasst; Sie verwenden den von Debian gelieferten Standardkernel
  • Ihr Kernel hat Live-Patching eingebaut. Verwenden Sie diesen Befehl und erwarten Sie zwei Werte, die auf y für CONFIG_HAVE_LIVEPATCH und CONFIG_LIVEPATCH:
grep LIVEPATCH /boot/config-$(uname -r)
  • Die installierte Version von gcc stimmt mit der Version überein, mit der der ursprüngliche Kernel erstellt wurde. (Die kpatch-build wird fehlschlagen, wenn die Versionen nicht übereinstimmen. Dies kann mit der Option überschrieben werden --skip-gcc-checkobwohl von seiner Verwendung abgeraten wird).
    • Um die installierte Version von gcc zu sehen: gcc --version (if gcc not installed run ”sudo apt install gcc”)
    • Um die Version von gcc zu sehen, die zum Kompilieren des aktuellen Kernels verwendet wurde: cat /proc/version

1. Abhängigkeitspakete installieren

  1. Installieren und konfigurieren sudo.

    Als root:

    apt-get install sudo
    adduser <user> sudo

    wobei <user> ist der Benutzername für einen normalen Benutzer. (Alle nachfolgenden Befehle sollten als dieser Benutzer ausgeführt werden).

  2. Pakete installieren.
    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. Laden Sie libdtrace herunter und installieren Sie es:
    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. Laden Sie die Kernel-Quellen und die kernel-devel-Pakete herunter und installieren Sie sie:
    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. Laden Sie die debuginfo-Pakete herunter und installieren Sie sie:
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. Kpatch installieren

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. Besorgen Sie sich eine Kopie des Quellcodes des Linux-Kernels

Entpacken der Kernel-Quellen:

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

4. Erstellen Sie die Konfigurationsdatei für den Linux-Kernel

Der Linux-Kernel wird anhand der Einstellungen in einer Konfigurationsdatei kompiliert, die mit Ihrer Distribution geliefert wird. Nehmen Sie eine Kopie und ändern Sie einige Einstellungen, damit kpatch-build einen Linux-Kernel mit denselben Einstellungen kompilieren kann wie Ihr laufender Kernel.

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

Überprüfen Sie, ob die erforderlichen Kernel-Einstellungen für die Verwendung von Kpatch aktiviert sind. Alle sollten 'y' zurückgeben.

skripte/config -s DYNAMIC_FTRACE_WITH_REGS
skripte/config -s FUNCTION_TRACER
skripte/config -s HAVE_DYNAMIC_FTRACE_WITH_REGS
Skripte/Konfig -s HAVE_FENTRY
Skripte/Konfiguration -s HAVE_LIVEPATCH
Skripte/Konfig -s KALLSYMS_ALL
Schriftarten/Konfiguration -s KALLSYMS
Schriftzeichen/Konfiguration -s LIVEPATCH
Schriftzeichen/Konfiguration -s MODULES
Schriftarten/Konfiguration -s MODULE_SIG
Schriftzeichen/Konfiguration -s SYSFS
skripte/config -s SYSTEM_TRUSTED_KEYRING

Ändern Sie den Wert eines Kernelkonfigurationseintrags.

scripts/config --set-str SYSTEM_TRUSTED_KEYS ""

Verlassen Sie das Quellverzeichnis.

cd ..

5. Einen Patch erstellen

Eine Patch-Quelldatei ist die Ausgabe des Programms diff für die ursprüngliche und die geänderte Quellcodedatei ausgeführt.

Das Patching-Beispiel, das im Abschnitt "Schnellstart" der kpatch github Seite ändert die Ausgabe von /proc/meminfo. Viele andere Kpatch-Artikel reproduzieren dieses Beispiel, also wollte ich etwas anderes und ein wenig interessanteres, aber immer noch sicheres.

Dieses Beispiel ändert die Ausgabe der uptime um die Illusion zu erwecken, dass die Betriebszeit Ihres Servers um ein Jahrzehnt gestiegen ist.

1. Kopieren Sie eine Datei aus Ihrem Arbeitsverzeichnis.

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

2. Bearbeiten Sie es. In Zeile 26 ändern:

(unsigned long) uptime.tv_sec,

zu

(unsigned long) uptime.tv_sec + 315576000,

Speichern Sie die Datei.

3. Erstellen Sie die Patch-Datei.

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

4. Erstellen Sie das Patch-Modul. (Beim ersten Mal wird dies einige Stunden dauern, da der Kernel-Quellcode kompiliert werden muss. Spätere Builds sind wesentlich schneller, in der Größenordnung von Minuten).

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

 

5. Danach haben Sie eine Datei kpatch-uptime.ko für den Patch, die als Linux-Kernelmodul geladen werden kann.

 

6. Testen Sie das Pflaster

  1. Bevor Sie das Patch-Modul laden, überprüfen Sie die aktuelle Betriebszeit.
    cat /proc/uptime && uptime -p
  2. Laden Sie das Patch-Modul.
    # kpatch load kpatch-uptime.ko
    Lade Patch-Modul: kpatch-uptime.ko
  3. Prüfen Sie die Betriebszeit erneut.
    cat /proc/uptime && uptime -p
  4. Entladen Sie das Patch-Modul.
    # kpatch unload kpatch-uptime.ko
    Deaktivieren des Patch-Moduls: kpatch_uptime
    Entladen des Patch-Moduls: kpatch_uptime
  5. Prüfen Sie, ob die Betriebszeit wieder auf ihren früheren Wert zurückgekehrt ist.
    # cat /proc/uptime && uptime -p
    7215.13 27930.41
    up 2 Stunden

Schlussfolgerung

Wir haben den Prozess des Live-Patchings des Oracle Enterprise Linux 7 - UEK4 Linux-Kernels mit Kpatch durchgearbeitet. Sie können sehen, dass der Prozess an sich recht einfach ist, aber er ist nicht leicht. Und die Entwicklung eines Patches stellt die größte Schwierigkeit dar. Der Patch sollte das System nicht kaputt machen, er sollte mit den vorherigen und nächsten Paketen kompatibel sein. Wenn man dann noch die verschiedenen Kernel-Distributionen und -Versionen, das Testen und den Support hinzurechnet, kommt man zu einem beachtlichen Preis für ein Live-Patching-Tool.

Erhalten Sie eine KOSTENLOSE 7-Tage-Testversion von KernelCare 

 

In unserem expliziten Leitfaden können Sie drei verschiedene Methoden zur Anwendung von Sicherheitspatches für den Linux-Kernel kennenlernen. Der Artikel erklärt, wie Sie Linux-Kernel ohne Neustart aktualisieren können, und behandelt drei verschiedene Methoden für einige der beliebtesten Linux-Kernel.

Möchten Sie das Patchen von Sicherheitslücken ohne Kernel-Neustart, Systemausfallzeiten oder geplante Wartungsfenster automatisieren?

Erfahren Sie mehr über Live-Patching mit TuxCare

Werden Sie ein TuxCare-Gastautor

Los geht's

E-Mail

Beitreten

4,500

Linux & Open Source
Fachleute!

Abonnieren Sie
unseren Newsletter