Entwickler-Tutorial: Live-Patching von Ubuntu 20.04 LTS Focal Fossa Linux Kernel mit Kpatch
Live-Patching ist eine Möglichkeit, einen Linux-Kernel ohne Unterbrechung zu aktualisieren. Da Kernel-Updates erst nach einem Neustart des Systems wirksam werden, wird das Live-Patching des Linux-Kernels meist dazu verwendet, schwerwiegende Sicherheitslücken im Linux-Kernel zu schließen, ohne die Server neu zu starten.
Abgesehen von der verbesserten Servicekontinuität und Betriebszeit nutzen Unternehmen mit großen Serverflotten das Live-Patching auch, um den Verwaltungsaufwand zu vermeiden, der mit der Koordination und Planung des Neustarts mehrerer Systeme verbunden ist.
Dieses Tutorial zeigt, wie man Kpatch verwendet, um das Verhalten eines laufenden Ubuntu 20.04 LTS Focal Fossa 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 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:
- Canonical Livepatch Service für Ubuntu;
- KernelCare für die meisten gängigen Linux-Distributionen;
- Ksplice für Oracle Linux;
- SUSE Live Patching (früher bekannt als Kgraft) für SUSE Enterprise Linux.
Erhalten Sie eine KOSTENLOSE 7-Tage-Testversion von KernelCare
Wir haben Kpatch für dieses Tutorial ausgewählt, weil es eine der wenigen Lösungen ist, deren Quellcode frei verfügbar ist und regelmäßig aktualisiert wird. Wir haben ein weiteres Tutorial über Live-Patching des Debian 10 Linux-Kernels mit Kpatch - schauen Sie es sich auch an.
Voraussetzungen
Hier sind die Systemvoraussetzungen für die Teilnahme an diesem Lernprogramm.
- Ein Testsystem (nicht produktiv) mit Ubuntu 20.04 Focal Fossa 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ürCONFIG_HAVE_LIVEPATCH
undCONFIG_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-check
obwohl 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
- Um die installierte Version von gcc zu sehen:
1. Abhängigkeitspakete installieren
- 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). - Pakete installieren.
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-quelle flex bison
2. Kpatch installieren
Das kpatch-Paket von Focal Fossa ist nicht mehr aktuell, daher müssen Sie es aus den Quellen installieren.
git clone https://github.com/dynup/kpatch.git
cd kpatch && make && sudo make install
3. Besorgen Sie sich eine Kopie des Quellcodes des Linux-Kernels
- (Optional) Erstellen Sie ein Arbeitsverzeichnis und wechseln Sie in dieses.
mkdir kernel && cd $_
- Extrahieren Sie den Quellcode des Linux-Kernels.
tar xaf /usr/src/linux-source-5.4.0.tar.bz2
Hinweis: 5.4.0 ist die Version des Linux-Kernels für Ubuntu 20.04 zum Zeitpunkt der Erstellung dieses Dokuments. Sie sollten die neueste Version in /usr/src überprüfen und ersetzen.
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 so
kpatch-build
kann einen Linux-Kernel mit denselben Einstellungen kompilieren 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.
- Kopieren Sie eine Datei, die sich noch in Ihrem Arbeitsverzeichnis befindet.
cp linux-source-5.4.0/fs/proc/uptime.c .
- Bearbeiten Sie es. In Zeile 26 ändern:
(unsigned long) uptime.tv_sec,
zu
(unsigned long) uptime.tv_sec + 315576000,
Speichern Sie die Datei.
- Erstellen Sie die Patchdatei.
diff -u linux-source-5.4.0/fs/proc/uptime.c ./uptime.c > uptime.patch
- Installieren Sie Debugsymbol-Pakete Kernel:
sudo apt install linux-image-$(uname -r)-dbgsym
- 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
- Wenn Sie fertig sind, haben Sie ein Linux Ladbares Kernel-Modul Datei (
.ko
) für den Patch.ls -l *.ko
6. Testen Sie das Pflaster
- Bevor Sie das Patch-Modul laden, überprüfen Sie die aktuelle Betriebszeit.
cat /proc/uptime && uptime -p
- Laden Sie das Patch-Modul.
sudo kpatch load livepatch-uptime.ko
- 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).
- Entladen Sie das Patch-Modul.
sudo kpatch unload livepatch-uptime.ko
- 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 liegt darin, einen Patch zu schreiben, der das System nicht zum Absturz bringt und mit anderen Patches, die später kommen, zusammenarbeitet. Die meisten Patches werden aus mehr als einem einfachen diff
und müssen gründlich über mehrere Kernel-Versionen auf verschiedenen Distributionen getestet werden.
Patch-Autoren müssen sowohl versierte C-Programmierer als auch erfahrene Linux-Kernel-Entwickler sein, und die Kompilierung des Kernels und das Testen von Patches für jede Kernel-Version erfordert hohe Investitionen in Hardware und Automatisierungstools. Die Seltenheit der Fähigkeiten und die Kosten für die Infrastruktur bedeuten, dass die Anbieter für Live-Patching-Dienste Gebühren verlangen müssen.
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.