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

Tags

Diese Seite weiterempfehlen