Tuning e Hardening - VM
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