ClickCease Entwickler-Tutorial: Live-Patching von Debian 10 Linux-Kernel-Kpatch

Inhaltsübersicht

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 des Debian 10 Linux-Kernels mit Kpatch

Januar 27, 2023 - TuxCare PR Team

Live-Patching ist eine Methode zur Aktualisierung eines Linux-Kernels, ohne dass der Kernel neu gestartet werden muss - und somit ohne dass der Rechner neu gestartet werden muss. Live-Patching wird häufig verwendet, um schwere Sicherheitslücken im Linux-Kernel ohne Verzögerung zu schließen, da Live-Patching keine Unterbrechungen verursacht und kein Wartungsfenster erfordert.

Es gibt einige Live-Patching-Werkzeuge, und Benutzer des Debian-Betriebssystems wenden sich manchmal an kpatch, um Live-Patching zu implementieren - oder um den Kernel zu optimieren.

Dieses Tutorium ist eine praktische Demonstration von kpatch. Wir werden demonstrieren, wie man kpatch benutzt, um das Verhalten eines laufenden Debian 10 Kernels zu ändern, ohne ihn zu stoppen, indem man den Inhalt von /proc/uptime (und die uptime Befehl), so dass die gemeldete Betriebszeit des Systems 10 Jahre länger ist.

kpatch wurde von Red Hat entwickelt und funktioniert auf Red Hat Enterprise Linux (RHEL) und seinen Derivaten. Red Hat bietet diesen kommerziellen Live-Patching-Service für RHEL-Kunden an. Bei TuxCare bieten wir KernelCare Enterprise - an, das in der Lage ist, sowohl RHEL als auch jede andere beliebte Linux-Distribution für Unternehmen live zu patchen.

Ich habe kpatch für dieses Tutorial gewählt, weil sein Quellcode frei 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 Debian Bullseye (11.6 wurde für diese Demo verwendet) auf einer x86_64/amd64-Architektur
  • 20 GB freier Festplattenspeicher (der Quellcode des Linux-Kernels nimmt etwa 909 MB auf der Festplatte ein 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
    • So sehen Sie die Version von gcc, die zum Kompilieren des aktuellen Kernels verwendet wurde: cat /proc/version
  1. Abhängigkeits-Pakete installieren

  1. Installieren und konfigurieren sudo

Als Wurzel:

  apt-get install sudo 

  (sudo should already be installed, but this makes sure of it)

  adduser <user> sudo
  where <user> is the username for a normal user (all subsequent commands should be done as this user)

     2.installieren Sie Pakete

  3.sudo apt-get -y update

  4.sudo apt-get -y upgrade

  5.sudo apt-get -y install build-essential devscripts ccache gawk libelf-dev libssl-dev linux-source linux-image-$(uname -r)-dbg 

  1. kpatch installieren

Wie bei Debian-Paketen üblich, gibt es eine Verzögerung zwischen den aktuellen Versionen und den Versionen, die als Aktualisierungen über das reguläre apt angeboten werden. Nehmen wir den aktuellsten kpatch-Code und bauen ihn aus den Quellen.

git clone https://github.com/dynup/kpatch.git
cd kpatch && make && sudo make install
  1. Erhalten Sie eine Kopie des Linux-Kernel-Quellcodes

  1. (Optional) Erstellen und Verschieben in ein Arbeitsverzeichnis
mkdir kernel && cd $_
  1. Extrahieren Sie den Quellcode des Linux-Kernels
tar xaf /usr/src/linux-source-5.10.tar.xz

Hinweis: 5.10 ist die Version des Linux-Kernels für Debian 11.6 zum Zeitpunkt der Erstellung dieses Artikels. Sie sollten die neueste Version überprüfen und durch die in /usr/src

  1. Die Linux-Kernel-Konfigurationsdatei erstellen

  1. 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 so kpatch-build einen Linux-Kernel mit denselben Einstellungen kompilieren kann wie Ihr laufender Kernel.
  2. cd linux-source-5.10

cp /boot/config-$(uname -r) .config

  1. Prüfen Sie, ob die erforderlichen Kernel-Einstellungen für die Verwendung von kpatch aktiviert sind. Alle sollten 'y' zurückgeben.
  2. scripts/config -s DYNAMIC_FTRACE_WITH_REGS
  3. skripte/config -s FUNCTION_TRACER
  4. scripts/config -s HAVE_DYNAMIC_FTRACE_WITH_REGS
  5. skripte/config -s HAVE_FENTRY
  6. skripte/config -s HAVE_LIVEPATCH
  7. scripts/config -s KALLSYMS_ALL
  8. scripts/config -s KALLSYMS_ALL
  9. skripte/config -s LIVEPATCH
  10. skripte/config -s MODULEN
  11. skripte/config -s MODULE_SIG
  12. skripte/config -s SYSFS
scripts/config -s SYSTEM_TRUSTED_KEYRING
  1. Ändern Sie den Wert eines Kernel-Konfigurationspunktes
scripts/config --set-str SYSTEM_TRUSTED_KEYS ""
  1. Verlassen Sie das Quellverzeichnis
cd .
  1. Einen Patch erstellen

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

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

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

  1. Kopieren Sie noch in Ihrem Arbeitsverzeichnis die Datei
cp linux-source-4.19/fs/proc/uptime.c .
  1. Bearbeiten Sie es. In Zeile 33, ändern:
(unsigned long) uptime.tv_sec,

zu

(unsigned long) uptime.tv_sec + 315576000,

Speichern Sie die Datei
  1. Erstellen Sie die Patchdatei
diff -u linux-source-5.10/fs/proc/uptime.c ./uptime.c > uptime.patch
  1. Erstellen Sie das Patch-Modul. (Wenn Sie dies zum ersten Mal tun, wird es einige Zeit dauern, da der Kernel-Quellcode kompiliert werden muss. Nachfolgende Builds sind wesentlich schneller, in der Größenordnung von Minuten. Dies ist einer der Vorgänge, bei denen es hilfreich ist, mehr (virtuelle) CPUs auf das Problem zu hetzen, um den Prozess zu beschleunigen. Es ist eine CPU-gebundene Aufgabe).
kpatch-build -s linux-source-5.10 -v /usr/lib/debug/lib/modules/$(uname -r)/vmlinux uptime.patch
  1. Wenn Sie fertig sind, haben Sie ein Linux ladbares Kernel-Modul Datei (.ko) für den Patch
ls -l *.ko
  1. Testen Sie den Patch

  1. Bevor Sie das Patch-Modul laden, prüfen Sie die aktuelle Betriebszeit
cat /proc/uptime && uptime -p
  1. Laden Sie das Patch-Modul
sudo kpatch load livepatch-uptime.ko
  1. Prüfen Sie die Betriebszeit erneut
cat /proc/uptime && uptime -p

Sie sollten sehen, dass Ihre Betriebszeit um zehn Jahre besser ist (der interne Wert wurde nicht geändert, nur das, was gedruckt wird)

  1. Entladen Sie das Patch-Modul
sudo kpatch unload livepatch-uptime.ko
  1. Prüfen Sie, ob die Betriebszeit wieder auf ihren früheren Wert zurückgekehrt ist
cat /proc/uptime && uptime -p

Schlussfolgerung

Das Live-Patching des Linux-Kernels mit kpatch ist nicht schwer. Die Schwierigkeit besteht darin, einen Patch zu schreiben, der das System nicht zum Absturz bringt und der mit anderen Patches, die später kommen, zusammenarbeitet. Die meisten Patches werden aus mehr als einem einfachen diff erstellt und müssen gründlich mit mehreren Kernelversionen auf verschiedenen Distributionen getestet werden.

Patch-Autoren müssen sowohl versierte C-Programmierer als auch erfahrene Linux-Kernel-Entwickler sein. Die Kompilierung des Kernels und das Testen von Patches für jede Kernel-Version erfordert eine große Investition in Hardware und Automatisierungswerkzeuge. 

Die Seltenheit von Fachkenntnissen und die Kosten für die Infrastruktur bedeuten, dass die Anbieter für Live-Patching-Dienste Gebühren erheben müssen, die oft über teure Wartungsprogramme bereitgestellt werden.

Diese Kosten summieren sich zu hohen Summen, aber das ist nicht der Fall mit dem Live-Patching-Service von TuxCare, der für Linux bereits ab 59,50 $/Server/Jahr erhältlich ist. Klicken Sie hier und lesen Sie mehr über das Angebot von TuxCare an Live-Patching-Services für den Linux-Kernel, Datenbanken, Shared Libraries, IoT-Geräte und Virtualisierungssysteme.

Und vergessen Sie nicht, unseren ausführlichen Leitfaden zur Anwendung von Linux-Kernel-Sicherheitspatches zu lesen : 3 verschiedene Wege. 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.

Zusammenfassung
Entwickler-Tutorial: Live-Patching von Debian 10 Linux-Kernel-Kpatch
Artikel Name
Entwickler-Tutorial: Live-Patching von Debian 10 Linux-Kernel-Kpatch
Beschreibung
Dieses Tutorial ist eine praktische Demonstration von kpatch. Wir werden zeigen, wie man damit das Verhalten eines laufenden Debian 10-Kernels ändern kann
Autor
Name des Herausgebers
TuxCare
Logo des Herausgebers

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