Requisiti per creare immagini personalizzate


In alcuni casi, le applicazioni potrebbero richiedere di creare il proprio sistema operativo o compilare un kernel personalizzato. Se compili kernel personalizzati o crei sistemi operativi personalizzati per le tue VM, assicurati che soddisfino i requisiti riportati 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 dei dischi virtuali automatico per importare i dischi in Compute Engine da altri ambienti o importare manualmente un'immagine personalizzata da un sistema con una distribuzione Linux di uso comune.

Requisiti di supporto hardware

Il kernel deve supportare i seguenti dispositivi:

  • PCI Bridge: 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 è obbligatoria per le macchine Tau T2A di seconda generazione e per tutte le serie di macchine di terza generazione e successive.

      Inoltre, gVNIC è obbligatorio o consigliato se utilizzi GPU su uno dei seguenti elementi:

      • Tipi di macchine N1 per uso generico
      • Tipi di macchine A3, A2 o G2 ottimizzati per l'acceleratore
    • vendor = 0x1AF4 (Qumranet/Red Hat)

    • device id = 0x1000. ID sottosistema 0x1

    • Il trasferimento del checksum è supportato

    • TSO v4 è supportato

    • GRO v4 è supportato

  • Controller di archiviazione SCSI:

    • Controller dello spazio di archiviazione Virtio-SCSI
    • vendor = 0x1AF4 (Qumranet/Red Hat)
    • ID dispositivo = 0x1004. ID sottosistema 0x8.
    • Sono supportati i comandi principali SCSI 4 e i comandi di blocco SCSI 3
    • È supportata una sola coda di richieste
    • I dischi permanenti registrano settori fisici di 4 KiB / settori logici di 512 byte
    • Sono supportati solo i dispositivi di blocco (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 compilazione del kernel Linux richieste

Devi compilare 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 tua 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 alla rete.
  • CONFIG_PCI_MSI=y
    • Attiva l'invio di interruzioni ad alte prestazioni, che è obbligatorio per i dispositivi SSD locali.

Opzioni di compilazione del kernel per la sicurezza

Utilizza le impostazioni di sicurezza consigliate nelle opzioni di compilazione del kernel:

  • CONFIG_STRICT_DEVMEM=y
    • Limita /dev/mem in modo da consentire l'accesso solo allo spazio PCI, al codice BIOS e alle regioni di dati.
  • CONFIG_DEVKMEM=n
    • Disattiva il supporto di /dev/kmem.
    • Blocca l'accesso alla memoria del kernel.
  • CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
    • Imposta una memoria virtuale ridotta protetta dall'allocazione nello spazio utente.
  • CONFIG_DEBUG_RODATA=y
    • Contrassegna i dati di sola lettura del kernel come protetti dalla scrittura nelle tabelle di pagine per rilevare le scritture accidentali (e errate) a questi dati const. Questa opzione può avere un lieve impatto sulle prestazioni perché una parte del codice del kernel non sarà più coperta da una TLB di 2 MB.
  • CONFIG_DEBUG_SET_MODULE_RONX=y
    • Rileva le modifiche indesiderate 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 di -fstack-protector. Questa funzionalità inserisce un valore canary all'inizio delle funzioni critiche, nello stack prima dell'indirizzo di ritorno, e convalida il valore prima di restituirlo effettivamente. Ciò causa anche gli overflow del buffer basati su stack (che devono sovrascrivere questo indirizzo di ritorno) a sovrascrivere il canary, che viene rilevato e l'attacco viene quindi neutralizzato utilizzando un panico del kernel.
  • CONFIG_COMPAT_VDSO=n
    • Garantisce che la VDSO non si trovi in un indirizzo prevedibile per rafforzare l'ASLR. Se attivata, questa funzionalità mappa il VDSO all'indirizzo di stile precedente prevedibile, fornendo una posizione prevedibile a cui deve saltare il codice di exploit. Inserisci N qui se stai utilizzando una versione glibc sufficientemente recente (2.3.3 o successiva) per rimuovere la mappatura VDSO con mappatura elevata e utilizzare esclusivamente la VDSO randomizzata.
  • CONFIG_COMPAT_BRK=n
    • Non disattivare la randomizzazione dell'heap.
  • CONFIG_X86_PAE=y
    • Imposta questa opzione per un kernel a 32 bit perché PAE è necessario per il supporto di NX. Ciò consente anche di supportare uno spazio di scambio più grande per scopi non di overcommit.
  • CONFIG_SYN_COOKIES=y
    • Fornisce una certa protezione contro gli attacchi SYN flood.
  • CONFIG_SECURITY_YAMA=y
    • Viene selezionato Yama, che estende il supporto del DAC con impostazioni di sicurezza aggiuntive per l'intero sistema oltre ai normali controlli di accesso discrezionale di Linux. Al momento, l'impostazione è la limitazione dell'ambito di ptrace.
  • CONFIG_SECURITY_YAMA_STACKED=y
    • Questa opzione forza l'accodamento di Yama 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