Live Patches: Unterschied zwischen den Versionen
| Zeile 54: | Zeile 54: | ||
*cd kpatch && make && sudo make install | *cd kpatch && make && sudo make install | ||
| − | Eine Kopie des Linux-Kernel-Quellcodes erhalten | + | =Eine Kopie des Linux-Kernel-Quellcodes erhalten= |
(Optional) Erstellen Sie ein Arbeitsverzeichnis und wechseln Sie in dieses Verzeichnis | (Optional) Erstellen Sie ein Arbeitsverzeichnis und wechseln Sie in dieses Verzeichnis | ||
| − | mkdir kernel && cd $_ | + | *mkdir kernel && cd $_ |
| − | Extrahieren Sie den Linux-Kernel-Quellcode | + | *Extrahieren Sie den Linux-Kernel-Quellcode |
| − | tar xaf /usr/src/linux-source-5.10.tar.xz | + | *tar xaf /usr/src/linux-source-5.10.tar.xz |
| + | |||
Hinweis: 5.10 ist die Linux-Kernel-Version für Debian 11.6 zum Zeitpunkt des Schreibens. Sie sollten die neueste Version überprüfen und die vorhandene Version in /usr/src ersetzen | Hinweis: 5.10 ist die Linux-Kernel-Version für Debian 11.6 zum Zeitpunkt des Schreibens. Sie sollten die neueste Version überprüfen und die vorhandene Version in /usr/src ersetzen | ||
| − | Erstellen der Konfigurationsdatei des Linux-Kernels | + | =Erstellen der Konfigurationsdatei des Linux-Kernels= |
Der Linux-Kernel wird mit Einstellungen in einer Konfigurationsdatei kompiliert, die mit Ihrer Distribution geliefert wird. Erstellen Sie eine Kopie und ändern Sie einige Einstellungen, damit kpatch-build einen Linux-Kernel mit denselben Einstellungen wie Ihren laufenden Kernel kompilieren kann. | Der Linux-Kernel wird mit Einstellungen in einer Konfigurationsdatei kompiliert, die mit Ihrer Distribution geliefert wird. Erstellen Sie eine Kopie und ändern Sie einige Einstellungen, damit kpatch-build einen Linux-Kernel mit denselben Einstellungen wie Ihren laufenden Kernel kompilieren kann. | ||
cd linux-source-5.10 | cd linux-source-5.10 | ||
| Zeile 79: | Zeile 80: | ||
scripts/config -s SYSFS | scripts/config -s SYSFS | ||
scripts/config -s SYSTEM_TRUSTED_KEYRING | scripts/config -s SYSTEM_TRUSTED_KEYRING | ||
| − | Ändern Sie den Wert eines Kernel-Konfigurationselements | + | =Ändern Sie den Wert eines Kernel-Konfigurationselements |
scripts/config --set-str SYSTEM_TRUSTED_KEYS "" | scripts/config --set-str SYSTEM_TRUSTED_KEYS "" | ||
Verlassen Sie das Quellverzeichnis | Verlassen Sie das Quellverzeichnis | ||
| Zeile 100: | Zeile 101: | ||
Speichern Sie die Datei | Speichern Sie die Datei | ||
Erstellen Sie die Patch-Datei | Erstellen Sie die Patch-Datei | ||
| + | |||
diff -u linux-source-5.10/fs/proc/uptime.c ./uptime.c > uptime.patch | diff -u linux-source-5.10/fs/proc/uptime.c ./uptime.c > uptime.patch | ||
| + | |||
Erstellen Sie das Patch-Modul. (Beim ersten Mal dauert dies einige Zeit, da der Kernel-Quellcode kompiliert werden muss. Nachfolgende Builds sind erheblich schneller, im Bereich von Minuten. Dies ist eine dieser Operationen, bei denen es hilft, mehr (virtuelle) CPUs zu haben, um den Prozess zu beschleunigen. Es handelt sich um eine CPU-intensive Aufgabe). | Erstellen Sie das Patch-Modul. (Beim ersten Mal dauert dies einige Zeit, da der Kernel-Quellcode kompiliert werden muss. Nachfolgende Builds sind erheblich schneller, im Bereich von Minuten. Dies ist eine dieser Operationen, bei denen es hilft, mehr (virtuelle) CPUs zu haben, um den Prozess zu beschleunigen. Es handelt sich um eine CPU-intensive Aufgabe). | ||
| − | kpatch-build -s linux-source-5.10 -v /usr/lib/debug/lib/modules/$(uname -r)/vmlinux uptime.patch | + | |
| + | *kpatch-build -s linux-source-5.10 -v /usr/lib/debug/lib/modules/$(uname -r)/vmlinux uptime.patch | ||
Wenn der Vorgang abgeschlossen ist, haben Sie eine Linux Loadable Kernel Module-Datei (.ko) für den Patch | Wenn der Vorgang abgeschlossen ist, haben Sie eine Linux Loadable Kernel Module-Datei (.ko) für den Patch | ||
ls -l *.ko | ls -l *.ko | ||
| − | Den Patch testen | + | =Den Patch testen= |
Vor dem Laden des Patch-Moduls überprüfen Sie die aktuelle Betriebszeit | Vor dem Laden des Patch-Moduls überprüfen Sie die aktuelle Betriebszeit | ||
| − | cat /proc/uptime && uptime -p | + | *cat /proc/uptime && uptime -p |
Laden Sie das Patch-Modul | Laden Sie das Patch-Modul | ||
| − | sudo kpatch load livepatch-uptime.ko | + | *sudo kpatch load livepatch-uptime.ko |
Überprüfen Sie erneut die Betriebszeit | Überprüfen Sie erneut die Betriebszeit | ||
| − | cat /proc/uptime && uptime -p | + | *cat /proc/uptime && uptime -p |
Sie sollten feststellen, dass Ihre Betriebszeit um zehn Jahre verbessert wurde (der interne Wert wurde nicht geändert, nur das, was gedruckt wird) | Sie sollten feststellen, dass Ihre Betriebszeit um zehn Jahre verbessert wurde (der interne Wert wurde nicht geändert, nur das, was gedruckt wird) | ||
| − | Entladen Sie das Patch-Modul | + | =Entladen Sie das Patch-Modul= |
| − | sudo kpatch unload livepatch-uptime.ko | + | *sudo kpatch unload livepatch-uptime.ko |
Überprüfen Sie, ob die Betriebszeit zu ihrem früheren Wert zurückgekehrt ist | Überprüfen Sie, ob die Betriebszeit zu ihrem früheren Wert zurückgekehrt ist | ||
| − | cat /proc/uptime && uptime -p | + | *cat /proc/uptime && uptime -p |
| − | Fazit | + | |
| + | =Fazit= | ||
Das Live-Patching des Linux-Kernels mit Kpatch ist nicht schwierig. Die Schwierigkeit besteht darin, einen Patch zu schreiben, der das System nicht zum Absturz bringt und mit anderen Patches funktioniert, die später kommen. Die meisten Patches werden aus mehr als einem einfachen diff erstellt und müssen gründlich auf verschiedenen Kernelversionen und Distributionen getestet werden. | Das Live-Patching des Linux-Kernels mit Kpatch ist nicht schwierig. Die Schwierigkeit besteht darin, einen Patch zu schreiben, der das System nicht zum Absturz bringt und mit anderen Patches funktioniert, die später kommen. Die meisten Patches werden aus mehr als einem einfachen diff erstellt und müssen gründlich auf verschiedenen Kernelversionen und Distributionen getestet werden. | ||
| Zeile 128: | Zeile 133: | ||
Und vergessen Sie nicht, unseren ausführlichen Leitfaden zum Anwenden von Linux-Kernel-Sicherheitspatches zu lesen: 3 verschiedene Methoden. Der Artikel erklärt, wie Sie Linux-Kernel aktualisieren können, ohne neu zu starten, und behandelt drei verschiedene Methoden für einige der beliebtesten Linux-Kernel. | Und vergessen Sie nicht, unseren ausführlichen Leitfaden zum Anwenden von Linux-Kernel-Sicherheitspatches zu lesen: 3 verschiedene Methoden. Der Artikel erklärt, wie Sie Linux-Kernel aktualisieren können, ohne neu zu starten, und behandelt drei verschiedene Methoden für einige der beliebtesten Linux-Kernel. | ||
| + | |||
| + | =Quell= | ||
| + | *https://tuxcare.com/blog/developer-tutorial-live-patching-debian-10-linux-kernel-with-kpatch/#test | ||
Version vom 26. Juni 2023, 16:55 Uhr
Entwickler-Tutorial
Live-Patching des Debian 10 Linux-Kernels mit Kpatch
- Aus dem Englischen von Stephan Venter
Live-Patching ist eine Methode zum Aktualisieren eines Linux-Kernels, ohne den Kernel neu zu starten - und daher ohne die Notwendigkeit, die Maschine neu zu booten. Live-Patching wird häufig verwendet, um schwerwiegende Linux-Kernel-Sicherheitslücken ohne Verzögerung zu patchen, da Live-Patching keine Unterbrechung verursacht und kein Wartungsfenster erfordert.
Es gibt einige Live-Patching-Tools da draußen, und Benutzer des Debian-Betriebssystems greifen manchmal auf Kpatch zurück, um Live-Patching durchzuführen - oder um den Kernel anzupassen.
Dieses Tutorial ist eine praktische Demonstration von Kpatch. Wir zeigen, wie man Kpatch verwendet, um das Verhalten eines laufenden Debian 10-Kernels ohne Anhalten zu ändern. Dabei ändern wir den Inhalt von /proc/uptime (und des uptime-Befehls), sodass die gemeldete Betriebszeit des Systems um 10 Jahre erhöht wird.
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 sowohl RHEL als auch jede andere gängige Enterprise-Linux-Distribution live patchen kann.
Ich habe mich für Kpatch in diesem Tutorial entschieden, weil der Quellcode frei verfügbar und regelmäßig aktualisiert wird.
Voraussetzungen
Hier sind die Systemvoraussetzungen, um diesem Tutorial zu folgen:
- Ein Testsystem (nicht für die Produktion) mit Debian Bullseye (für diese Demo wurde 11.6 verwendet) auf einer x86_64/amd64-Architektur
- 20 GB freier Festplattenspeicher (der Linux-Kernel-Quellcode belegt auf der Festplatte etwa 909 MB und wächst beim Kompilieren auf 17 GB an)
Ihr Kernel wurde nicht angepasst; Sie verwenden den Standard-Kernel, der von Debian bereitgestellt wird Ihr Kernel verfügt über eingebautes Live-Patching. Verwenden Sie diesen Befehl und erwarten Sie, dass für CONFIG_HAVE_LIVEPATCH und CONFIG_LIVEPATCH zwei Werte auf "y" gesetzt sind: grep LIVEPATCH /boot/config-$(uname -r)
Die installierte Version von gcc entspricht der Version, mit der der ursprüngliche Kernel kompiliert wurde (Der kpatch-build-Befehl schlägt fehl, wenn die Versionen nicht übereinstimmen. Dies kann mit der Option --skip-gcc-check außer Kraft gesetzt werden, aber deren Verwendung wird nicht empfohlen.)
Die installierte Version von gcc finden Sie mit: gcc --version
Die Version von gcc, die zur Kompilierung des aktuellen Kernels verwendet wurde, finden Sie mit: cat /proc/version Installieren der Abhängigkeitspakete Installieren und Konfigurieren von sudo
Als Root:
apt-get install sudo
(sudo sollte bereits installiert sein, aber dies stellt sicher, dass es vorhanden ist)
adduser <user> sudo wobei <user> der Benutzername für einen normalen Benutzer ist (alle nachfolgenden Befehle sollten als dieser Benutzer ausgeführt werden) Installieren von Paketen
- sudo apt-get -y update
- sudo apt-get -y upgrade
- sudo apt-get -y install build-essential devscripts ccache gawk libelf-dev libssl-dev linux-source linux-image-$(uname -r)-dbg
Kpatch installieren
Wie bei den Paketen von Debian üblich gibt es eine Verzögerung zwischen den aktuellen Versionen und den Versionen, die als Updates über das reguläre apt angeboten werden. Holen wir uns den neuesten Kpatch-Code und bauen ihn aus dem Quellcode.
- git clone https://github.com/dynup/kpatch.git
- cd kpatch && make && sudo make install
Eine Kopie des Linux-Kernel-Quellcodes erhalten
(Optional) Erstellen Sie ein Arbeitsverzeichnis und wechseln Sie in dieses Verzeichnis
- mkdir kernel && cd $_
- Extrahieren Sie den Linux-Kernel-Quellcode
- tar xaf /usr/src/linux-source-5.10.tar.xz
Hinweis: 5.10 ist die Linux-Kernel-Version für Debian 11.6 zum Zeitpunkt des Schreibens. Sie sollten die neueste Version überprüfen und die vorhandene Version in /usr/src ersetzen
Erstellen der Konfigurationsdatei des Linux-Kernels
Der Linux-Kernel wird mit Einstellungen in einer Konfigurationsdatei kompiliert, die mit Ihrer Distribution geliefert wird. Erstellen Sie eine Kopie und ändern Sie einige Einstellungen, damit kpatch-build einen Linux-Kernel mit denselben Einstellungen wie Ihren laufenden Kernel kompilieren kann. cd linux-source-5.10 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. 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_ALL scripts/config -s LIVEPATCH scripts/config -s MODULES scripts/config -s MODULE_SIG scripts/config -s SYSFS scripts/config -s SYSTEM_TRUSTED_KEYRING =Ändern Sie den Wert eines Kernel-Konfigurationselements scripts/config --set-str SYSTEM_TRUSTED_KEYS "" Verlassen Sie das Quellverzeichnis cd .. Ein Patch erstellen Eine Patch-Quelldatei ist die Ausgabe des diff-Befehls, der auf den ursprünglichen und geänderten Quellcodedateien ausgeführt wird.
Das Patch-Beispiel, das im Abschnitt "Schnellstart" der Kpatch-Github-Seite gezeigt wird, ändert die Ausgabe von /proc/meminfo. Viele andere Kpatch-Artikel reproduzieren dieses Beispiel, daher wollte ich etwas anderes und etwas interessanteres, aber dennoch sicheres.
Dieses Beispiel ändert die Ausgabe des uptime-Befehls, um den Eindruck zu erwecken, dass die Betriebszeit Ihres Servers um ein Jahrzehnt erhöht wurde.
Kopieren Sie in Ihrem Arbeitsverzeichnis eine Datei cp linux-source-4.19/fs/proc/uptime.c . Bearbeiten Sie die Datei. Ändern Sie in Zeile 33: (unsigned long) uptime.tv_sec, in
(unsigned long) uptime.tv_sec + 315576000,
Speichern Sie die Datei Erstellen Sie die Patch-Datei
diff -u linux-source-5.10/fs/proc/uptime.c ./uptime.c > uptime.patch
Erstellen Sie das Patch-Modul. (Beim ersten Mal dauert dies einige Zeit, da der Kernel-Quellcode kompiliert werden muss. Nachfolgende Builds sind erheblich schneller, im Bereich von Minuten. Dies ist eine dieser Operationen, bei denen es hilft, mehr (virtuelle) CPUs zu haben, um den Prozess zu beschleunigen. Es handelt sich um eine CPU-intensive Aufgabe).
- kpatch-build -s linux-source-5.10 -v /usr/lib/debug/lib/modules/$(uname -r)/vmlinux uptime.patch
Wenn der Vorgang abgeschlossen ist, haben Sie eine Linux Loadable Kernel Module-Datei (.ko) für den Patch ls -l *.ko
Den Patch testen
Vor dem Laden des Patch-Moduls überprüfen Sie die aktuelle Betriebszeit
- cat /proc/uptime && uptime -p
Laden Sie das Patch-Modul
- sudo kpatch load livepatch-uptime.ko
Überprüfen Sie erneut die Betriebszeit
- cat /proc/uptime && uptime -p
Sie sollten feststellen, dass Ihre Betriebszeit um zehn Jahre verbessert wurde (der interne Wert wurde nicht geändert, nur das, was gedruckt wird)
Entladen Sie das Patch-Modul
- sudo kpatch unload livepatch-uptime.ko
Überprüfen Sie, ob die Betriebszeit zu ihrem früheren Wert zurückgekehrt ist
- cat /proc/uptime && uptime -p
Fazit
Das Live-Patching des Linux-Kernels mit Kpatch ist nicht schwierig. Die Schwierigkeit besteht darin, einen Patch zu schreiben, der das System nicht zum Absturz bringt und mit anderen Patches funktioniert, die später kommen. Die meisten Patches werden aus mehr als einem einfachen diff erstellt und müssen gründlich auf verschiedenen Kernelversionen und Distributionen getestet werden.
Patch-Autoren müssen sowohl erfahrene C-Programmierer als auch erfahrene Linux-Kernel-Entwickler sein. Das Kompilieren des Kernels und das Testen von Patches für jede Kernelversion erfordert eine große Investition in Hardware und Automatisierungswerkzeuge.
Die Seltenheit von Fähigkeiten und die Kosten für die Infrastruktur bedeuten, dass Anbieter für Live-Patching-Dienste Gebühren erheben müssen, die oft über teure Wartungsprogramme bereitgestellt werden.
Diese Kosten summieren sich zu beträchtlichen Summen, aber das gilt nicht für den Live-Patching-Service von TuxCare - der bereits ab 59,50 USD/Server/Jahr für Linux verfügbar ist. Klicken Sie hier, um mehr über das Angebot von TuxCare an Live-Patching-Diensten für den Linux-Kernel, Datenbanken, Shared Libraries, IoT-Geräte und Virtualisierungssysteme zu erfahren.
Und vergessen Sie nicht, unseren ausführlichen Leitfaden zum Anwenden von Linux-Kernel-Sicherheitspatches zu lesen: 3 verschiedene Methoden. Der Artikel erklärt, wie Sie Linux-Kernel aktualisieren können, ohne neu zu starten, und behandelt drei verschiedene Methoden für einige der beliebtesten Linux-Kernel.