En algunas situaciones, es posible que tus aplicaciones requieran que compiles tu propio sistema operativo o que compiles un kernel personalizado. Si compilas kernels personalizados o creas sistemas operativos personalizados para tus VMs, asegúrate de que cumplan 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 VMs a partir de una de las imágenes públicas disponibles, usar la herramienta de importación de discos virtuales automatizada para importar discos a Compute Engine desde otros entornos o importar manualmente una imagen personalizada desde un sistema con una distribución de Linux estándar común.
Requisitos de asistencia de hardware
Tu kernel debe ser compatible con 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.
gVNIC es obligatorio para la segunda generación de Tau T2A y para todas las series de máquinas de tercera generación y posteriores.
Además, se requiere o se recomienda gVNIC si usas GPUs en cualquiera de los siguientes elementos:
vendor = 0x1AF4 (Qumranet/Red Hat)
device id = 0x1000. ID de subsistema 0x1
Se admite la descarga de checksum
Se admite TSO v4
Se admite GRO v4
Controlador de almacenamiento SCSI:
- Controlador de almacenamiento Virtio-SCSI
- vendor = 0x1AF4 (Qumranet/Red Hat)
- device id = 0x1004. ID de 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 de sectores físicos de 4 KiB y sectores lógicos de 512 bytes
- Solo se admiten dispositivos de bloque (discos)
- Se admite el bit de función Hotplug/Eventos
- 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 necesarias
Debes compilar el kernel del sistema operativo con las siguientes opciones:
CONFIG_KVM_GUEST=y
- Habilita la función de paravirtualización.
CONFIG_KVM_CLOCK=y
- Habilita el reloj paravirtualizado (si se aplica a tu versión del kernel).
CONFIG_VIRTIO_PCI=y
- Habilita los dispositivos PCI paravirtualizados.
CONFIG_SCSI_VIRTIO=y
- Habilita el acceso a discos paravirtualizados.
CONFIG_VIRTIO_NET=y
- Habilita el acceso a la red.
CONFIG_PCI_MSI=y
- Habilita la entrega de interrupciones de alto rendimiento, que es necesaria para los dispositivos SSD locales.
Opciones de compilación del kernel para la seguridad
Usa los ajustes de seguridad recomendados en las opciones de compilación del kernel:
CONFIG_STRICT_DEVMEM=y
- Restringe
/dev/mem
para permitir el acceso solo al espacio PCI, al código de la BIOS y a las regiones de datos.
- Restringe
CONFIG_DEVKMEM=n
- Inhabilita la compatibilidad con
/dev/kmem
. - Bloquea el acceso a la memoria del kernel.
- Inhabilita la compatibilidad con
CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
- Define una memoria virtual baja que esté protegida de la asignación del espacio de usuario.
CONFIG_DEBUG_RODATA=y
- Marca 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, ya que una parte del código del kernel ya no estará cubierta por un TLB de 2 MB.
- Marca 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 impide la ejecución de los datos del módulo.
CONFIG_CC_STACKPROTECTOR=y
- Habilita la función
-fstack-protector
de GCC. Esta función coloca un valor de canary al principio de las funciones críticas, en la pila antes de la dirección de retorno, y valida el valor antes de devolverlo. Esto también provoca que los desbordamientos de búfer basados en la pila (que necesitan sobrescribir esta dirección de retorno) sobrescriban el canary, que se detecta y el ataque se neutraliza mediante un pánico del kernel.
- Habilita la función
CONFIG_COMPAT_VDSO=n
- Asegura que el VDSO no esté en una dirección predecible para reforzar ASLR. Si está habilitada, esta función asigna el VDSO a la dirección predecible de estilo antiguo, lo que proporciona una ubicación predecible a la que puede saltar el código de exploit.
Escribe
N
aquí si tienes una versión deglibc
lo suficientemente reciente (2.3.3 o posterior) para eliminar la asignación de VDSO con asignación alta y usar exclusivamente el VDSO aleatorio.
- Asegura que el VDSO no esté en una dirección predecible para reforzar ASLR. Si está habilitada, esta función asigna el VDSO a la dirección predecible de estilo antiguo, lo que proporciona una ubicación predecible a la que puede saltar el código de exploit.
Escribe
CONFIG_COMPAT_BRK=n
- No inhabilite la aleatorización del montículo.
CONFIG_X86_PAE=y
- Define esta opción para un kernel de 32 bits, ya que PAE es necesario para la compatibilidad con NX. También permite una mayor compatibilidad con el espacio de intercambio para fines que no sean de sobrecompromiso.
CONFIG_SYN_COOKIES=y
- Proporciona cierta protección contra la inundación SYN.
CONFIG_SECURITY_YAMA=y
- De esta forma, se selecciona Yama, que amplía la compatibilidad con DAC con ajustes de seguridad adicionales en todo el sistema más allá de los controles de acceso discrecional de Linux. Actualmente, el ajuste es la restricción del ámbito de ptrace.
CONFIG_SECURITY_YAMA_STACKED=y
- Esta opción obliga a Yama a apilarse con el LSM principal seleccionado cuando Yama esté disponible.
Ajustes de seguridad del kernel
También puedes reforzar la seguridad del kernel mediante el archivo de configuración del kernel. Edite el archivo /etc/sysctl.conf
para incluir los siguientes ajustes de seguridad recomendados:
# 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
Siguientes pasos
- Instala el sistema operativo en un disco de arranque y importa manualmente la imagen a Compute Engine como imagen personalizada.
- Si ya has importado tu sistema operativo como imagen personalizada, configura los ajustes que no sean del kernel en la imagen para que funcione de forma óptima en el entorno de Compute Engine.