Conditions requises pour créer des images personnalisées


Certaines applications peuvent vous obliger à créer votre propre système d'exploitation ou à compiler un noyau personnalisé. Si vous devez compiler des noyaux personnalisés ou créer des systèmes d'exploitation personnalisés pour des VM, assurez-vous que ceux-ci répondent aux exigences décrites dans ce document.

La création d'un système d'exploitation personnalisé est une tâche avancée réservée aux utilisateurs dont les applications requièrent expressément un noyau personnalisé. La plupart des utilisateurs peuvent créer des VM à partir de l'une des images publiques disponibles, utiliser l'outil d'importation automatique de disque virtuel pour importer des disques dans Compute Engine depuis d'autres environnements ou importer manuellement une image personnalisée à partir d'un système doté d'une distribution Linux standard.

Exigences de compatibilité matérielle

Votre noyau doit prendre en charge les appareils suivants :

  • Pont PCI : Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rév. 03)
  • Pont ISA : Intel 82371AB/EB/MB PIIX4 ISA (rév. 03)
  • Contrôleur Ethernet :
    • Adaptateur Ethernet Virtio-Net. gVNIC est requis pour les VM Tau T2A.
    • ID fournisseur = 0x1AF4 (Qumranet/Red Hat).
    • ID périphérique = 0x1000. ID sous-système = 0x1.
    • Le déchargement de somme de contrôle est pris en charge.
    • TSO v4 est pris en charge.
    • GRO v4 est pris en charge.
  • Contrôleur de stockage SCSI :
    • Contrôleur de stockage VirtIO SCSI
    • ID fournisseur = 0x1AF4 (Qumranet/Red Hat).
    • ID périphérique = 0x1004. ID sous-système = 0x8.
    • Les commandes principales SCSI 4 et les commandes blocs SCSI 3 sont prises en charge.
    • Une seule file d'attente de requêtes est prise en charge.
    • Les disques persistants présentent des secteurs physiques de 4 KiB et des secteurs logiques de 512 octets.
    • Seuls les périphériques de bloc (disques) sont pris en charge
    • Le bit dédié aux événements de remplacement à chaud est pris en charge.
  • Ports série :
    • Quatre ports 16550A
    • ttyS0 sur IRQ 4
    • ttyS1 sur IRQ 3
    • ttyS2 sur IRQ 6
    • ttyS3 sur IRQ 7

Options requises pour la compilation du noyau Linux

Vous devez créer le noyau du système d'exploitation avec les options suivantes :

  • CONFIG_KVM_GUEST=y
    • Activer la fonctionnalité de paravirtualisation.
  • CONFIG_KVM_CLOCK=y
    • Activer l'horloge paravirtualisée (si elle s'applique à la version du noyau).
  • CONFIG_VIRTIO_PCI=y
    • Activer les périphériques PCI paravirtualisés.
  • CONFIG_SCSI_VIRTIO=y
    • Activer l'accès aux disques paravirtualisés.
  • CONFIG_VIRTIO_NET=y
    • Permettre l'accès au réseau.
  • CONFIG_PCI_MSI=y
    • Activer la diffusion d'interruptions hautes performances, requise pour les périphériques SSD locaux.

Options de compilation du noyau relatives à la sécurité

Utilisez les paramètres de sécurité recommandés dans les options de compilation du noyau :

  • CONFIG_STRICT_DEVMEM=y
    • Restreindre /dev/mem de manière à n'autoriser l'accès qu'à l'espace PCI, au code BIOS et aux emplacements des données.
  • CONFIG_DEVKMEM=n
    • Désactiver la prise en charge de /dev/kmem
    • Bloquer l'accès à la mémoire du noyau.
  • CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
    • Définir une mémoire virtuelle basse, protégée contre l'allocation d'espace utilisateur.
  • CONFIG_DEBUG_RODATA=y
    • Marquer les données en lecture seule du noyau comme protégées en écriture dans les tables de données, afin d'intercepter les écritures accidentelles (et incorrectes) sur ces données const. Cette option peut avoir un léger impact sur les performances, car une partie du code du noyau ne sera plus couverte par un TLB de 2 Mo.
  • CONFIG_DEBUG_SET_MODULE_RONX=y
    • Intercepte les modifications apportées de manière involontaire au texte du module chargeable et aux données en lecture seule du noyau. Cette option empêche également l'exécution des données du module.
  • CONFIG_CC_STACKPROTECTOR=y
    • Active la fonction GCC -fstack-protector. Cette fonctionnalité place une valeur Canary au début des fonctions critiques, sur la pile précédant l'adresse de retour, et valide cette valeur avant le retour effectif. Cela provoque également des dépassements de tampon de pile (qui doivent remplacer cette adresse de retour) afin d'écraser le Canary, qui est détecté. L'attaque est ensuite neutralisée via une panique du noyau.
  • CONFIG_COMPAT_VDSO=n
    • S'assure que le VDSO ne se trouve pas à une adresse prévisible afin de renforcer l'ASLR. Si cette fonctionnalité est activée, elle mappe le VDSO à l'adresse prévisible utilisée dans les versions plus anciennes, fournissant ainsi un emplacement prévisible auquel le code d'exploitation peut accéder. Spécifiez N ici si vous utilisez une version de glibc suffisamment récente (2.3.3 ou ultérieure), afin de supprimer le mappage du VDSO dans l'espace d'adressage haut et d'utiliser exclusivement le VDSO aléatoire.
  • CONFIG_COMPAT_BRK=n
    • Ne désactivez pas la randomisation du tas.
  • CONFIG_X86_PAE=y
    • Définissez cette option pour un noyau 32 bits, car PAE est requis pour la prise en charge de NX. Cela permet également d'accepter un espace de fichier d'échange plus important afin d'éviter toute sursollicitation.
  • CONFIG_SYN_COOKIES=y
    • Offre une certaine protection contre les inondations SYN.
  • CONFIG_SECURITY_YAMA=y
    • Sélectionne Yama, qui étend la prise en charge de DAC en offrant des paramètres de sécurité supplémentaires définis à l'échelle du système en plus des contrôles d'accès discrétionnaires standards de Linux. Le paramètre actuellement défini correspond à la restriction de champ d'application ptrace.
  • CONFIG_SECURITY_YAMA_STACKED=y
    • Cette option force Yama à s'empiler avec le LSM primaire sélectionné lorsque Yama est disponible.

Paramètres de sécurité du noyau

Vous pouvez également renforcer la sécurité du noyau via le fichier de paramètres du noyau. Modifiez le fichier /etc/sysctl.conf afin de spécifier les paramètres de sécurité recommandés suivants :

# 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

Étape suivante

  • Installez le système d'exploitation sur un disque de démarrage, et importez manuellement l'image dans Compute Engine en tant qu'image personnalisée.
  • Si vous avez déjà importé votre système d'exploitation en tant qu'image personnalisée, configurez les paramètres autres que ceux du noyau sur l'image afin que celle-ci puisse fonctionner de manière optimale dans l'environnement Compute Engine.