Em algumas situações, seus aplicativos podem exigir que você crie seu próprio sistema operacional ou compile um kernel personalizado. Se você compilar kernels customizados ou criar sistemas operacionais customizados para suas VMs, certifique-se de que eles atendam aos requisitos deste documento.
Construir um sistema operacional personalizado é uma tarefa avançada para usuários com aplicativos que exigem especificamente um kernel personalizado. A maioria dos usuários pode criar VMs a partir de uma das imagens públicas disponíveis, usar a ferramenta automatizada de importação de disco virtual para importar discos de outros ambientes para o Compute Engine ou importar manualmente uma imagem personalizada de um sistema com uma distribuição Linux comum.
Requisitos de suporte de hardware
Seu kernel deve suportar os seguintes dispositivos:
- Ponte PCI: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
- Ponte ISA: Intel 82371AB/EB/MB PIIX4 ISA (rev 03)
Controlador Ethernet:
- Adaptador Ethernet Virtio-Net.
gVNIC é necessário para Tau T2A de segunda geração e todas as séries de máquinas de terceira geração e posteriores.
Além disso, o gVNIC é obrigatório ou recomendado se você usar GPUs em qualquer um dos seguintes:
fornecedor = 0x1AF4 (Qumranet/Red Hat)
identificação do dispositivo = 0x1000. ID do subsistema 0x1
O descarregamento de soma de verificação é suportado
TSO v4 é compatível
GRO v4 é compatível
Controlador de armazenamento SCSI:
- Controlador de armazenamento Virtio-SCSI
- fornecedor = 0x1AF4 (Qumranet/Red Hat)
- identificação do dispositivo = 0x1004. ID do subsistema 0x8.
- Comandos primários SCSI 4 e comandos de bloco SCSI 3 são suportados
- Apenas uma fila de solicitações é suportada
- Discos permanentes relatam setores físicos de 4 KiB/setores lógicos de 512 bytes
- Somente dispositivos de bloco (discos) são suportados
- O recurso Hotplug / Events é suportado
- Portas seriais:
- Quatro portas 16550A
- ttyS0 no IRQ 4
- ttyS1 no IRQ 3
- ttyS2 no IRQ 6
- ttyS3 no IRQ 7
Opções necessárias de compilação do kernel Linux
Você deve construir o kernel do sistema operacional com as seguintes opções:
-
CONFIG_KVM_GUEST=y
- Habilite a funcionalidade de paravirtualização.
-
CONFIG_KVM_CLOCK=y
- Habilite o relógio paravirtualizado (se aplicável à sua versão do kernel).
-
CONFIG_VIRTIO_PCI=y
- Habilite dispositivos PCI paravirtualizados.
-
CONFIG_SCSI_VIRTIO=y
- Habilite o acesso a discos paravirtualizados.
-
CONFIG_VIRTIO_NET=y
- Habilite o acesso à rede.
-
CONFIG_PCI_MSI=y
- Habilite a entrega de interrupção de alto desempenho, necessária para dispositivos SSD locais.
Opções de construção de kernel para segurança
Use as configurações de segurança recomendadas nas opções de compilação do kernel:
-
CONFIG_STRICT_DEVMEM=y
- Restrinja
/dev/mem
para permitir acesso apenas ao espaço PCI, código BIOS e regiões de dados.
- Restrinja
-
CONFIG_DEVKMEM=n
- Desative o suporte para
/dev/kmem
. - Bloqueie o acesso à memória do kernel.
- Desative o suporte para
-
CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
- Defina pouca memória virtual protegida contra alocação de espaço do usuário.
-
CONFIG_DEBUG_RODATA=y
- Marque os dados somente leitura do kernel como protegidos contra gravação nas tabelas de páginas, para capturar gravações acidentais (e incorretas) em tais dados
const
. Esta opção pode ter um leve impacto no desempenho porque uma parte do código do kernel não será mais coberta por um TLB de 2 MB.
- Marque os dados somente leitura do kernel como protegidos contra gravação nas tabelas de páginas, para capturar gravações acidentais (e incorretas) em tais dados
-
CONFIG_DEBUG_SET_MODULE_RONX=y
- Captura modificações não intencionais no texto do módulo carregável do kernel e nos dados somente leitura. Esta opção também impede a execução de dados do módulo.
-
CONFIG_CC_STACKPROTECTOR=y
- Ativa o recurso
-fstack-protector
GCC. Esse recurso coloca um valor canário no início das funções críticas, na pilha antes do endereço de retorno, e valida o valor antes de realmente retornar. Isso também faz com que buffer overflows baseados em pilha (que precisam substituir esse endereço de retorno) substituam o canário, que é detectado e o ataque é então neutralizado usando um kernel panic.
- Ativa o recurso
-
CONFIG_COMPAT_VDSO=n
- Garante que o VDSO não esteja em um endereço previsível para fortalecer o ASLR. Se ativado, esse recurso mapeia o VDSO para o endereço previsível de estilo antigo, fornecendo um local previsível para onde o código de exploração pode saltar. Diga
N
aqui se você estiver executando uma versãoglibc
suficientemente recente (2.3.3 ou posterior), para remover o mapeamento VDSO altamente mapeado e usar exclusivamente o VDSO aleatório.
- Garante que o VDSO não esteja em um endereço previsível para fortalecer o ASLR. Se ativado, esse recurso mapeia o VDSO para o endereço previsível de estilo antigo, fornecendo um local previsível para onde o código de exploração pode saltar. Diga
-
CONFIG_COMPAT_BRK=n
- Não desative a randomização de heap.
-
CONFIG_X86_PAE=y
- Defina esta opção para um kernel de 32 bits porque o PAE é necessário para suporte ao NX. Isso também permite maior suporte a swapspace para fins de não overcommit.
-
CONFIG_SYN_COOKIES=y
- Fornece alguma proteção contra inundações SYN.
-
CONFIG_SECURITY_YAMA=y
- Isso seleciona a Yama, que estende o suporte DAC com configurações adicionais de segurança em todo o sistema, além dos controles de acesso discricionários regulares do Linux. Atualmente, a configuração é restrição de escopo ptrace.
-
CONFIG_SECURITY_YAMA_STACKED=y
- Esta opção força o Yama a empilhar com o LSM primário selecionado quando o Yama estiver disponível.
Configurações de segurança do kernel
Você também pode aumentar a segurança do kernel por meio do arquivo de configurações do kernel. Edite o arquivo /etc/sysctl.conf
para incluir as seguintes configurações de segurança 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
O que vem a seguir
- Instale o sistema operacional em um disco de inicialização e importe manualmente a imagem para o Compute Engine como uma imagem personalizada.
- Se você já importou seu sistema operacional como uma imagem personalizada, defina configurações não relacionadas ao kernel na imagem para que ela funcione de maneira ideal no ambiente do Compute Engine.