Tuning e Hardening - VM

De Wiki Projeto Root
Revisão de 00h14min de 3 de março de 2026 por Diegocosta (discussão | contribs) (→‎Sobre)
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar

Sobre

Olá! Visitante, reunimos aqui, informações sobre o processo de tuning e hardening em máquinas virtuais (VMs) executadas sobre hosts Proxmox VE previamente ajustados ,ou seja, no servidor virtual, para máquinas bare metal veja a página dedicada para host em Tuning_e_Hardening_-_Host . Sendo este procedimento realizado para aumentar o desempenho entre 10% a 40% dependendo do hardware até um pouco mais. Estes ajustes podem auxiliar em momentos que algum sistema ou rede tenham gargalo, ou até mesmo evita um upgrade desnecessário de infra, uma vez que por padrão o Kernel Linux vem em modo conservador, assim mantendo a compatibilidade entre os mais diversos tipos de utilização. Após os ajustes abaixo recomenda-se fazer reboot em seu equipamento, assim efetivando todas as modificações no processo de boot do sistema.

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

Removendo Kernel Antigo no Linux

https://wiki.projetoroot.com.br/index.php?title=Remover_Kernel_Linux_Antigo


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

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-baseline.conf

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

Script Projeto Root

Para facilitar deixamos um script para fazer todo o processo de forma automatizada, assim agilizando o processo de instalação, caso queira utilizar veja:

https://github.com/projetoroot/tuning-vm

Para instalar automaticamente faça:

Acesse sua VM ( Linux que será aplicado o tuning ) por ssh com usuário root e execute a linha abaixo

wget https://raw.githubusercontent.com/projetoroot/tuning-vm/refs/heads/main/install.sh && bash install.sh


Caso queira instalar manualmente, consulte antes a tabela comparativa dos procedimentos e escolha o que melhor atende às suas necessidades.

Comparação Script ou Manual

Critério Manual Script Automático Observação Técnica
Configuração de parâmetros Controle total, definido manualmente Aplicação padronizada de perfis Manual é melhor para ajuste fino. Script garante consistência entre VMs
Conflito entre arquivos sysctl Possível se configs antigas não forem removidas Perfis antigos removidos automaticamente Script reduz risco de override silencioso
Permissões e naming Dependem do operador Padronizados automaticamente Evita arquivo ser ignorado pelo sysctl
Repetibilidade Baixa, difícil reproduzir estado idêntico Alta, resultado consistente Importante em ambientes com várias VMs
Auditoria de estado Não há controle interno Perfil ativo registrado Facilita troubleshooting e inventário
Validação Manual via comandos Check automático executado Reduz erro humano
Flexibilidade Máxima Limitada aos perfis Manual permite ajustes específicos
Tempo operacional Maior Menor Diferença cresce com escala
Probabilidade de erro Moderada a alta Baixa Script reduz etapas manuais
Diagnóstico futuro Mais difícil entender estado aplicado Estado rastreável Relevante em incidentes
Escalabilidade Baixa Alta Script adequado para ambientes NOC
Adequação ambiente pequeno Boa escolha Pode ser excesso Poucas máquinas não justificam automação
Adequação ambiente grande Difícil manter padrão Recomendado Script ganha valor operacional

VM Base line

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

Acesse o shell com root e carregue o ambiente completo desse usuário (Passo importante)

su -

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

Após ajustar a permissão

chmod 644 /etc/sysctl.d/99-vm-baseline.conf

Para aplicar imediatamente

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

Verifique se as mudanças no kernel foram realizadas

sysctl vm.swappiness
sysctl kernel.dmesg_restrict
sysctl fs.protected_symlinks

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


Após ajustar a permissão

chmod 644 /etc/sysctl.d/99-vm-web.conf

Para aplicar imediatamente

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

Verifique se as mudanças no kernel foram realizadas

sysctl net.core.somaxconn
sysctl net.ipv4.tcp_tw_reuse
sysctl net.ipv4.tcp_fin_timeout

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.

Após ajustar a permissão

chmod 644 /etc/sysctl.d/99-vm-db.conf

Para aplicar imediatamente

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

Verifique se as mudanças no kernel foram realizadas

sysctl vm.swappiness
sysctl vm.overcommit_memory

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.

Após ajustar a permissão

chmod 644 /etc/sysctl.d/99-vm-network.conf

Para aplicar imediatamente

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

Verifique se as mudanças no kernel foram realizadas

sysctl net.core.netdev_max_backlog
sysctl net.ipv4.tcp_fin_timeout

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
# Todos usuários
* soft nofile 104857
* hard nofile 104857

# Root explícito
root soft nofile 104857
root hard nofile 104857

Para ajustar limites globais systemd

nano /etc/systemd/system.conf
# Limite global de arquivos abertos
DefaultLimitNOFILE=104857
# Limite global de processos
DefaultLimitNPROC=32768

Após valide a modificação com

ulimit -n


Após alteração, executar:

systemctl daemon-reexec

Verificar com:

systemctl show | grep DefaultLimit


Abra nova sessão SSH ou shell e valide:

ulimit -n
ulimit -u

Aplicação

Aplicar as configurações:

systemctl daemon-reexec
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 /bin/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