Créer des systèmes d'exploitation personnalisés

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 vos instances, 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é. Pour la plupart des utilisateurs, cette tâche consiste à créer des instances à 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
    • 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 accepté.
  • 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 l'émission 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 à autoriser l'accès uniquement à l'espace PCI, au code du BIOS et aux emplacements de données.
  • CONFIG_DEVKMEM=n
    • Désactiver la compatibilité avec /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 pages, 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 de modules de noyau chargeables 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, immédiatement avant l'adresse de retour dans la pile, et valide cette valeur juste avant le retour effectif. En cas de dépassement de tampon de pile (qui doivent remplacer cette adresse de retour), cela conduit à l'écrasement de la valeur Canary, qui est alors 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 l'acceptation du contrôle d'accès discrétionnaire (DAC, Discretionary Access Control) 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

    # Implement RFC 1337 fix
    net.ipv4.tcp_rfc1337 = 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
    

Étapes suivantes

  • 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.