Como criar sistemas operacionais personalizados

Em algumas situações, você precisará criar seu próprio sistema operacional ou compilar um kernel personalizado. Isso vai depender das necessidades dos apps. Leia este documento para saber se os kernels ou os sistemas operacionais personalizados criados para as instâncias atendem aos requisitos.

A criação de um sistema operacional personalizado é uma tarefa avançada para usuários com apps que precisam especificamente de um kernel personalizado. Para a maioria dos usuários, crie instâncias de uma das imagens públicas disponíveis. Use a ferramenta de importação de disco virtual automatizada para importar discos para o Compute Engine de outros ambientes ou importe uma imagem personalizada manualmente de um sistema com uma distribuição comum de ações do Linux.

Requisitos de suporte de hardware

O kernel precisa ser compatível com 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 de Ethernet:
    • adaptador Ethernet Virtio-Net
    • fornecedor = 0x1AF4 (Qumranet/Red Hat)
    • código do dispositivo = 0x1000. Código do subsistema 0x1
    • o descarregamento de soma de verificação é compatível
    • TSO v4 é compatível
    • GRO v4 é compatível
  • controlador de armazenamento SCSI:
    • controlador de armazenamento Virtio-SCSI
    • fornecedor = 0x1AF4 (Qumranet/Red Hat)
    • código do dispositivo = 0x1004. Código do subsistema 0x8.
    • comandos primários SCSI 4 e comandos de bloco SCSI 3 são compatíveis
    • somente uma fila de solicitações é compatível
    • discos permanentes informam setores físicos de 4 KiB/setores lógicos de 512 bytes
    • somente dispositivos de bloco (discos) são compatíveis
    • o bit de recurso de hotplug/eventos é compatível
  • portas seriais:
    • quatro portas 16550A
    • ttyS0 em IRQ 4
    • ttyS1 em IRQ 3
    • ttyS2 em IRQ 6
    • ttyS3 em IRQ 7

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

Compile o kernel do sistema operacional 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 for aplicável à versão do kernel).
  • CONFIG_VIRTIO_PCI=y
    • Ative 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 o envio de interrupções de alto desempenho, que é necessário para dispositivos SSD locais.

Opções de compilação do 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 o acesso apenas ao espaço do PCI, ao código de BIOS e às regiões de dados.
  • CONFIG_DEVKMEM=n
    • Desative o suporte para /dev/kmem.
    • Bloqueie o acesso à memória do kernel.
  • CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
    • Configure a memória virtual baixa que é protegida contra alocação de espaço de usuários.
  • CONFIG_DEBUG_RODATA=y
    • Marque os dados somente leitura do kernel como protegidos contra gravação nas tabelas de páginas para identificar gravações acidentais (e incorretas) nesses dados const. Essa opção pode ter um pequeno impacto no desempenho, já que uma parte do código do kernel não será mais coberta por um TLB de 2 MB.
  • CONFIG_DEBUG_SET_MODULE_RONX=y
    • Captura modificações não intencionais no texto do módulo do kernel carregável e em dados somente leitura. Essa opção também impede a execução de dados do módulo.
  • CONFIG_CC_STACKPROTECTOR=y
    • Ativa o recurso -fstack-protector do GCC. Esse recurso coloca um valor canário no início das funções críticas, na pilha imediatamente anterior ao endereço de retorno, e valida o valor imediatamente antes de retornar. Isso também faz com que os estouros de buffer com base em pilha (que precisam substituir esse endereço de retorno) substituam o canário, que é detectado, e o ataque é neutralizado pelo uso de um kernel panic.
  • CONFIG_COMPAT_VDSO=n
    • Assegura que o VDSO não esteja em um endereço previsível para fortalecer o ASLR. Se ativado, esse recurso mapeia o VDSO até o endereço previsível no estilo antigo, fornecendo um local previsível em que o código de exploração pode ir. Diga N aqui se estiver executando uma versão glibc suficientemente recente (2.3.3 ou posterior), para remover o mapeamento VDSO mapeado alto e usar exclusivamente o VDSO aleatório.
  • CONFIG_COMPAT_BRK=n
    • Não desative a randomização da pilha.
  • CONFIG_X86_PAE=y
    • Defina esta opção para um kernel de 32 bits, já que o PAE é necessário para a compatibilidade com NX. Isso também proporciona maior compatibilidade de swapspace para tarefas sem relação com overcommit.
  • CONFIG_SYN_COOKIES=y
    • Fornece proteção contra saturação de SYN.
  • CONFIG_SECURITY_YAMA=y
    • Seleciona o Yama, que amplia a compatibilidade do DAC com configurações adicionais de segurança para todo o sistema, além dos controles de acesso discricionários do Linux. Atualmente, a configuração é de restrição do escopo ptrace.
  • CONFIG_SECURITY_YAMA_STACKED=y
    • Esta opção força o Yama (quando disponível) a realizar o empilhamento com o LSM primário selecionado.

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

# Implement RFC 1337 fix
net.ipv4.tcp_rfc1337 = 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

A seguir

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Compute Engine