Tuning e Hardening - VM: mudanças entre as edições
(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...') |
|||
| Linha 92: | Linha 92: | ||
10-default.conf | 10-default.conf | ||
50-network.conf | 50-network.conf | ||
99-vm- | 99-vm-baseline.conf | ||
</pre> | </pre> | ||
O valor definido em '''99-vm- | O valor definido em '''99-vm-baseline.conf''' vence, mesmo que os outros arquivos já tenham configurado o mesmo parâmetro. | ||
== VM Base line == | == VM Base line == | ||
Edição das 19h11min de 6 de fevereiro de 2026
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-baseline.conf
O valor definido em 99-vm-baseline.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