Anforderungen an das Erstellen benutzerdefinierter Images


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

Das Erstellen eines benutzerdefinierten Betriebssystems ist eine Aufgabe für erfahrene Nutzer mit Anwendungen, die einen individuellen Kernel benötigen. Die meisten Nutzer können VMs aus einem der verfügbaren öffentlichen Images erstellen, mit dem automatisierten Tool zum Importieren virtueller Laufwerke Laufwerke aus anderen Umgebungen in Compute Engine importieren oder ein benutzerdefiniertes Image manuell aus einem System mit gängiger Linux-Distribution 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. gVNIC ist für Tau T2A-VMs erforderlich.
    • 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
    • /dev/kmem-Unterstützung 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 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. Wenn die Funktion aktiviert ist, verknüpft sie das VDSO mit der vorhersehbaren alten Adresse, wodurch ein Angriffspunkt für Exploit-Code entsteht. 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
    • Deaktivieren Sie die Heap-Randomisierung nicht.
  • 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

# 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

Nächste Schritte