LFD440 Linux Kernel Debugging and Security
Classroom Schulung | Deutsch | Anspruch
Schulungsdauer: 4 Tage
Ziele
Lernen Sie die grundlegenden Methoden und die interne Infrastruktur des Linux-Kernels kennen, indem Sie sowohl die theoretischen als auch die praktischen Underpinnings verstehen. Lassen Sie sich einführen in die wichtigen Werkzeuge, die zum Debugging und Monitoring des Kernels genutzt werden.
Zielgruppe
Programmierer
Voraussetzungen
- Erfahrung in der C-Programmierung
- Vertrautheit mit den grundlegenden Linux (UNIX) Dienstprogrammen wie ls, grep und tar
- Erste Erfahrungen mit Text-Editoren (z. B. emacs, vi, etc.)
- Erfahrung mit einer großen Linux Distribution (von Vorteil)
Agenda
Kernel-Merkmale
- Komponenten des Kernels
- Anwenderbereich vs. Kernel-Bereich
- Was sind Systemaufrufe?
- Verfügbare Systemaufrufe
- Zeitplanungsalgorithmen und Task-Strukturen
- Prozess-Kontext
Überwachung und Fehlersuche
- Debuginfo-Package
- Tracing und Profiling
- sysctl
- SysRq-Schlüssel
- oops-Meldungen
- Kernel-Debugger
- debugfs
Das proc-Dateisystem
- Einträge erstellen und entfernen
- Einträge lesen und schreiben
- Die seq-Dateischnittstelle
kprobes
- kprobes
- kretprobes
- SystemTap
Ftrace
- ftrace, trace-cmd und kernelshark
- Verfügbare Tracer
- Verwendung von ftrace
- Dateien im Tracing-Verzeichnis
- Tracing-Optionen
- Drucken mit trace printk()
- Trace-Markierungen
- Dumpen des Puffers
- trace-cmd
Perf
- Perf-Statistik
- Perf-Liste
- Perf-Aufzeichnung
- Perf-Bericht
- perf kommentieren
- perf spitze
eBPF
- BFP
- eBPF
- Installation
- bcc Werkzeuge
- bpftrace
Absturz
- Haupt-Befehle
Kernel-Core-Dumps
- Erzeugung von Kernel-Core-Dumps
- kexec
- Einrichten von Kernel Core Dumps
Virtualisierung
- Bereiche der Virtualisierung
- Hypervisoren
QEMU
- Was ist QEMU?
- Simulierte Architekturen
- Bildformate
- Einbindung von Drittanbieter-Hypervisoren
Linux-Kernel-Debugging-Werkzeuge
- Linux-Kernel (eingebaute) Werkzeuge und Hilfsmittel
- kdb
- qemu+gdb
- kgdb: Hardware+seriell+gdb
Embedded Linux
- Embedded- und Real Time Betriebssysteme
- Erstellung einer kleinen Linux-Umgebung
- Real Time Linuxe
Notifiers
- Daten-Strukturen
- Rückrufe und Benachrichtigungen
- Melderketten erstellen
CPU-Frequenz-Skalierung
- Was ist Frequenz- und Spannungsskalierung?
- Melder
- Treiber
- Regler
Netlink Sockets
- netlink Socket öffnen
- netlink-Nachrichten
Einführung in die Sicherheit des Linux-Kernels
- Grundlagen der Linux-Kernel-Sicherheit
- Diskretionäre Zugriffskontrolle (DAC)
- POSIX ACLs
- POSIX-Fähigkeiten
- Namensräume (Namespaces)
- Linux Sicherheitsmodule (LSM)
- Netfilter
- Kryptographische Methoden
- Das Kernel-Selbstschutz-Projekt
Linux-Sicherheitsmodule (LSM)
- LSM-Grundlagen
- LSM Auswahlmöglichkeiten
- Arbeitsweise von LSM
- Ein LSM-Beispiel: Tomoyo
SELinux
- SELinux-Übersicht
- SELinux-Modi
- SELinux-Richtlinien
- Kontext-Dienstprogramme
- SELinux und Standard-Kommandozeilenwerkzeuge
- SELinux-Kontext-Vererbung und -Erhaltung**
- restorecon**
- semanage fcontext**
- SELinux-Boleans verwenden**
- getsebool und setsebool**
- Werkzeuge zur Fehlerbehebung
AppArmor
- Prüfen des Status
- Modi und Profile
- Profile
- Dienstprogramme
Netzfilter
- Netfilter-Haken
- Netfilter-Implementierung
- Einhaken in Netfilter
- Iptables
Das virtuelle Dateisystem
- Verfügbare Dateisysteme
- Spezielle Dateisysteme
- Das tmpfs-Dateisystem
- Das ext2/ext3-Dateisystem
- Das ext4-Dateisystem
- Das btrfs-Dateisystem
- Allgemeines Dateimodell
- VFS-Systemaufrufe
- Dateien und Prozesse
- Einbindung von Dateisystemen
Dateisysteme im Userspace (FUSE)
- Schreiben eines Dateisystems
Journaling-Dateisysteme
- Verfügbare Journaling-Dateisysteme
- Gegensätzliche Merkmale
Kernel-Architektur I
- UNIX und Linux **
- Monolithische und Mikro-Kernel
- Objekt-orientierte Methoden
- Hauptkomponenten des Kernels
- User-Space und Kernel-Space
Kernel-Programmierung Vorschau
- Error Numbers und Kernel Output
- Task-Struktur
- Speicherzuweisung
- Übertragung von Daten zwischen Benutzer- und Kernelbereich
- Objektorientierte Vererbung - eine Art von Vererbung
- Verknüpfte Listen
- Jiffies
Module
- Was sind Module?
- Module kompilieren
- Module vs. Built-in
- Modul-Dienstprogramme
- Automatisches Laden von Modulen
- Zählung der Modulverwendung
- Modul-Lizenzierung
- Exportieren von Symbolen
- Auflösen von Symbolen **
Kernel-Architektur II
- Prozesse, Threads und Tasks
- Kernel-Präemption
- Echtzeit-Präemptions-Patch
Kernel Konfiguration und Kompilierung
- Installation und Layout des Kernel-Source
- Kernel-Browser
- Kernel-Konfigurationsdateien
- Kernel-Erstellung und Makefiles
- initrd und initramfs
Kernel Style und allgemeine Überlegungen
- Coding-Style
- Verwendung generischer Kernel-Routinen und -Methoden
- Einen Kernel-Patch erstellen
- sparse
- Verwendung von likely() und unlikely()
- Schreiben von portierbarem Code, CPU, 32/64-bit, Endianness
- Schreiben für SMP
- Schreiben für Systeme mit hohem Speicherbedarf
- Energie-Management
- Sicherheit
Race Conditions und Synchronisationsmethoden
- Gleichzeitigkeit und Synchronisationsmethoden
- Atomare Operationen
- Bit-Operationen
- Spinlocks
- Seqlocks
- Deaktivierung der Vorkaufsrechte
- Mutexe
- Semaphoren
- Vervollständigungsfunktionen
- Read-Copy-Update (RCU)
- Referenz-Counts
Speicher-Adressierung
- Virtuelle Speicherverwaltung
- Systeme mit und ohne MMU und TLB
- Speicheradressen
- Hoher und niedriger Speicher
- Speicher-Zonen
- Spezielle Device Nodes
- NUMA
- Paging
- Seitentabellen
- Seitenstruktur
Speicher-Zuweisung
- Anfordern und Freigeben von Seiten
- Buddy-System
- Slabs und Cache-Zuteilungen
- Speicherpools
- kmalloc()
- vmalloc()
- Frühe Zuweisungen und bootmem()
- Speicher-Defragmentierung
Ziele
Lernen Sie die grundlegenden Methoden und die interne Infrastruktur des Linux-Kernels kennen, indem Sie sowohl die theoretischen als auch die praktischen Underpinnings verstehen. Lassen Sie sich einführen in die wichtigen Werkzeuge, die zum Debugging und Monitoring des Kernels genutzt werden.
Zielgruppe
Programmierer
Voraussetzungen
- Erfahrung in der C-Programmierung
- Vertrautheit mit den grundlegenden Linux (UNIX) Dienstprogrammen wie ls, grep und tar
- Erste Erfahrungen mit Text-Editoren (z. B. emacs, vi, etc.)
- Erfahrung mit einer großen Linux Distribution (von Vorteil)
Agenda
Kernel-Merkmale
- Komponenten des Kernels
- Anwenderbereich vs. Kernel-Bereich
- Was sind Systemaufrufe?
- Verfügbare Systemaufrufe
- Zeitplanungsalgorithmen und Task-Strukturen
- Prozess-Kontext
Überwachung und Fehlersuche
- Debuginfo-Package
- Tracing und Profiling
- sysctl
- SysRq-Schlüssel
- oops-Meldungen
- Kernel-Debugger
- debugfs
Das proc-Dateisystem
- Einträge erstellen und entfernen
- Einträge lesen und schreiben
- Die seq-Dateischnittstelle
kprobes
- kprobes
- kretprobes
- SystemTap
Ftrace
- ftrace, trace-cmd und kernelshark
- Verfügbare Tracer
- Verwendung von ftrace
- Dateien im Tracing-Verzeichnis
- Tracing-Optionen
- Drucken mit trace printk()
- Trace-Markierungen
- Dumpen des Puffers
- trace-cmd
Perf
- Perf-Statistik
- Perf-Liste
- Perf-Aufzeichnung
- Perf-Bericht
- perf kommentieren
- perf spitze
eBPF
- BFP
- eBPF
- Installation
- bcc Werkzeuge
- bpftrace
Absturz
- Haupt-Befehle
Kernel-Core-Dumps
- Erzeugung von Kernel-Core-Dumps
- kexec
- Einrichten von Kernel Core Dumps
Virtualisierung
- Bereiche der Virtualisierung
- Hypervisoren
QEMU
- Was ist QEMU?
- Simulierte Architekturen
- Bildformate
- Einbindung von Drittanbieter-Hypervisoren
Linux-Kernel-Debugging-Werkzeuge
- Linux-Kernel (eingebaute) Werkzeuge und Hilfsmittel
- kdb
- qemu+gdb
- kgdb: Hardware+seriell+gdb
Embedded Linux
- Embedded- und Real Time Betriebssysteme
- Erstellung einer kleinen Linux-Umgebung
- Real Time Linuxe
Notifiers
- Daten-Strukturen
- Rückrufe und Benachrichtigungen
- Melderketten erstellen
CPU-Frequenz-Skalierung
- Was ist Frequenz- und Spannungsskalierung?
- Melder
- Treiber
- Regler
Netlink Sockets
- netlink Socket öffnen
- netlink-Nachrichten
Einführung in die Sicherheit des Linux-Kernels
- Grundlagen der Linux-Kernel-Sicherheit
- Diskretionäre Zugriffskontrolle (DAC)
- POSIX ACLs
- POSIX-Fähigkeiten
- Namensräume (Namespaces)
- Linux Sicherheitsmodule (LSM)
- Netfilter
- Kryptographische Methoden
- Das Kernel-Selbstschutz-Projekt
Linux-Sicherheitsmodule (LSM)
- LSM-Grundlagen
- LSM Auswahlmöglichkeiten
- Arbeitsweise von LSM
- Ein LSM-Beispiel: Tomoyo
SELinux
- SELinux-Übersicht
- SELinux-Modi
- SELinux-Richtlinien
- Kontext-Dienstprogramme
- SELinux und Standard-Kommandozeilenwerkzeuge
- SELinux-Kontext-Vererbung und -Erhaltung**
- restorecon**
- semanage fcontext**
- SELinux-Boleans verwenden**
- getsebool und setsebool**
- Werkzeuge zur Fehlerbehebung
AppArmor
- Prüfen des Status
- Modi und Profile
- Profile
- Dienstprogramme
Netzfilter
- Netfilter-Haken
- Netfilter-Implementierung
- Einhaken in Netfilter
- Iptables
Das virtuelle Dateisystem
- Verfügbare Dateisysteme
- Spezielle Dateisysteme
- Das tmpfs-Dateisystem
- Das ext2/ext3-Dateisystem
- Das ext4-Dateisystem
- Das btrfs-Dateisystem
- Allgemeines Dateimodell
- VFS-Systemaufrufe
- Dateien und Prozesse
- Einbindung von Dateisystemen
Dateisysteme im Userspace (FUSE)
- Schreiben eines Dateisystems
Journaling-Dateisysteme
- Verfügbare Journaling-Dateisysteme
- Gegensätzliche Merkmale
Kernel-Architektur I
- UNIX und Linux **
- Monolithische und Mikro-Kernel
- Objekt-orientierte Methoden
- Hauptkomponenten des Kernels
- User-Space und Kernel-Space
Kernel-Programmierung Vorschau
- Error Numbers und Kernel Output
- Task-Struktur
- Speicherzuweisung
- Übertragung von Daten zwischen Benutzer- und Kernelbereich
- Objektorientierte Vererbung - eine Art von Vererbung
- Verknüpfte Listen
- Jiffies
Module
- Was sind Module?
- Module kompilieren
- Module vs. Built-in
- Modul-Dienstprogramme
- Automatisches Laden von Modulen
- Zählung der Modulverwendung
- Modul-Lizenzierung
- Exportieren von Symbolen
- Auflösen von Symbolen **
Kernel-Architektur II
- Prozesse, Threads und Tasks
- Kernel-Präemption
- Echtzeit-Präemptions-Patch
Kernel Konfiguration und Kompilierung
- Installation und Layout des Kernel-Source
- Kernel-Browser
- Kernel-Konfigurationsdateien
- Kernel-Erstellung und Makefiles
- initrd und initramfs
Kernel Style und allgemeine Überlegungen
- Coding-Style
- Verwendung generischer Kernel-Routinen und -Methoden
- Einen Kernel-Patch erstellen
- sparse
- Verwendung von likely() und unlikely()
- Schreiben von portierbarem Code, CPU, 32/64-bit, Endianness
- Schreiben für SMP
- Schreiben für Systeme mit hohem Speicherbedarf
- Energie-Management
- Sicherheit
Race Conditions und Synchronisationsmethoden
- Gleichzeitigkeit und Synchronisationsmethoden
- Atomare Operationen
- Bit-Operationen
- Spinlocks
- Seqlocks
- Deaktivierung der Vorkaufsrechte
- Mutexe
- Semaphoren
- Vervollständigungsfunktionen
- Read-Copy-Update (RCU)
- Referenz-Counts
Speicher-Adressierung
- Virtuelle Speicherverwaltung
- Systeme mit und ohne MMU und TLB
- Speicheradressen
- Hoher und niedriger Speicher
- Speicher-Zonen
- Spezielle Device Nodes
- NUMA
- Paging
- Seitentabellen
- Seitenstruktur
Speicher-Zuweisung
- Anfordern und Freigeben von Seiten
- Buddy-System
- Slabs und Cache-Zuteilungen
- Speicherpools
- kmalloc()
- vmalloc()
- Frühe Zuweisungen und bootmem()
- Speicher-Defragmentierung