Requisitos para crear imágenes personalizadas


En algunas situaciones, sus aplicaciones pueden requerir que cree su propio sistema operativo o compile un kernel personalizado. Si compila kernels personalizados o crea sistemas operativos personalizados para sus máquinas virtuales, asegúrese de que cumplan con los requisitos de este documento.

Crear un sistema operativo personalizado es una tarea avanzada para los usuarios con aplicaciones que requieren específicamente un kernel personalizado. La mayoría de los usuarios pueden crear máquinas virtuales a partir de una de las imágenes públicas disponibles, utilizar la herramienta automatizada de importación de discos virtuales para importar discos a Compute Engine desde otros entornos o importar manualmente una imagen personalizada desde un sistema con una distribución de Linux común.

Requisitos de soporte de hardware

Su kernel debe admitir los siguientes dispositivos:

  • Puente PCI: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
  • Puente ISA: Intel 82371AB/EB/MB PIIX4 ISA (rev. 03)
  • Controlador Ethernet:

    • Adaptador Ethernet Virtio-Net.
    • Se requiere gVNIC para Tau T2A de segunda generación y para todas las series de máquinas de tercera generación y posteriores.

      Además, se requiere o recomienda gVNIC si usa GPU en cualquiera de los siguientes:

      • Tipos de máquinas N1 de uso general
      • Tipos de máquinas A4 , A3 , A2 o G2 optimizadas para acelerador
    • proveedor = 0x1AF4 (Qumranet/Red Hat)

    • identificación del dispositivo = 0x1000. ID de subsistema 0x1

    • Se admite la descarga de suma de comprobación

    • TSO v4 es compatible

    • GRO v4 es compatible

  • Controlador de almacenamiento SCSI:

    • Controlador de almacenamiento Virtio-SCSI
    • proveedor = 0x1AF4 (Qumranet/Red Hat)
    • identificación del dispositivo = 0x1004. ID del subsistema 0x8.
    • Se admiten los comandos primarios SCSI 4 y los comandos de bloque SCSI 3
    • Solo se admite una cola de solicitudes
    • Los discos persistentes informan sectores físicos de 4 KiB/sectores lógicos de 512 bytes
    • Solo se admiten dispositivos de bloque (discos)
    • Se admite el bit de función Hotplug/Events
  • Puertos serie:
    • Cuatro puertos 16550A
    • ttyS0 en IRQ 4
    • ttyS1 en IRQ 3
    • ttyS2 en IRQ 6
    • ttyS3 en IRQ 7

Opciones de compilación del kernel de Linux requeridas

Debe compilar el kernel del sistema operativo con las siguientes opciones:

  • CONFIG_KVM_GUEST=y
    • Habilite la funcionalidad de paravirtualización.
  • CONFIG_KVM_CLOCK=y
    • Habilite el reloj paravirtualizado (si se aplica a su versión de kernel).
  • CONFIG_VIRTIO_PCI=y
    • Habilite dispositivos PCI paravirtualizados.
  • CONFIG_SCSI_VIRTIO=y
    • Habilite el acceso a discos paravirtualizados.
  • CONFIG_VIRTIO_NET=y
    • Habilitar el acceso a la red.
  • CONFIG_PCI_MSI=y
    • Habilite la entrega de interrupciones de alto rendimiento, que es necesaria para los dispositivos SSD locales.

Opciones de construcción del kernel para seguridad

Utilice la configuración de seguridad recomendada en las opciones de compilación de su kernel:

  • CONFIG_STRICT_DEVMEM=y
    • Restrinja /dev/mem para permitir el acceso únicamente al espacio PCI, al código BIOS y a las regiones de datos.
  • CONFIG_DEVKMEM=n
    • Deshabilite el soporte para /dev/kmem .
    • Bloquear el acceso a la memoria del kernel.
  • CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
    • Establezca una memoria virtual baja que esté protegida de la asignación de espacio de usuario.
  • CONFIG_DEBUG_RODATA=y
    • Marque los datos de solo lectura del kernel como protegidos contra escritura en las tablas de páginas, para detectar escrituras accidentales (e incorrectas) en dichos datos const . Esta opción puede tener un ligero impacto en el rendimiento porque una parte del código del kernel ya no estará cubierta por un TLB de 2 MB.
  • CONFIG_DEBUG_SET_MODULE_RONX=y
    • Detecta modificaciones no deseadas en el texto y los datos de solo lectura del módulo del kernel cargable. Esta opción también evita la ejecución de los datos del módulo.
  • CONFIG_CC_STACKPROTECTOR=y
    • Habilita la función GCC -fstack-protector . Esta característica coloca un valor canario al comienzo de las funciones críticas, en la pila antes de la dirección de retorno, y valida el valor antes de regresar. Esto también provoca que los desbordamientos del búfer basado en la pila (que necesitan sobrescribir esta dirección de retorno) sobrescriban el canario, que se detecta y luego el ataque se neutraliza mediante un pánico del kernel.
  • CONFIG_COMPAT_VDSO=n
    • Garantiza que el VDSO no esté en una dirección predecible para fortalecer ASLR. Si está habilitada, esta característica asigna el VDSO a la dirección predecible de estilo antiguo, proporcionando una ubicación predecible a la que saltar el código de explotación. Responda N aquí si está ejecutando una versión glibc suficientemente reciente (2.3.3 o posterior) para eliminar el mapeo VDSO de alto mapeo y usar exclusivamente el VDSO aleatorio.
  • CONFIG_COMPAT_BRK=n
    • No desactive la aleatorización del montón.
  • CONFIG_X86_PAE=y
    • Configure esta opción para un kernel de 32 bits porque se requiere PAE para la compatibilidad con NX. Esto también permite un mayor soporte de espacio de intercambio para fines sin compromiso excesivo.
  • CONFIG_SYN_COOKIES=y
    • Proporciona cierta protección contra inundaciones SYN.
  • CONFIG_SECURITY_YAMA=y
    • Esto selecciona a Yama, que amplía el soporte de DAC con configuraciones de seguridad adicionales para todo el sistema más allá de los controles de acceso discrecionales habituales de Linux. Actualmente, la configuración es restricción de alcance de ptrace.
  • CONFIG_SECURITY_YAMA_STACKED=y
    • Esta opción obliga a Yama a apilarse con el LSM principal seleccionado cuando Yama está disponible.

Configuración de seguridad del núcleo

También puede reforzar la seguridad del kernel a través del archivo de configuración del kernel. Edite el archivo /etc/sysctl.conf para incluir las siguientes configuraciones de seguridad recomendadas:

# 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

¿Qué sigue?