Infraestrutura e implantação
A aplicação pode ser perfeita e o servidor continuar escancarado. Estas verificações tratam de como e onde ela roda.
Checklist
- Exponha apenas as portas que você pretende. Um firewall do host que libera 22, 80 e 443 não basta por si só: o Docker publica portas de contêineres escrevendo regras do iptables que contornam o ufw, então um
-p 9000:9000pode ficar acessível pela internet mesmo quando o firewall "só permite 443". Vincule as portas dos contêineres a127.0.0.1, a menos que devam ser públicas, e faça um scan do seu próprio IP público para confirmar o que está realmente aberto. - Mantenha painéis administrativos fora da internet pública. Painéis como Portainer, ferramentas de administração de banco de dados e interfaces de métricas nunca devem estar expostos à internet. Um painel administrativo recém-instalado, sem conta configurada, é controle total: qualquer um que o alcance durante a janela de configuração fica dono da máquina. Políticas de reinicialização podem reabrir essa janela.
- Vincule os servidores da aplicação ao loopback e coloque um reverse proxy na frente. A aplicação escuta em
127.0.0.1; o nginx ou a borda termina o TLS e encaminha as requisições. - Faça a origem inacessível, exceto pela borda. Se você usa Cloudflare ou similar, imponha isso com authenticated origin pulls (mTLS) ou uma allowlist de IPs, para que atacantes não possam contornar o WAF acessando o IP da origem.
- Configure cabeçalhos de segurança.
Strict-Transport-Security,X-Content-Type-Options: nosniff,X-Frame-Options: DENY(ouframe-ancestors 'none'), umaContent-Security-Policyestrita (idealmentescript-src 'self', semunsafe-inlinenemunsafe-eval), umaReferrer-Policye umaPermissions-Policyrestrita. - Não revele versão e stack. Remova os banners
ServereX-Powered-By. - Bloqueie o acesso a arquivos ocultos e à saída de build.
/.env,/.git/, arquivos de configuração e source maps não devem ser acessíveis pela web. Confirme que cada um retorna 403 ou 404. - Mostre erros genéricos. Nada de stack traces ou caminhos internos para os usuários; registre os detalhes apenas no servidor.
- Mantenha o runtime atualizado e execute a aplicação com um usuário não-root e com o mínimo de privilégios, em um contêiner ou sandbox sempre que possível.
Como testar
- De uma máquina fora da sua rede, faça um scan dos seus IPs públicos em busca de portas abertas.
- Requisite
/.env,/.git/confige um arquivo.mapno seu domínio. - Leia os cabeçalhos de resposta da sua página inicial e verifique cada item acima.