No Debian e Ubuntu, Nginx registra em /var/log/nginx/access.log e error.log, e Apache em /var/log/apache2/access.log e error.log. No RHEL, Rocky e Alma, Apache usa /var/log/httpd/access_log e error_log, com underscores e sem extensão. Em contêineres construídos a partir da imagem oficial do Nginx, não há arquivos de log: tudo vai para stdout e stderr, então os logs do docker são a sua exportação.
O log do servidor web é frequentemente o primeiro lugar onde uma intrusão deixa um rastro: o scanner procurando por arquivos .env, a string de exploit, o POST para um arquivo que não deveria existir. O Prime Core tem 812 regras de detecção para logs de servidor web, mapeadas para 337 técnicas MITRE ATT&CK. Entre elas: exploração de aplicativos voltados para a internet (T1190), web shells (T1505.003) e varredura de vulnerabilidades (T1595.002).
Antes de começar
Encontre os caminhos reais. Hosts virtuais costumam registrar em locais personalizados. Pergunte ao próprio servidor:
# Nginx: descarte a configuração efetiva completa e destaque as diretivas de log
sudo nginx -T 2>/dev/null | grep -E 'access_log|error_log'
# Apache
sudo apachectl -S
sudo grep -Ri -E 'CustomLog|ErrorLog' /etc/apache2/ /etc/httpd/ 2>/dev/null
No Apache baseado em Debian, hosts virtuais sem seu próprio CustomLog terminam em other_vhosts_access.log. As pessoas sempre perdem esse.
Verifique de quem você está registrando o IP. Atrás de um balanceador de carga, CDN ou proxy reverso, cada requisição pode parecer vir do proxy. Isso ocorre a menos que o servidor esteja configurado para registrar o cliente real: set_real_ip_from e real_ip_header no Nginx, mod_remoteip no Apache. Se cada linha mostra os mesmos poucos IPs internos, o endereço do invasor está apenas no X-Forwarded-For, se você registrá-lo, ou nos próprios logs do proxy.
Verifique o formato. Ambos os servidores têm como padrão o formato “combined”, mas muitas configurações o personalizam (log_format no Nginx, LogFormat no Apache). Note como o seu se parece antes de fazer upload.
Permissões. No Debian e Ubuntu, esses logs são legíveis pelo root e pelo grupo adm; em outros lugares, planeje usar sudo.
Exportar de arquivos de log
Os logs rodam diariamente ou semanalmente, então inclua os arquivos rotacionados. zcat -f lê arquivos plain e gzip comprimidos igualmente:
# Nginx, atuais e rotacionados, do mais antigo para o mais recente
sudo zcat -f $(ls -tr /var/log/nginx/access.log*) > web-03_nginx_access.log
# Apache no RHEL
sudo zcat -f $(ls -tr /var/log/httpd/access_log*) > web-03_httpd_access.lo
Para um único dia, timestamps no formato combinado tornam grep suficiente:
grep '19/Out/2026' web-03_nginx_access.log > web-03_access_1019.log
Leve também o log de erros. Falhas a montante, erros PHP e algumas tentativas de exploração aparecem apenas lá.
Exportar de contêineres
# Docker: stdout é o log de acesso, stderr o log de erros
docker logs --since 2026-10-19T00:00:00 --until 2026-10-20T00:00:00 nginx > nginx_access.log 2> nginx_error.log
# Kubernetes
kubectl logs deploy/nginx --since=24h > nginx.log
Logs de contêiner desaparecem com o contêiner a menos que algo os colete. Se o pod foi substituído, verifique o coletor de logs do seu cluster.
O que procurar
| Padrão | O que geralmente significa |
|---|---|
| Explosões de 404s para /.env, /.git/config, /wp-login.php, /phpmyadmin | Varredura automatizada |
| ../, ${jndi:, union select, <script> na URL | Tentativas de exploração: travessia, Log4Shell, injeção SQL, XSS |
| 200 em um POST para um arquivo estranho em um diretório de upload | Possível shell web; veja o que mais aquele IP requisitou |
| Agentes de usuário como sqlmap, nikto, nuclei | Ferramentas que não se preocuparam em se esconder |
| Um pico de 5xx logo após solicitações estranhas | Algo quebrou, possivelmente porque um exploit foi aplicado |
Faça upload, sanitização e revisão no LogTotal
- Upload. Abra logtotal.com e solte o ficheiro.
- Sanitizar. [what gets masked: client IPs, hostnames, usernames and tokens in URLs]. Look it over before you continue. Query strings often carry session tokens.
- Revisar.
Quando dá errado
| Sintoma | Causa provável | Fix |
|---|---|---|
| Sem /var/log/nginx | Caminho personalizado, ou está em um contêiner | nginx -T, ou logs do docker |
| access.log existe mas está vazio | Logs vão para stdout, ou access_log desativado | Verifique a configuração e o container |
| Toda solicitação vem dos mesmos IPs | Proxy ou balanceador de carga na frente; IP real não configurado | Use X-Forwarded-For ou os logs do proxy |
| Apenas os últimos dias | Arquivos rotacionados não incluídos | Use o comando zcat -f com o * glob |
| Permissão negada | Não é root, não está no grupo adm | sudo |
FAQ
Qual importa mais, o log de acesso ou o log de erros?
O log de acesso diz o que foi requisitado. O log de erros diz o que quebrou. Em um caso de exploração, você quer ambos, lado a lado.
E quanto ao IIS?
O IIS escreve logs W3C em C:inetpublogsLogFiles por padrão. Isso ganha seu próprio guia.