Tuning e Hardening - VM

De Wiki Projeto Root
Revisão de 18h55min de 6 de fevereiro de 2026 por Diegocosta (discussão | contribs) (Criou página com '== Sobre == Este documento descreve a aplicação de tuning e hardening em máquinas virtuais (VMs) executadas sobre hosts Proxmox VE previamente ajustados. '''O princípio adotado é a separação de responsabilidades:''' * O host Proxmox é responsável por tuning agressivo de rede, I/O e CPU. * As VMs aplicam hardening de segurança e tuning leve, focado no serviço. * Nenhuma VM deve repetir os ajustes globais do host. Todos os exemplos abaixo utilizam parâmetr...')
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar

Sobre

Este documento descreve a aplicação de tuning e hardening em máquinas virtuais (VMs) executadas sobre hosts Proxmox VE previamente ajustados.

O princípio adotado é a separação de responsabilidades:

  • O host Proxmox é responsável por tuning agressivo de rede, I/O e CPU.
  • As VMs aplicam hardening de segurança e tuning leve, focado no serviço.
  • Nenhuma VM deve repetir os ajustes globais do host.

Todos os exemplos abaixo utilizam parâmetros sysctl, compatíveis com:

* Debian 11, 12 e 13
* Ubuntu Server 20.04 LTS ou superior


Tabela de decisão por tipo de VM

Esta tabela define quais ajustes aplicar em cada tipo de VM, evitando tuning excessivo e conflitos com o host Proxmox.

Tipo de VM Objetivo principal Arquivo sysctl recomendado Ajustes aplicados Ajustes a evitar
VM Base line Hardening mínimo comum 99-vm-baseline.conf Hardening de kernel, proteção de filesystem, redução leve de swap Backlog alto, buffers de rede elevados
VM Web / API Muitas conexões simultâneas 99-vm-web.conf somaxconn moderado, backlog TCP, reuso de conexões Buffers TCP máximos, netdev backlog elevado
VM Banco de Dados Consistência e memória 99-vm-db.conf swappiness mínimo, controle de overcommit Tuning agressivo de rede
VM Firewall / Proxy Processamento de tráfego 99-vm-network.conf backlog de pacotes, fila TCP maior Valores idênticos aos do host
VM Genérica Serviços simples 99-vm-baseline.conf Hardening básico Qualquer tuning adicional sem necessidade


Prefixo 99

O papel do prefixo 99:

Em sistemas Linux, os arquivos de configuração do sysctl em /etc/sysctl.d/ são carregados em ordem alfanumérica. Ou seja, o kernel aplica os parâmetros seguindo esta ordem:

1. /usr/lib/sysctl.d/*.conf

2. /run/sysctl.d/*.conf

3. /etc/sysctl.d/*.conf

4. /etc/sysctl.conf

Dentro de cada diretório, os arquivos são lidos do menor para o maior nome.

Usar 99- garante que esses arquivos sejam aplicados por último.

Eles sobrescrevam valores definidos por:

  • Distribuição
  • Pacotes instalados
  • Outros arquivos genéricos de tuning
  • O comportamento fique previsível e auditável

Exemplo prático:

10-default.conf
50-network.conf
99-vm-web.conf

O valor definido em 99-vm-web.conf vence, mesmo que os outros arquivos já tenham configurado o mesmo parâmetro.


VM Base line

Configuração mínima recomendada para todas as VMs, independentemente da função.

Crie o arquivo: 99-vm-baseline.conf

nano /etc/sysctl.d/99-vm-baseline.conf

Copie e cole o conteúdo abaixo no arquivo

############################
# Baseline de VM
############################
# Reduz o uso de swap, mantendo previsibilidade
vm.swappiness = 10
############################
# Hardening de kernel
############################
# Restringe acesso ao buffer do kernel
kernel.dmesg_restrict = 1
# Oculta ponteiros do kernel
kernel.kptr_restrict = 2
# Evita core dumps de binários setuid
fs.suid_dumpable = 0
############################
# Proteção de filesystem
############################
# Bloqueia abuso de hardlinks
fs.protected_hardlinks = 1
# Bloqueia abuso de symlinks
fs.protected_symlinks = 1
# Protege FIFOs
fs.protected_fifos = 1
# Protege arquivos regulares
fs.protected_regular = 1


VM de aplicação web ou API

Indicada para:

  • Servidores web
  • APIs REST
  • Aplicações com muitas conexões simultâneas

Crie o arquivo: 99-vm-web.conf

nano /etc/sysctl.d/99-vm-web.conf

Copie e cole o conteúdo abaixo no arquivo

############################
# VM Web / API
############################
# Aumenta fila de conexões pendentes
net.core.somaxconn = 8192
# Aumenta backlog de conexões SYN
net.ipv4.tcp_max_syn_backlog = 8192
############################
# Otimização de conexões TCP
############################
# Permite reutilização de conexões TIME_WAIT
net.ipv4.tcp_tw_reuse = 1
# Reduz tempo de fechamento de conexões
net.ipv4.tcp_fin_timeout = 15
# Evita reinício lento após idle
net.ipv4.tcp_slow_start_after_idle = 0

VM de banco de dados

Indicada para:

  • PostgreSQL
  • MySQL / MariaDB
  • Redis
  • MongoDB

O foco aqui é memória e previsibilidade, não rede.

Crie o arquivo: 99-vm-db.conf

nano /etc/sysctl.d/99-vm-db.conf

Copie e cole o conteúdo abaixo no arquivo

############################
# VM Banco de Dados
############################
# Minimiza uso de swap
vm.swappiness = 1
# Evita overcommit agressivo de memória
vm.overcommit_memory = 1

Observação importante: O tuning principal deve ser feito no próprio banco, não no kernel.

VM de firewall ou proxy

Indicada para:

  • Reverse proxy
  • Load balancer
  • Firewall virtual
  • VPN

Crie o arquivo: 99-vm-network.conf

nano /etc/sysctl.d/99-vm-network.conf

Copie e cole o conteúdo abaixo no arquivo

############################
# VM Firewall / Proxy
############################
# Aumenta fila de pacotes da interface
net.core.netdev_max_backlog = 10000
# Aumenta backlog de conexões TCP
net.ipv4.tcp_max_syn_backlog = 16384
############################
# Gerenciamento de conexões
############################
# Reduz tempo de encerramento de conexões
net.ipv4.tcp_fin_timeout = 10

Nunca utilizar os mesmos valores do host Proxmox.

Hardening adicional dentro das VMs

Além do sysctl, recomenda-se aplicar hardening em limites de recursos e systemd.


Crie o arquivo: 99-vm-limits.conf

nano /etc/security/limits.d/99-vm-limits.conf

Copie e cole o conteúdo abaixo no arquivo

# Limite máximo de arquivos abertos por processo
* soft nofile 104857
* hard nofile 104857


nano /etc/systemd/system.conf

# Limite global de arquivos abertos
DefaultLimitNOFILE=104857
# Limite global de processos
DefaultLimitNPROC=32768

Após alteração, executar:

systemctl daemon-reexec


Aplicação

Aplicar as configurações:

sysctl --system

Reboot não é obrigatório, mas recomendado em ambientes críticos.


Observações finais

  • Não replicar sysctl do host dentro das VMs
  • Ajustar apenas o necessário para o serviço
  • Documentar cada VM conforme seu perfil
  • Aplicar mudanças de forma controlada


Script de validação de perfil de VM

Crie o arquivo sysctl-vm-check.sh

nano /bin/sysctl-vm-check.sh

Copie e cole o conteúdo abaixo no arquivo

#!/bin/bash

PROFILE="$1"

if [ -z "$PROFILE" ]; then
    echo "Uso: $0 {baseline|web|db|network}"
    exit 2
fi

echo "Validação de sysctl - Perfil de VM"
echo "Perfil selecionado: $PROFILE"
echo "Host: $(hostname)"
echo "Data: $(date)"
echo

FAIL=0

check() {
    local key="$1"
    local expected="$2"

    current=$(sysctl -n "$key" 2>/dev/null)

    if [ "$current" = "$expected" ]; then
        printf "[ OK ] %-45s = %s\n" "$key" "$current"
    else
        printf "[FAIL] %-45s esperado: %s | atual: %s\n" "$key" "$expected" "${current:-N/A}"
        FAIL=1
    fi
}

############################
# Baseline comum a todas as VMs
############################

baseline_checks() {
    echo "== VM Baseline =="
    check vm.swappiness 10
    check kernel.dmesg_restrict 1
    check kernel.kptr_restrict 2
    check fs.suid_dumpable 0
    check fs.protected_hardlinks 1
    check fs.protected_symlinks 1
    check fs.protected_fifos 1
    check fs.protected_regular 1
    echo
}

############################
# Perfil Web / API
############################

web_checks() {
    echo "== VM Web / API =="
    check net.core.somaxconn 8192
    check net.ipv4.tcp_max_syn_backlog 8192
    check net.ipv4.tcp_tw_reuse 1
    check net.ipv4.tcp_fin_timeout 15
    check net.ipv4.tcp_slow_start_after_idle 0
    echo
}

############################
# Perfil Banco de Dados
############################

db_checks() {
    echo "== VM Banco de Dados =="
    check vm.swappiness 1
    check vm.overcommit_memory 1
    echo
}

############################
# Perfil Firewall / Proxy
############################

network_checks() {
    echo "== VM Firewall / Proxy =="
    check net.core.netdev_max_backlog 10000
    check net.ipv4.tcp_max_syn_backlog 16384
    check net.ipv4.tcp_fin_timeout 10
    echo
}

############################
# Execução por perfil
############################

case "$PROFILE" in
    baseline)
        baseline_checks
        ;;
    web)
        baseline_checks
        web_checks
        ;;
    db)
        baseline_checks
        db_checks
        ;;
    network)
        baseline_checks
        network_checks
        ;;
    *)
        echo "Perfil inválido: $PROFILE"
        echo "Perfis válidos: baseline | web | db | network"
        exit 2
        ;;
esac

############################
# Resultado final
############################

if [ $FAIL -eq 0 ]; then
    echo "Resultado final: PERFIL '$PROFILE' APLICADO CORRETAMENTE"
    exit 0
else
    echo "Resultado final: EXISTEM PARÂMETROS FORA DO PADRÃO PARA O PERFIL '$PROFILE'"
    exit 1
fi

Saia do arquivo e de permissão de execução

chmod +x sysctl-vm-check.sh

Execute conforme o perfil escolhido:

sysctl-vm-check.sh baseline
sysctl-vm-check.sh web
sysctl-vm-check.sh db
sysctl-vm-check.sh network