Tuning e Hardening - VM: mudanças entre as edições
(→Sobre) |
|||
| (23 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
| Linha 1: | Linha 1: | ||
== Sobre == | == 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 princípio adotado é a separação de responsabilidades:''' | ||
| Linha 15: | Linha 15: | ||
* Ubuntu Server 20.04 LTS ou superior | * Ubuntu Server 20.04 LTS ou superior | ||
</pre> | </pre> | ||
== Removendo Kernel Antigo no Linux == | |||
https://wiki.projetoroot.com.br/index.php?title=Remover_Kernel_Linux_Antigo | |||
| Linha 51: | Linha 54: | ||
| backlog de pacotes, fila TCP maior | | backlog de pacotes, fila TCP maior | ||
| Valores idênticos aos do host | | Valores idênticos aos do host | ||
|} | |} | ||
== Prefixo 99 == | == Prefixo 99 == | ||
| Linha 96: | Linha 92: | ||
O valor definido em '''99-vm-baseline.conf''' vence, mesmo que os outros arquivos já tenham configurado o mesmo parâmetro. | 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 == | |||
{| class="wikitable" | |||
! 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 == | == VM Base line == | ||
Configuração mínima recomendada para '''todas as VMs''', independentemente da função. | 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''' | Crie o arquivo: '''99-vm-baseline.conf''' | ||
| Linha 134: | Linha 220: | ||
</pre> | </pre> | ||
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 | |||
<pre> | |||
sysctl vm.swappiness | |||
sysctl kernel.dmesg_restrict | |||
sysctl fs.protected_symlinks | |||
</pre> | |||
== VM de aplicação web ou API == | == VM de aplicação web ou API == | ||
| Linha 166: | Linha 265: | ||
# Evita reinício lento após idle | # Evita reinício lento após idle | ||
net.ipv4.tcp_slow_start_after_idle = 0 | net.ipv4.tcp_slow_start_after_idle = 0 | ||
</pre> | |||
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 | |||
<pre> | |||
sysctl net.core.somaxconn | |||
sysctl net.ipv4.tcp_tw_reuse | |||
sysctl net.ipv4.tcp_fin_timeout | |||
</pre> | </pre> | ||
| Linha 198: | Linha 312: | ||
'''Observação importante:''' | '''Observação importante:''' | ||
O tuning principal deve ser feito no próprio banco, não no kernel. | 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 | |||
<pre> | |||
sysctl vm.swappiness | |||
sysctl vm.overcommit_memory | |||
</pre> | |||
== VM de firewall ou proxy == | == VM de firewall ou proxy == | ||
| Linha 231: | Linha 358: | ||
'''Nunca utilizar os mesmos valores do host Proxmox.''' | '''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 | |||
<pre> | |||
sysctl net.core.netdev_max_backlog | |||
sysctl net.ipv4.tcp_fin_timeout | |||
</pre> | |||
== Hardening adicional dentro das VMs == | == Hardening adicional dentro das VMs == | ||
| Linha 244: | Linha 384: | ||
<pre> | <pre> | ||
# Limite máximo de arquivos abertos por processo | # Limite máximo de arquivos abertos por processo | ||
# Todos usuários | |||
* soft nofile 104857 | * soft nofile 104857 | ||
* hard nofile 104857 | * hard nofile 104857 | ||
# Root explícito | |||
root soft nofile 104857 | |||
root hard nofile 104857 | |||
</pre> | </pre> | ||
Para ajustar limites globais systemd | |||
nano /etc/systemd/system.conf | nano /etc/systemd/system.conf | ||
<pre> | <pre> | ||
# Limite global de arquivos abertos | # Limite global de arquivos abertos | ||
| Linha 256: | Linha 401: | ||
DefaultLimitNPROC=32768 | DefaultLimitNPROC=32768 | ||
</pre> | </pre> | ||
Após valide a modificação com | |||
ulimit -n | |||
Após alteração, executar: | Após alteração, executar: | ||
systemctl daemon-reexec | systemctl daemon-reexec | ||
Verificar com: | |||
systemctl show | grep DefaultLimit | |||
Abra nova sessão SSH ou shell e valide: | |||
<pre> | |||
ulimit -n | |||
ulimit -u | |||
</pre> | |||
== Aplicação == | == Aplicação == | ||
| Linha 266: | Linha 426: | ||
<pre> | <pre> | ||
systemctl daemon-reexec | |||
sysctl --system | sysctl --system | ||
</pre> | </pre> | ||
| Linha 281: | Linha 442: | ||
* Aplicar mudanças de forma controlada | * Aplicar mudanças de forma controlada | ||
== Script de validação de perfil de VM == | == Script de validação de perfil de VM == | ||
| Linha 418: | Linha 578: | ||
Saia do arquivo e de permissão de execução | Saia do arquivo e de permissão de execução | ||
chmod +x sysctl-vm-check.sh | chmod +x /bin/sysctl-vm-check.sh | ||
Execute conforme o perfil escolhido: | Execute conforme o perfil escolhido: | ||
Edição atual tal como às 00h14min de 3 de março de 2026
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