Requisiti per la creazione di immagini personalizzate


In alcune situazioni, le applicazioni potrebbero richiedere di creare il tuo sistema operativo o di compilare un kernel personalizzato. Se compili kernel personalizzati o crei sistemi operativi personalizzati per le tue VM, assicurati che soddisfino i requisiti in questo documento.

La creazione di un sistema operativo personalizzato è un'attività avanzata per gli utenti con applicazioni che richiedono specificamente un kernel personalizzato. La maggior parte degli utenti può creare VM da una delle immagini pubbliche disponibili, utilizzare lo strumento di importazione di dischi virtuali automatizzato per importare i dischi in Compute Engine da altri ambienti o importare manualmente un'immagine personalizzata da un sistema con una distribuzione Linux di base comune.

Requisiti per l'assistenza hardware

Il kernel deve supportare i seguenti dispositivi:

  • Bridge PCI: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
  • Ponte ISA: Intel 82371AB/EB/MB PIIX4 ISA (rev 03)
  • Controller Ethernet:
    • Adattatore Ethernet Virtio-Net. gVNIC è obbligatorio per le VM Tau T2A.
    • venditore = 0x1AF4 (Qumranet/Red Hat)
    • ID dispositivo = 0x1000. ID sottosistema 0x1
    • L'offload del checksum è supportato
    • La versione TSO v4 è supportata
    • La versione GRO v4 è supportata
  • Controller di archiviazione SCSI:
    • Controller di archiviazione Virtio-SCSI
    • venditore = 0x1AF4 (Qumranet/Red Hat)
    • ID dispositivo = 0x1004. ID sottosistema 0x8.
    • I comandi SCSI Primary 4 e SCSI Block Commands 3 sono supportati
    • È supportata una sola coda di richieste
    • I dischi permanenti segnalano 4 settori fisici KiB / settori logici di 512 byte
    • Sono supportati solo i dispositivi bloccati (dischi)
    • Il bit della funzionalità Hotplug / Eventi è supportato
  • Porte seriali:
    • Quattro porte 16550A
    • ttyS0 su IRQ 4
    • ttyS1 su IRQ 3
    • ttyS2 su IRQ 6
    • ttyS3 su IRQ 7

Opzioni di build del kernel Linux obbligatorie

Devi creare il kernel del sistema operativo con le seguenti opzioni:

  • CONFIG_KVM_GUEST=y
    • Attiva la funzionalità di paravirtualizzazione.
  • CONFIG_KVM_CLOCK=y
    • Attiva l'orologio paravirtualizzato (se applicabile alla versione del kernel).
  • CONFIG_VIRTIO_PCI=y
    • Attiva i dispositivi PCI paravirtualizzati.
  • CONFIG_SCSI_VIRTIO=y
    • Abilita l'accesso ai dischi paravirtualizzati.
  • CONFIG_VIRTIO_NET=y
    • Abilita l'accesso al networking.
  • CONFIG_PCI_MSI=y
    • Abilita l'invio interrotto delle prestazioni, richiesto per i dispositivi SSD locali.

Opzioni di creazione del kernel per la sicurezza

Usa le impostazioni di sicurezza consigliate nelle opzioni della build del kernel:

  • CONFIG_STRICT_DEVMEM=y
    • Limita /dev/mem per consentire l'accesso solo allo spazio PCI, al codice BIOS e alle aree geografiche dati.
  • CONFIG_DEVKMEM=n
    • Disattiva il supporto per /dev/kmem.
    • Blocca l'accesso alla memoria del kernel.
  • CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
    • Imposta una memoria virtuale bassa protetta dall'allocazione dello spazio utente.
  • CONFIG_DEBUG_RODATA=y
    • Contrassegna i dati di sola lettura del kernel come protetti da scrittura nelle tabelle delle pagine per rilevare le scritture accidentali (e non corrette) in tali dati const. Questa opzione può avere un leggero impatto sulle prestazioni perché una parte del codice del kernel non è più coperta da un TLB da 2 MB.
  • CONFIG_DEBUG_SET_MODULE_RONX=y
    • Rileva le modifiche impreviste al testo e ai dati di sola lettura del modulo del kernel caricabile. Questa opzione impedisce anche l'esecuzione dei dati del modulo.
  • CONFIG_CC_STACKPROTECTOR=y
    • Attiva la funzionalità GCC -fstack-protector. Questa caratteristica inserisce un valore canary all'inizio delle funzioni critiche, nello stack prima dell'indirizzo di ritorno e convalida il valore prima di tornare effettivamente. In questo modo, gli extra del buffer basati sullo stack (che devono sovrascrivere questo indirizzo di ritorno) sovrascrivono la versione canary, che viene rilevata e l'attacco viene quindi neutralizzato utilizzando un panico di kernel.
  • CONFIG_COMPAT_VDSO=n
    • Garantisce che il VDSO non sia a un indirizzo prevedibile per rafforzare l'ASLR. Se abilitata, questa funzionalità mappa il VDSO all'indirizzo prevedibile del vecchio stile, fornendo una posizione prevedibile a cui saltare il codice di exploit. Di' N qui se stai utilizzando una versione glibc sufficientemente recente (2.3.3 o versioni successive), per rimuovere la mappatura VDSO ad alta mappatura e per utilizzare esclusivamente la VDSO randomizzata.
  • CONFIG_COMPAT_BRK=n
    • Non disattivare la randomizzazione degli heap.
  • CONFIG_X86_PAE=y
    • Imposta questa opzione per un kernel a 32 bit perché il supporto PAE è necessario per il supporto NX. Questo consente anche un supporto di spazio di archiviazione più ampio per scopi diversi da overcommit.
  • CONFIG_SYN_COOKIES=y
    • Fornisce una protezione contro le inondazioni SYN.
  • CONFIG_SECURITY_YAMA=y
    • Viene selezionato Yama, che estende il supporto del DAC con ulteriori impostazioni di sicurezza a livello di sistema oltre i normali controlli di accesso discreti di Linux. Attualmente, l'impostazione è una limitazione dell'ambito ptrace.
  • CONFIG_SECURITY_YAMA_STACKED=y
    • Questa opzione impone a Yama di accumularsi con l'LSM principale selezionato quando Yama è disponibile.

Impostazioni di sicurezza del kernel

Puoi anche rafforzare la sicurezza del kernel tramite il file delle impostazioni del kernel. Modifica il file /etc/sysctl.conf per includere le seguenti impostazioni di sicurezza consigliate:

# 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

Passaggi successivi