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 la série de machines Tau T2A de deuxième génération et toutes les séries de machines de troisième génération et ultérieures.
En outre, le gVNIC est requis ou recommandé si vous utilisez des GPU sur les éléments suivants:
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.
- Restreindre
CONFIG_DEVKMEM=n
- Désactiver la prise en charge de
/dev/kmem
- Bloquer l'accès à la mémoire du noyau.
- Désactiver la prise en charge de
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.
- 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
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.
- Active la fonction GCC
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 deglibc
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.
- 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
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.