Kernel-Log – Was 3.7 bringt (3): Infrastruktur

Linux 3.7 kann anhand von Signaturen die Unversehrtheit von Kernel-Modulen prüfen. Die neue Integrity Appraisal Extension verspricht Schadsoftware zu erkennen. Der Kernel lädt Firmwaredateien jetzt ohne Udev und erhielt für Container wichtige Verbesserungen.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 19 Min.
Von
  • Thorsten Leemhuis
Inhaltsverzeichnis

Linux 3.7 kann Kernel-Module signieren und die Signatur vor dem Laden prüfen, um ihre Unversehrtheit sicherzustellen (u. a. 1, 2, 3, 4, 5, 6, 7). Einige Unternehmensdistributionen nutzen solch eine Funktion schon länger – unter anderem, um bei der Fehlersuche sicherzustellen, dass die vom Anwender verwendeten Module auch vom Distributionskernel stammen. Einige Entwickler haben sich jetzt verstärkt um eine Integration der Funktion in den offiziellen Linux-Kernel bemüht, weil einige Distributionen beim Booten per UEFI Secure Boot nur signierte Kernel-Module laden wollen, was mit dem jetzt integrierten Code möglich ist.

Neu ist auch die Integrity Appraisal Extension für die schon länger im Kernel unterstützte Integrity Measurement Architecture (IMA) (u. a, 1, 2). Schon jetzt kann der Linux-Kernel einen signierten Hash von Dateien erstellen und als erweitertes Attribut im Dateisystem speichern, um darüber die Integrität etwa von Binaries zu prüfen. Die Integrity Appraisal Extension sorgt jetzt dafür, dass der Kernel beim Zugriff auf eine Datei deren Integrität prüft und den Zugriff verweigert, wenn die Datei zwischenzeitlich verändert wurde. Das Verhalten des Appraisal-Mechanismus lässt sich über einen Bootparameter konfigurieren.

Um die dafür nötigen Prüfdaten sicher abzulegen, kann die Erweiterung ein Trusted Platform Module (TPM) nutzen; die Unterstützung dafür haben die Kernel-Entwickler parallel weiter ausgebaut (u. a. 1, 2).

Der Kernel kann Firmwaredateien nun selbst im Dateisystem finden und laden und ist dafür nicht mehr auf Udev angewiesen (1, 2). Diese Neuerung ist Folge einer zuvor vorgenommenen Änderungen am Firmware-Handling von Udev, die in einem bestimmten Fall Verzögerungen beim Systemstart nach sich zog. Dies Verhalten führte zu einer längeren Diskussion, in der Linus Torvalds die Udev-Entwickler deutlich kritisierte – das führte nicht nur zur Entwicklung des Kernel-eigenen Firmware-Loaders, sondern war auch einer der Gründe für den Udev-Fork Eudev.

Udev-Maintainer Kay Sievers hatte bereits vor Umsetzung der Kernel-Änderung erklärt, er fände es gut, wenn der Kernel Firmwaredateien selbst laden könne; gegenüber heise open erläuterte er, dieser Weg sei einfacher und deutlich verlässlicher als die Handhabung durch Udev im Userspace. Eine mittlerweile in Udev eingeflossene Änderung behebt die Verzögerung beim Laden durch Udev ebenfalls.

Eric W. Biederman hat eine größere Patch-Sammlung eingebracht, welche die Unterstützung für Namespaces verbessert (u. a. 1, 2, 3, 4). Das ist für eine striktere Trennung von User- und Gruppen-IDs zwischen Host und Containern wichtig. Die Anpassungen setzen auf den "User Namespace Enhancements" auf, die Biederman zu Linux 3.5 beigesteuert hat und die er damals als Kurskorrektur für User Namespaces bezeichnete.

Durch die jetzigen Änderungen sei nun alles auf den neuen Ansatz angepasst, wenn man von den komplexeren Dateisystemen absehe; dazu zählten CIFS, NFS, OCFS2 und XFS. Die Anpassungen für diese Dateisysteme sind in Entwicklung und folgen vielleicht bei Linux 3.8. Biederman hat noch eine weitere Patch-Sammlung in Vorbereitung, welche die größeren Umbauten am Namespace-Code abschließen soll; durch sie soll die neue Infrastruktur dann komplett sein, sodass User einen Namespace anlegen und nutzen können.

Die unter anderem für Container genutzte Cgroups-Infrastuktur warnt jetzt, wenn der Anwender innerhalb einer Control Group eine verschachtelt Hierarchie anlegt, der verwendete Controller dieses Nesting aber nicht sauber unterstützt. Letzteres ist eines von vielen Problemen im Cgroup-Code, deren mittelfristige Beseitigung Cgroup-Betreuer Tejun Heo derzeit vorantreibt. Neu ist auch Unterstützung für Erweiterte Attribute im virtuellen Cgroup-Dateisystem (1, 2) – eine Funktion, die Systemd-Entwickler Lennart Poettering auf die "Plumber's wish list" gesetzt hatte, um Metadaten für Hintergrunddienste speichern zu können.

Linus Torvalds hat eigenhändig die Datei Documentation/feature-removal.txt entfernt, in der zuvor die Entfernung von Kernel-Features angekündigt wurde. Torvalds bezeichnet sie im Commit-Kommentar als idiotisch: Wenn niemand ein Feature benutze, dann könne man es direkt entfernen; wenn das nicht der Fall sei, dann gäbe es keinen Grund, etwas zu entfernen.

Der Make-Target, um bei der Kernel-Konfiguration die Standardvorgabe für alle bislang nicht gesetzten Konfigurationsoptionen zu setzen, heißt nun "olddefconfig" – laut dem Entwickler der Änderung hat der bisher für diese Funktion verwendete Target-Name "oldnoconfig" Anwender verwirrt, weil er nicht das umsetzt, worauf der Name hindeutet.

Die Sicherheitserweiterung Yama lässt sich jetzt zusammen mit anderen Linux Security Modules verwenden, um die Yama-Schutzfunktionen etwa mit jenen von SELinux zu kombinieren.

Durch Änderungen beim koordinierten Datenzugriff mit Hilfe von RCU (Read Copy Update) tauchen in der Prozessliste nun Kernel-Threads wie rcu_sched, rcu_preempt oder rcu_bh auf, die laut Programmen wie ps oder top auf manchen Systemen recht viel CPU-Zeit verbrauchen. Diese Prozessorzeit hat der RCU-Code auch schon vorher verbraucht – sie wurden allerdings dem Kernel-Thread ksoftirqd zugeordnert. Das und einige weitere Hintergründe zu Änderungen am RCU-Code erläutert dessen Maintainer Paul McKenney in einem LWN.net-Artikel.

Der Kernel bindet das typischerweise unter /debug/ oder /sys/kernel/debug/ eingehängte Debugfs standardmäßig mit 0700-Rechten ein, damit normalerweise nur noch der Root-Anwender dort lesen kann.

Zum Kernel stieß eine generische Implementation einer einfachen Hash Table. Sie soll bei späteren Kernel-Versionen eine Reihe anderer Implementierungen ersetzen, die in verschiedenen Subsystemen des Kernels entstanden sind und so bislang unabhängig voneinander ganz ähnliche Funktionen erledigten.

Workqueues sind jetzt standardmäßig non-reentrant, sodass der gleiche Code nicht mehr gleichzeitig auf mehreren Prozessoren läuft. Die parallele Ausführung von Workqueues war vielen Entwicklern nicht bewusst, sodass dieser Code häufig nicht wie erwartet funktionierte.

Die Kernel-Entwickler haben begonnen, von Userland-Software verwendete Header-Dateien mit Datentypen-Definitionen in "uapi" genannte Verzeichnisse zu verlagern, die unterhalb von include/ und arch/<arch>/include/ liegen (u. a. 1, 2, 3). Das soll die Unterscheidung von den Kernel-intern genutzten Definitionen erleichtern und einige Probleme beim Einbinden von Header-Dateien aus der Welt schaffen. Diese Umstrukturierung ist einer der Hauptgründe, warum ein Diffstat beim Vergleich mit Linux 3.6 so viele Änderungen ausweist.