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:
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.
- Restrinja
CONFIG_DEVKMEM=n
- Desativar o suporte para
/dev/kmem
. - Bloquear o acesso à memória do kernel.
- Desativar o suporte para
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.
- 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
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.
- Ativa a funcionalidade
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ãoglibc
suficientemente recente (2.3.3 ou posterior) para remover o mapeamento VDSO com mapeamento elevado e usar exclusivamente o VDSO aleatório.
- 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
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?
- Instale o sistema operativo num disco de arranque e importe manualmente a imagem para o Compute Engine como uma imagem personalizada.
- Se já importou o seu sistema operativo como uma imagem personalizada, configure as definições que não são do kernel na imagem para que possa funcionar de forma ideal no ambiente do Compute Engine.