Hardening de kernel Linux e wordpress para servidores de produção

🔐 O que é hardening de kernel?

Hardening de kernel é o processo de reduzir a superfície de ataque do sistema operacional, limitando comportamentos perigosos, prevenindo exploração de vulnerabilidades e dificultando escalonamento de privilégios — sem quebrar aplicações.


📌 1. Requisitos antes de aplicar

✔ Teste sempre em ambiente de staging
✔ Tenha acesso via console/VNC (não apenas SSH)
✔ Faça backup ou snapshot do servidor
✔ Conheça seu workload (containers, VPN, firewall, etc.)


⚙️ 2. Hardening com sysctl (kernel runtime)

Crie ou edite:

/etc/sysctl.d/99-hardening.conf

🔒 Proteções contra exploração e escalonamento

kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
kernel.yama.ptrace_scope = 1
kernel.unprivileged_bpf_disabled = 1
kernel.randomize_va_space = 2

✔ Protege contra leak de endereços
✔ Bloqueia ptrace entre processos
✔ Mantém ASLR ativo


🌐 Proteções de rede (anti-spoofing e ataques comuns)

net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

net.ipv4.tcp_syncookies = 1

✔ Evita spoofing
✔ Bloqueia redirects maliciosos
✔ Mitiga SYN Flood


🚫 ICMP e broadcast

net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1

🔐 Endurecimento de filesystem

fs.protected_hardlinks = 1
fs.protected_symlinks = 1
fs.suid_dumpable = 0

✔ Protege contra ataques via symlink
✔ Evita dump de processos SUID


🔄 Aplicar regras

sysctl --system

🧩 3. Desabilitar módulos de kernel perigosos

Crie:

/etc/modprobe.d/hardening.conf
install cramfs /bin/true
install freevxfs /bin/true
install jffs2 /bin/true
install hfs /bin/true
install hfsplus /bin/true
install udf /bin/true

✔ Elimina vetores de ataque raros
✔ Nenhum impacto em servidores web


🚷 4. Desativar core dumps

echo '* hard core 0' > /etc/security/limits.d/99-core.conf

🔑 5. Restringir acesso ao kernel e memória

chmod 600 /boot/config-*
chmod 700 /boot
mount -o remount,hidepid=2 /proc

⚠️ Cuidado: hidepid=2 pode afetar ferramentas de monitoramento.


🧠 6. Compilar kernel customizado (opcional – alto nível)

Se você controla o kernel:

CONFIG_SECURITY=y
CONFIG_HARDENED_USERCOPY=y
CONFIG_STACKPROTECTOR_STRONG=y
CONFIG_STRICT_KERNEL_RWX=y
CONFIG_RANDOMIZE_BASE=y

👉 Ideal para servidores críticos, não obrigatório para VPS padrão.



🔥 7. Combine com outras camadas (obrigatório)

Hardening de kernel não substitui:

✔ Firewall (nftables/iptables)
Crowdsec(Clique aqui e veja como instalar Crowdsec)
Fail2ban(opcional se utilizar Crowdsec)
✔ SSH hardening
✔ Atualizações automáticas
✔ Monitoramento ativo (Zabbix, Netdata, etc.)


⚠️ O que NÃO fazer em produção

❌ Desabilitar IPv6 sem testar
❌ Bloquear ptrace totalmente (breaks debuggers)
❌ Aplicar sysctl de “blog aleatório”
❌ Copiar hardening de desktop para servidor


📊 Checklist rápido

✅ ASLR ativo
✅ BPF restrito
✅ Redirects desativados
✅ FS protegido
✅ Módulos inúteis bloqueados
✅ LSM ativo
✅ Monitoramento funcional

8. Arquivo 99-hardening.conf pronto para uso


📁 PARTE 1 — 99-hardening.conf por distribuição

Todos os arquivos abaixo ficam em:

/etc/sysctl.d/99-hardening.conf

Após criar:

sysctl --system

🟠 Ubuntu 20.04 / 22.04 / 24.04 (LTS)

Compatível com Apache, Nginx, PHP-FPM, MariaDB, Docker (com ressalvas)

############################
# Kernel hardening
############################
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
kernel.unprivileged_bpf_disabled = 1
kernel.randomize_va_space = 2
kernel.sysrq = 0
kernel.yama.ptrace_scope = 1

############################
# Filesystem protections
############################
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
fs.suid_dumpable = 0
fs.protected_fifos = 2
fs.protected_regular = 2

############################
# Network hardening
############################
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_timestamps = 0

############################
# ICMP protection
############################
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1

############################
# IPv6 (mantém ativo e seguro)
############################
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0

🔵 AlmaLinux / Rocky Linux 8 / 9

SELinux-friendly (modo Enforcing)

############################
# Kernel
############################
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
kernel.unprivileged_bpf_disabled = 1
kernel.randomize_va_space = 2
kernel.sysrq = 0

############################
# Filesystem
############################
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
fs.suid_dumpable = 0
fs.protected_fifos = 2
fs.protected_regular = 2

############################
# Network
############################
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

net.ipv4.tcp_syncookies = 1

############################
# ICMP
############################
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1

🟢 Debian 11 / 12

Muito estável para WordPress e DirectAdmin

kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
kernel.unprivileged_bpf_disabled = 1
kernel.randomize_va_space = 2
kernel.sysrq = 0
kernel.yama.ptrace_scope = 1

fs.protected_hardlinks = 1
fs.protected_symlinks = 1
fs.suid_dumpable = 0
fs.protected_fifos = 2
fs.protected_regular = 2

net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_timestamps = 0

9.🧩 PARTE 2 — Hardening específico para WordPress (produção)

Aqui o foco é reduzir exploits comuns (RCE, LFI, brute force, malware) sem quebrar plugins ou updates.


🔐 1. Kernel + FS (essencial)

Já coberto pelo 99-hardening.conf, mas adicione:

Desabilitar módulos raros (comum em exploits)

/etc/modprobe.d/wordpress-hardening.conf
install cramfs /bin/true
install freevxfs /bin/true
install hfs /bin/true
install hfsplus /bin/true
install udf /bin/true

🗂️ 2. Permissões corretas (crítico)

Nunca rode WordPress como 777. Abaixo exemplos de diretorio com 755 e arquivos 644.Altere /var/www para o caminho da conta do usuário.

find /var/www -type d -exec chmod 755 {} \;
find /var/www -type f -exec chmod 644 {} \;

wp-config.php

chmod 600 wp-config.php

🔐 WordPress – Bloquear execução fora do necessário

NGINX + Apache (.htaccess)

🎯 Objetivo
Impedir RCE, uploads maliciosos, execução indevida de PHP e exploits comuns, bloqueando antes do PHP sempre que possível.


🧱 CENÁRIO

  • NGINX como proxy reverso OU standalone
  • Apache por trás (opcional)
  • PHP-FPM ou mod_php

✔ Regra de ouro: NGINX bloqueia primeiro → Apache reforça


🥇 PARTE 1 — NGINX (OBRIGATÓRIO SE EXISTIR)

📍 Arquivo do site (server {})

1️⃣ Bloquear PHP em uploads (CRÍTICO)

location ~* ^/wp-content/uploads/.*\.php$ {
    deny all;
    access_log off;
    log_not_found off;
}

2️⃣ Bloquear PHP em wp-includes

location ~* ^/wp-includes/.*\.php$ {
    deny all;
}

3️⃣ Plugins (OPCIONAL – use com cautela)

location ~* ^/wp-content/plugins/.*\.php$ {
    deny all;
}

❗ Pode quebrar plugins com endpoints próprios.


4️⃣ Proteger arquivos sensíveis

location ~* /(wp-config\.php|readme\.html|license\.txt) {
    deny all;
}

location ~ /\. {
    deny all;
}

5️⃣ Bloquear XML-RPC (recomendado)

location = /xmlrpc.php {
    deny all;
}

6️⃣ Executar PHP APENAS onde é necessário

location ~ \.php$ {
    try_files $uri =404;

    include fastcgi_params;
    fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

➡️ Com isso, somente:

  • /index.php
  • /wp-login.php
  • /wp-admin/*.php

executam PHP.


🥈 PARTE 2 — APACHE (.htaccess) (SEGUNDA CAMADA)

📍 /wp-content/uploads/.htaccess

<FilesMatch "\.php$">
    Require all denied
</FilesMatch>

Options -ExecCGI
php_flag engine off

📍 /wp-includes/.htaccess

<FilesMatch "\.php$">
    Require all denied
</FilesMatch>

📍 /wp-content/plugins/.htaccess (OPCIONAL)

Seguro (recomendado)

<FilesMatch "\.php$">
    Require all granted
</FilesMatch>

📍 .htaccess (RAIZ)

<FilesMatch "(wp-config\.php|readme\.html|license\.txt)">
    Require all denied
</FilesMatch>

<FilesMatch "^\.">
    Require all denied
</FilesMatch>

<Files xmlrpc.php>
    Require all denied
</Files>

<LimitExcept GET POST HEAD>
    Require all denied
</LimitExcept>

🧪 TESTES OBRIGATÓRIOS

URLResultado
/wp-content/uploads/test.php❌ 403
/wp-includes/version.php❌ 403
/wp-config.php❌ 403
/xmlrpc.php❌ 403
/wp-login.php✅ OK
/wp-admin/admin.php✅ OK

Teste rápido:

curl -I https://site.com/wp-content/uploads/test.php

⚠️ OBSERVAÇÕES IMPORTANTES

  • .htaccess impacta performance → VHost no nginx é melhor
  • php_flag pode ser ignorado em PHP-FPM, mas <FilesMatch> continua eficaz
  • Nunca use permissões 777
  • Sempre teste plugins após hardening

✅ CHECKLIST FINAL

✔ PHP bloqueado em uploads
✔ PHP bloqueado em wp-includes
✔ Execução restrita ao core
✔ Arquivos sensíveis protegidos
✔ XML-RPC bloqueado


🔑 10. WordPress SALTs (obrigatório)

No wp-config.php:

define('DISALLOW_FILE_EDIT', true);
define('DISALLOW_FILE_MODS', true); // se usar deploy/versionamento

🛡️ 11. PHP Hardening (essencial para WP)

php.ini

expose_php = Off
display_errors = Off
cgi.fix_pathinfo = 0
allow_url_fopen = Off
allow_url_include = Off

Funções perigosas

disable_functions = exec,passthru,shell_exec,system,proc_open,popen

📊 8. Monitoramento essencial

✔ Fail2ban com filtros WP ou Crowdsec (Clique aqui para aprender Como instalar Crowdsec)
✔ Monitorar:

  • consumo de CPU por PHP-FPM
  • execuções fora de /usr/bin/php
  • alterações em wp-config.php

✅ Checklist final WordPress

✔ Kernel hardened
✔ PHP restrito
✔ Uploads protegidos
✔ Execução PHP limitada
✔ Permissões corretas
✔ XML-RPC controlado
✔ Backups fora do webroot

Clique aqui e consulte nossos planos de Gerenciamento de Servidor