ClickCease Entwickler-Tutorial: Live-Patching von Ubuntu 20.04 LTS Focal Fossa Linux-Kernel 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 Ubuntu 20.04 LTS Focal Fossa Linux Kernel mit Kpatch

von

23. Juni 2020. TuxCare PR Team

Linux Kernel Live Patching auf Ubuntu 20.04 LTS Focal Fossa Kopie

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:

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ü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 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

  1. (Optional) Erstellen Sie ein Arbeitsverzeichnis und wechseln Sie in dieses.
    mkdir kernel && cd $_
  2. 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

  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 kann einen Linux-Kernel mit denselben Einstellungen kompilieren wie Ihr laufender Kernel.
    cd linux-source-5.4.0/
    cp /boot/config-$(uname -r) .config
  2. Ü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
  3. Ändern Sie den Wert eines Kernelkonfigurationseintrags.
    scripts/config --set-str SYSTEM_TRUSTED_KEYS ""
  4. 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, die sich noch in Ihrem Arbeitsverzeichnis befindet.
    cp linux-source-5.4.0/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 Patchdatei.
    diff -u linux-source-5.4.0/fs/proc/uptime.c ./uptime.c > uptime.patch
  4. Installieren Sie Debugsymbol-Pakete Kernel:

    sudo apt install linux-image-$(uname -r)-dbgsym

  5. 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
  6. 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

  1. Bevor Sie das Patch-Modul laden, überprüfen Sie die aktuelle Betriebszeit.
    cat /proc/uptime && uptime -p
  2. Laden Sie das Patch-Modul.
    sudo kpatch load livepatch-uptime.ko
  3. 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).

  4. Entladen Sie das Patch-Modul.
    sudo kpatch unload livepatch-uptime.ko
  5. 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.

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

Werden Sie ein TuxCare-Gastautor

E-Mail

Helfen Sie uns,
die Linux-Landschaft zu verstehen!

Füllen Sie unsere Umfrage zum Stand von Open Source aus und gewinnen Sie einen von mehreren Preisen, wobei der Hauptpreis mit 500 $ dotiert ist!

Ihr Fachwissen ist gefragt, um die Zukunft von Enterprise Linux zu gestalten!