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:
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.
- Restrinja
-
CONFIG_DEVKMEM=n
- Deshabilite el soporte para
/dev/kmem
. - Bloquear el acceso a la memoria del kernel.
- Deshabilite el soporte para
-
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.
- 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
-
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.
- Habilita la función GCC
-
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ónglibc
suficientemente reciente (2.3.3 o posterior) para eliminar el mapeo VDSO de alto mapeo y usar exclusivamente el VDSO aleatorio.
- 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
-
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?
- Instale el sistema operativo en un disco de arranque e importe manualmente la imagen a Compute Engine como una imagen personalizada.
- Si ya importó su sistema operativo como una imagen personalizada, configure ajustes que no sean del kernel en la imagen para que pueda funcionar de manera óptima dentro del entorno de Compute Engine.