Benutzerdefinierte Betriebssysteme erstellen

Es kann vorkommen, dass Sie für Ihre Anwendungen ein eigenes Betriebssystem oder einen benutzerdefinierten Kernel erstellen müssen. Achten Sie dabei darauf, dass Ihre benutzerdefinierten Kernel bzw. Betriebssysteme die in diesem Dokument erläuterten Voraussetzungen erfüllen.

Das Erstellen eines benutzerdefinierten Betriebssystems ist eine Aufgabe für erfahrene Nutzer mit Anwendungen, die einen individuellen Kernel benötigen. Meist genügt es, Instanzen aus einem der verfügbaren öffentlichen Images zu erstellen, mit dem automatisierten Tool zum Importieren virtueller Laufwerke solche aus anderen Umgebungen in Compute Engine zu importieren oder aus einem System mit gängiger Linux-Distribution benutzerdefinierte Images manuell zu importieren.

Hardwareanforderungen

Der Kernel muss die folgenden Geräte unterstützen:

  • PCI-Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
  • ISA-Bridge: Intel 82371AB/EB/MB PIIX4 ISA (rev 03)
  • Ethernet-Controller:
    • Virtio-Net Ethernet Adapter
    • Anbieter = 0x1AF4 (Qumranet/Red Hat)
    • Geräte-ID = 0x1000. Subsystem-ID = 0x1
    • Prüfsummenabladung wird unterstützt
    • TSO v4 wird unterstützt
    • GRO v4 wird unterstützt
  • SCSI Storage Controller:
    • Virtio-SCSI Storage Controller
    • Anbieter = 0x1AF4 (Qumranet/Red Hat)
    • Geräte-ID = 0x1004, Subsystem-ID = 0x8
    • SCSI Primary Commands 4 und SCSI Block Commands 3 werden unterstützt
    • Nur eine Anfragewarteschlange wird unterstützt
    • Nichtflüchtiger Speicher hat physische Sektoren mit 4 KiB bzw. logische Sektoren mit 512 Byte
    • Nur Blockgeräte (Laufwerke) werden unterstützt
    • Feature Bit "Hotplug/Events" wird unterstützt
  • Serielle Ports:
    • Vier 16550A-Ports
    • ttyS0 auf IRQ 4
    • ttyS1 auf IRQ 3
    • ttyS2 auf IRQ 6
    • ttyS3 auf IRQ 7

Erforderliche Build-Optionen für Linux-Kernel

Sie müssen den Betriebssystem-Kernel mit den folgenden Optionen erstellen:

  • CONFIG_KVM_GUEST=y
    • Die Paravirtualisierungsfunktion aktivieren.
  • CONFIG_KVM_CLOCK=y
    • Die paravirtualisierte Uhr aktivieren (falls auf Ihre Kernel-Version zutreffend).
  • CONFIG_VIRTIO_PCI=y
    • Paravirtualisierte PCI-Geräte aktivieren.
  • CONFIG_SCSI_VIRTIO=y
    • Den Zugriff auf paravirtualisierte Festplatten aktivieren.
  • CONFIG_VIRTIO_NET=y
    • Den Zugang zum Netzwerk aktivieren.
  • CONFIG_PCI_MSI=y
    • Die Hochleistungs-Interruptübertragung aktivieren, die für lokale SSD-Geräte erforderlich ist.

Kernel-Build-Optionen für die Sicherheit

Verwenden Sie in den Kernel-Build-Optionen folgende empfohlene Sicherheitseinstellungen:

  • CONFIG_STRICT_DEVMEM=y
    • /dev/mem nur Zugriff auf den PCI-Bereich, den BIOS-Code und die Speicherorte für Daten gewähren.
  • CONFIG_DEVKMEM=n
    • Unterstützung von /dev/kmem deaktivieren.
    • Den Zugriff auf den Kernel-Speicher blockieren.
  • CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
    • Einen geringen virtuellen Speicher einrichten, der nicht vom Userspace genutzt wird.
  • CONFIG_DEBUG_RODATA=y
    • Die schreibgeschützten Kernel-Daten in den Seitentabellen entsprechend kennzeichnen, um unbeabsichtigte (und falsche) Schreibvorgänge für solche const-Daten zu verhindern. Diese Option kann sich in geringem Umfang auf die Leistung auswirken, da ein Teil des Kernel-Codes nicht mehr von dem 2 MB-TLB abgedeckt ist.
  • CONFIG_DEBUG_SET_MODULE_RONX=y
    • Diese Option schützt vor unbeabsichtigten Änderungen am Text und an schreibgeschützten Daten des ladbaren Kernel-Moduls. Sie verhindert außerdem das Ausführen von Moduldaten.
  • CONFIG_CC_STACKPROTECTOR=y
    • Diese Option aktiviert das GCC-Element "-fstack-protector". Damit wird wichtigen Funktionen auf dem Stack direkt vor der Rücksprungadresse ein Canary-Wert vorangestellt. Vor dem Rücksprung wird dieser Wert geprüft. Dies führt außerdem dazu, dass Stack-basierte Pufferüberläufe, welche diese Rücksprungadresse überschreiben müssen, den Canary-Wert überschreiben. Dies wird erkannt und der Angriff wird mit einer Kernel-Panic neutralisiert.
  • CONFIG_COMPAT_VDSO=n
    • Diese Option sorgt dafür, dass sich das VDSO nicht unter einer vorhersehbaren Adresse befindet, und stärkt dadurch die ASLR. Wäre die Option aktiviert, würde das VDSO mit der vorhersehbaren alten Adresse verknüpft, wodurch ein Angriffspunkt für Exploit-Code entstünde. Wählen Sie N aus, wenn Sie eine ausreichend aktuelle glibc-Version (ab 2.3.3) ausführen, um die festgelegte VDSO-Zuordnung aufzuheben und ausschließlich eine zufällige VDSO-Zuordnung zu verwenden.
  • CONFIG_COMPAT_BRK=n
    • Die Heap-Randomisierung nicht deaktivieren.
  • CONFIG_X86_PAE=y
    • Richten Sie diese Option für einen 32-Bit-Kernel ein, da PAE für die NX-Unterstützung erforderlich ist. Dies ermöglicht auch eine bessere Unterstützung des Auslagerungsspeichers für Nicht-Overcommit-Zwecke.
  • CONFIG_SYN_COOKIES=y
    • Bietet einen gewissen Schutz vor SYN-Floods.
  • CONFIG_SECURITY_YAMA=y
    • Damit wird Yama aktiviert, um die DAC-Unterstützung um weitere systemweite Sicherheitseinstellungen zu ergänzen, die über die regulären Linux-Zugriffskontrollen hinausgehen. Aktuell lautet die Einstellung "ptrace scope restriction".
  • CONFIG_SECURITY_YAMA_STACKED=y
    • Diese Option zwingt Yama zum Stapeln mit der ausgewählten primären LSM, wenn Yama verfügbar ist.

Kernel-Sicherheitseinstellungen

Sie können die Sicherheit des Kernels über die Kernel-Einstellungsdatei weiter erhöhen. Fügen Sie der Datei /etc/sysctl.conf die folgenden empfohlenen Sicherheitseinstellungen hinzu:

# Enable syn flood protection
net.ipv4.tcp_syncookies = 1

# Ignore source-routed packets
net.ipv4.conf.all.accept_source_route = 0

# Ignore source-routed packets
net.ipv4.conf.default.accept_source_route = 0

# Ignore ICMP redirects
net.ipv4.conf.all.accept_redirects = 0

# Ignore ICMP redirects
net.ipv4.conf.default.accept_redirects = 0

# Ignore ICMP redirects from non-GW hosts
net.ipv4.conf.all.secure_redirects = 1

# Ignore ICMP redirects from non-GW hosts
net.ipv4.conf.default.secure_redirects = 1

# Don't allow traffic between networks or act as a router
net.ipv4.ip_forward = 0

# Don't allow traffic between networks or act as a router
net.ipv4.conf.all.send_redirects = 0

# Don't allow traffic between networks or act as a router
net.ipv4.conf.default.send_redirects = 0

# Reverse path filtering - IP spoofing protection
net.ipv4.conf.all.rp_filter = 1

# Reverse path filtering - IP spoofing protection
net.ipv4.conf.default.rp_filter = 1

# Ignore ICMP broadcasts to avoid participating in Smurf attacks
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Ignore bad ICMP errors
net.ipv4.icmp_ignore_bogus_error_responses = 1

# Log spoofed, source-routed, and redirect packets
net.ipv4.conf.all.log_martians = 1

# Log spoofed, source-routed, and redirect packets
net.ipv4.conf.default.log_martians = 1

# Implement RFC 1337 fix
net.ipv4.tcp_rfc1337 = 1

# Randomize addresses of mmap base, heap, stack and VDSO page
kernel.randomize_va_space = 2

# Provide protection from ToCToU races
fs.protected_hardlinks=1

# Provide protection from ToCToU races
fs.protected_symlinks=1

# Make locating kernel addresses more difficult
kernel.kptr_restrict=1

# Set ptrace protections
kernel.yama.ptrace_scope=1

# Set perf only available to root
kernel.perf_event_paranoid=2

Weiteres Vorgehen

  • Installieren Sie das Betriebssystem auf einem Bootlaufwerk und importieren Sie das Image als benutzerdefiniertes Image in Compute Engine.
  • Wenn Sie das Betriebssystem bereits als benutzerdefiniertes Image importiert haben, konfigurieren Sie weitere Einstellungen auf dem Image, damit es in der Compute Engine-Umgebung optimal funktioniert.
Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...

Compute Engine-Dokumentation