Em algumas situações, você precisará criar seu próprio sistema operacional ou compilar um kernel personalizado. Isso vai depender das necessidades dos aplicativos. Leia este documento para saber se os kernels ou os sistemas operacionais personalizados criados para as VMs atendem aos requisitos.
A criação de um sistema operacional personalizado é uma tarefa avançada para usuários com aplicativos que precisam especificamente de um kernel personalizado. A maioria dos usuários pode criar VMs 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 Linux de estoque comum.
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. O gVNIC é necessário para VMs Tau T2A.
- 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
- 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.
- 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
- 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.
- 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
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 anterior ao endereço de retorno e valida o valor 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.
- Ativa o recurso
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ãoglibc
suficientemente recente (2.3.3 ou posterior), para remover o mapeamento VDSO mapeado alto e usar exclusivamente o VDSO aleatório.
- 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
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
# 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
- Instale o sistema operacional em um disco de inicialização e importe a imagem manualmente para o Compute Engine como uma imagem personalizada.
- Se você já tiver importado o sistema operacional como uma imagem personalizada, defina as configurações não relacionadas ao kernel na imagem para que ela possa funcionar sem problemas no ambiente do Compute Engine.