Requisitos para criar imagens personalizadas

Em algumas situações, as suas aplicações podem exigir que crie o seu próprio sistema operativo ou compile um kernel personalizado. Se compilar kernels personalizados ou criar sistemas operativos personalizados para as suas VMs, certifique-se de que cumprem os requisitos neste documento.

Criar um sistema operativo personalizado é uma tarefa avançada para utilizadores com aplicações que requerem especificamente um kernel personalizado. A maioria dos utilizadores pode criar VMs a partir de uma das imagens públicas disponíveis, usar a ferramenta de importação de discos virtuais automatizada para importar discos para o Compute Engine a partir de outros ambientes ou importar manualmente uma imagem personalizada a partir de um sistema com uma distribuição Linux comum.

Requisitos de apoio técnico de hardware

O seu kernel tem de suportar os seguintes dispositivos:

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

    • Adaptador Ethernet Virtio-Net.
    • O gVNIC é obrigatório para a segunda geração Tau T2A, e todas as séries de máquinas de terceira geração e posteriores.

      Além disso, a gVNIC é obrigatória ou recomendada se usar GPUs em qualquer um dos seguintes casos:

      • Tipos de máquinas N1 de utilização geral
      • Tipos de máquinas otimizados pelo acelerador A4, A3, A2 ou G2
    • vendor = 0x1AF4 (Qumranet/Red Hat)

    • device id = 0x1000. ID do subsistema 0x1

    • A descarga de checksum é suportada

    • O TSO v4 é suportado

    • O GRO v4 é suportado

  • Controlador de armazenamento SCSI:

    • Controlador de armazenamento Virtio-SCSI
    • vendor = 0x1AF4 (Qumranet/Red Hat)
    • device id = 0x1004. Subsystem ID 0x8.
    • Os comandos primários SCSI 4 e os comandos de blocos SCSI 3 são suportados
    • Só é suportada uma fila de pedidos
    • Os discos persistentes comunicam setores físicos de 4 KiB / setores lógicos de 512 bytes
    • Apenas são suportados dispositivos de bloqueio (discos)
    • O bit de funcionalidade Hotplug / Events é suportado
  • Portas de série:
    • Quatro portas 16550A
    • ttyS0 no IRQ 4
    • ttyS1 on IRQ 3
    • ttyS2 on IRQ 6
    • ttyS3 no IRQ 7

Opções de compilação do kernel do Linux necessárias

Tem de criar o kernel do sistema operativo com as seguintes opções:

  • CONFIG_KVM_GUEST=y
    • Ative a funcionalidade de paravirtualização.
  • CONFIG_KVM_CLOCK=y
    • Ative o relógio paravirtualizado (se aplicável à versão do seu kernel).
  • CONFIG_VIRTIO_PCI=y
    • Ative os dispositivos PCI paravirtualizados.
  • CONFIG_SCSI_VIRTIO=y
    • Ative o acesso a discos paravirtualizados.
  • CONFIG_VIRTIO_NET=y
    • Ative o acesso à rede.
  • CONFIG_PCI_MSI=y
    • Ative a entrega de interrupções de elevado desempenho, que é necessária para dispositivos SSD locais.

Opções de compilação do kernel para segurança

Use as definições de segurança recomendadas nas opções de compilação do kernel:

  • CONFIG_STRICT_DEVMEM=y
    • Restrinja /dev/mem para permitir o acesso apenas ao espaço PCI, ao código BIOS e às regiões de dados.
  • CONFIG_DEVKMEM=n
    • Desativar o suporte para /dev/kmem.
    • Bloquear o acesso à memória do kernel.
  • CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
    • Definir memória virtual baixa protegida da atribuição do espaço do utilizador.
  • CONFIG_DEBUG_RODATA=y
    • Marcar os dados de leitura apenas do kernel como protegidos contra escrita nas tabelas de páginas para detetar escritas acidentais (e incorretas) nesses dados const. Esta opção pode ter um ligeiro impacto no desempenho, uma vez que uma parte do código do kernel deixa de ser coberta por um TLB de 2 MB.
  • CONFIG_DEBUG_SET_MODULE_RONX=y
    • Deteta modificações não intencionais no texto do módulo do kernel carregável e nos dados só de leitura. Esta opção também impede a execução de dados de módulos.
  • CONFIG_CC_STACKPROTECTOR=y
    • Ativa a funcionalidade -fstack-protector do GCC. Esta funcionalidade coloca um valor de canário no início das funções críticas, na pilha antes do endereço de retorno e valida o valor antes de devolver efetivamente. Isto também faz com que os excessos de capacidade de buffer baseados na pilha (que precisam de substituir este endereço de retorno) substituam o canary, que é detetado e o ataque é, em seguida, neutralizado através de um pânico do kernel.
  • CONFIG_COMPAT_VDSO=n
    • Garante que o VDSO não está num endereço previsível para reforçar o ASLR. Se estiver ativada, esta funcionalidade mapeia a VDSO para o endereço previsível do estilo antigo, fornecendo uma localização previsível para o código de exploração saltar. Diga N aqui se estiver a executar uma versão glibc suficientemente recente (2.3.3 ou posterior) para remover o mapeamento VDSO com mapeamento elevado e usar exclusivamente o VDSO aleatório.
  • CONFIG_COMPAT_BRK=n
    • Não desative o modo aleatório da memória.
  • CONFIG_X86_PAE=y
    • Defina esta opção para um kernel de 32 bits, uma vez que o PAE é necessário para o suporte de NX. Isto também permite uma maior compatibilidade com o espaço de troca para fins que não sejam de sobrecompromisso.
  • CONFIG_SYN_COOKIES=y
    • Oferece alguma proteção contra ataques SYN "flood".
  • CONFIG_SECURITY_YAMA=y
    • Isto seleciona o Yama, que expande o suporte de DAC com definições de segurança adicionais ao nível do sistema além dos controlos de acesso discricionários regulares do Linux. Atualmente, a definição é a restrição do âmbito ptrace.
  • CONFIG_SECURITY_YAMA_STACKED=y
    • Esta opção força o Yama a ser sobreposto com o LSM principal selecionado quando o Yama está disponível.

Definições de segurança do kernel

Também pode reforçar a segurança do kernel através do ficheiro de definições do kernel. Edite o ficheiro /etc/sysctl.conf para incluir as seguintes definiçõ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 se segue?