🔐 Boas práticas de segurança para expor aplicações com Ingress e Traefik
Este guia mostra como publicar aplicações no seu cluster Kubernetes do Nuvion de forma segura, com Ingress e Traefik. Você não precisa de experiência prévia: cada prática explica por que importa, como fazer e como confirmar que funcionou.
🧭 Como sua aplicação é exposta
O tráfego da internet segue este caminho:
Internet → Balanceador de carga → Traefik → Service → Pod da sua aplicação
- Balanceador de carga: recurso do Nuvion, com IP público, que recebe as conexões nas portas 80 e 443.
- Traefik: o controlador de Ingress. Ele lê suas regras e encaminha cada domínio para a aplicação certa.
- Ingress: o arquivo (YAML) em que você declara qual domínio vai para qual aplicação.
- Service: o endereço interno estável da sua aplicação.
A segurança tem duas camadas, e cada prática abaixo indica onde agir:
| Marcador | Onde | O que controla |
|---|---|---|
| 🖥️ Painel | Painel do Nuvion | Rede ao redor do cluster: grupos de segurança, IPs flutuantes, balanceadores |
| ⌨️ kubectl | Linha de comando | Exposição das aplicações: Ingress, Service, Middleware, TLS |
💡 O painel do Nuvion não possui tela para criar Ingress. Esse recurso é configurado por
kubectl.
✅ Antes de começar
- Um cluster Kubernetes ativo no Nuvion.
kubectlinstalado no seu computador.- O arquivo kubeconfig do cluster:
- Acesse Computar > Kubernetes.
- Clique no nome do cluster para abrir o painel lateral.
- Clique em Baixar kubeconfig.
- 📸 [PRINT: painel lateral do cluster com o botão Baixar kubeconfig]
- Aponte o
kubectlpara o arquivo baixado:
export KUBECONFIG=$HOME/Downloads/kubeconfig
kubectl get nodes
Se a lista de nós aparecer, está tudo pronto.
🚀 Práticas recomendadas
1. Exponha aplicações com Ingress, não com NodePort ⌨️
Por que importa. Um Service do tipo NodePort abre uma porta em todos os nós do cluster, fora do controle do Traefik. Isso ignora o HTTPS, os headers e os limites que você configurou no Ingress.
Como verificar.
kubectl get svc -A | grep NodePort
Como corrigir. Troque o tipo do Service para ClusterIP:
kubectl patch svc minha-app -n minha-app -p '{"spec":{"type":"ClusterIP"}}'
Depois publique a aplicação pelo Ingress (práticas 2 e 3).
Como validar.
kubectl get svc minha-app -n minha-app
A coluna TYPE deve mostrar ClusterIP.
2. Use a IngressClass do Traefik e a entrada segura ⌨️
Por que importa. O Ingress precisa dizer qual controlador o atende. Um Ingress com classe errada, como nginx em um cluster que só tem Traefik, é aceito pelo Kubernetes mas nunca recebe tráfego.
Como verificar a classe disponível.
kubectl get ingressclass
Como fazer. Declare a classe e a entrada websecure (HTTPS) no Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minha-app
namespace: minha-app
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure
traefik.ingress.kubernetes.io/router.tls: "true"
spec:
ingressClassName: traefik
tls:
- hosts:
- app.exemplo.com.br
secretName: app-exemplo-tls
rules:
- host: app.exemplo.com.br
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: minha-app
port:
number: 80
kubectl apply -f ingress.yaml --dry-run=server # simula, sem aplicar
kubectl apply -f ingress.yaml
Como validar.
kubectl get ingress -n minha-app
A coluna CLASS deve mostrar traefik.
⚠️ O Traefik não interpreta anotações
nginx.ingress.kubernetes.io/*. Se você migrou de NGINX, converta essas regras para Middlewares do Traefik (práticas 4 e 5).
3. Habilite HTTPS em todas as rotas ⌨️
Por que importa. Sem HTTPS, senhas e dados trafegam em texto claro e podem ser lidos por terceiros no caminho. Sem certificado válido, o navegador exibe alerta de segurança aos seus clientes.
Como fazer.
- Tenha o certificado e a chave do seu domínio (
fullchain.pemeprivkey.pem). - Crie o Secret de TLS no mesmo namespace do Ingress:
kubectl create secret tls app-exemplo-tls \
--cert=fullchain.pem --key=privkey.pem -n minha-app
- Referencie o Secret no Ingress, como no exemplo da prática 2 (
secretName).
💡 Se a sua plataforma oferece emissão automática de certificados (cert-manager), prefira-a: o certificado é emitido e renovado sem intervenção. Confirme com o suporte se ela está disponível no seu cluster.
Redirecionar HTTP para HTTPS. Se o seu cluster ainda não redireciona globalmente, crie um redirecionamento para o seu domínio:
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: redirect-https
namespace: minha-app
spec:
redirectScheme:
scheme: https
permanent: true
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minha-app-http
namespace: minha-app
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: web
traefik.ingress.kubernetes.io/router.middlewares: minha-app-redirect-https@kubernetescrd
spec:
ingressClassName: traefik
rules:
- host: app.exemplo.com.br
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: minha-app
port:
number: 80
Como validar.
curl -sI http://app.exemplo.com.br # deve responder 301 ou 308 com Location: https://...
curl -sI https://app.exemplo.com.br # deve responder 200
Erros comuns.
- Alerta de certificado no navegador: o Traefik está servindo o certificado padrão. Confira o nome do Secret em
secretNamee se ele está no mesmo namespace. - 404 em HTTPS: confira se o
hostdo Ingress é exatamente o domínio acessado.
4. Aplique headers de segurança e limite de requisições ⌨️
Por que importa. Headers de segurança instruem o navegador a se proteger de ataques comuns. O limite de requisições (rate limit) impede que um único cliente sobrecarregue a aplicação.
Como fazer. Crie os Middlewares no namespace da aplicação:
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: security-headers
namespace: minha-app
spec:
headers:
stsSeconds: 31536000
stsIncludeSubdomains: true
contentTypeNosniff: true
frameDeny: true
referrerPolicy: strict-origin-when-cross-origin
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: rate-limit
namespace: minha-app
spec:
rateLimit:
average: 100
burst: 50
Anexe os Middlewares ao Ingress com a anotação abaixo. O formato é <namespace>-<nome>@kubernetescrd:
annotations:
traefik.ingress.kubernetes.io/router.middlewares: minha-app-security-headers@kubernetescrd,minha-app-rate-limit@kubernetescrd
💡 O Middleware precisa estar no mesmo namespace do Ingress.
Como validar.
curl -sI https://app.exemplo.com.br | grep -i -E 'strict-transport|x-frame|x-content-type'
O limite average: 100 significa cerca de 100 requisições por segundo, por padrão. Ajuste ao tráfego esperado da sua aplicação.
5. Restrinja o acesso a áreas administrativas ⌨️
Por que importa. Painéis de administração, dashboards e ferramentas internas não devem ficar abertos para a internet.
Como fazer. Libere apenas os IPs que precisam de acesso:
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: admin-allowlist
namespace: minha-app
spec:
ipAllowList:
sourceRange:
- 203.0.113.10/32 # IP do escritório (exemplo)
Anexe o Middleware ao Ingress da rota administrativa, como na prática 4.
Como validar. Acesse a rota de um IP não autorizado: deve retornar 403 Forbidden.
⚠️ Se a regra bloquear até quem deveria passar, o Traefik pode estar vendo o IP do balanceador, e não o do cliente. Nesse caso, peça ao administrador do cluster para verificar a política de tráfego externo (
externalTrafficPolicy) do Service do Traefik.
6. Revise grupos de segurança e IPs flutuantes 🖥️
Por que importa. Os grupos de segurança são o firewall das suas VMs e nós. Uma regra com origem 0.0.0.0/0 significa "qualquer pessoa na internet". Portas como SSH (22) e RDP (3389) abertas para o mundo são alvo constante de ataques automatizados.
Como revisar as regras.
- Acesse Computar > Grupos de segurança.
- Clique no grupo desejado. Um painel lateral abre com três abas: Regras, Propriedades e VMs atribuídas.
- Em Regras, veja a seção Entrada. Cada linha mostra Protocolo, Intervalo de portas e Fonte.
- 📸 [PRINT: aba Regras de um grupo de segurança, seção Entrada]
O que procurar.
- Fonte
0.0.0.0/0em portas administrativas (22, 3389). - Intervalos de portas muito amplos.
- Grupos que não estão atribuídos a nenhuma VM (aba VMs atribuídas).
Como corrigir.
- Para remover uma regra, clique no ícone de lixeira na linha.
- Para adicionar uma regra, clique em Adicionar na seção Entrada e informe o IP de origem permitido, em vez de
0.0.0.0/0. - 📸 [PRINT NECESSÁRIO: formulário de adicionar regra]
- Antes de alterar um grupo, confira a aba VMs atribuídas para saber o que será afetado.
Para criar um grupo novo.
- Em Grupos de segurança, clique em Criar grupo de segurança.
- Preencha o Nome e, se quiser, a Descrição.
- Clique em Adicionar.
IPs flutuantes. Em Computar > IPs flutuantes, a tabela mostra cada endereço, seu Status (Ativo ou Inativo), a que recurso está Atribuída e o Endereço IP da MV. Dê IP público apenas ao que precisa ser alcançado da internet, como o balanceador de carga. Para acesso administrativo, prefira um bastion ou VPN.
⚠️ Os grupos e balanceadores criados automaticamente pelo cluster (com nomes que começam com
k8s-oukube_service_) são gerenciados pelo Kubernetes. Evite excluí-los ou alterá-los à mão, pois isso pode derrubar o acesso ao cluster ou à aplicação. Para mudar a exposição de uma aplicação, altere o Service ou o Ingress.
7. Proteja o kubeconfig e o acesso à sua conta 🖥️ ⌨️
Por que importa. O arquivo kubeconfig é uma credencial: quem o possui controla o cluster. Se ele vazar, o atacante tem os mesmos poderes que você.
Boas práticas.
- Não envie o kubeconfig por e-mail ou chat e não o guarde em repositórios Git.
- Restrinja a permissão do arquivo:
chmod 600 kubeconfig. - Baixe um kubeconfig novo quando alguém sair da equipe (Computar > Kubernetes, cluster, Baixar kubeconfig).
- Ative o MFA na sua conta e use Equipes para dar a cada pessoa só o acesso de que precisa. Veja a documentação do Nuvion em MFA.
Como verificar o que o seu acesso permite.
kubectl auth can-i --list
8. Mantenha o cluster atualizado 🖥️
Por que importa. Versões antigas do Kubernetes deixam de receber correções de segurança.
Como saber se há atualização.
- Acesse Computar > Kubernetes. Clusters com atualização pendente mostram o selo Atualização disponível ao lado da versão.
- Clique no cluster e, em Versão Kubernetes, use Atualizar.
- 📸 [PRINT: campo Versão Kubernetes com o botão Atualizar]
Antes de atualizar.
- Leia as notas de versão do Kubernetes.
- Teste em um cluster de laboratório.
- Faça backup dos dados e dos manifestos das aplicações.
- Atualize uma versão menor por vez (por exemplo, 1.31 → 1.32).
📋 Checklist final
Antes de publicar uma aplicação, confira:
- O Service é
ClusterIP, e nãoNodePort. - O Ingress usa
ingressClassName: traefik. - O Ingress usa a entrada
websecuree temtlscom um Secret válido. - HTTP redireciona para HTTPS.
- Headers de segurança e rate limit aplicados.
- Rotas administrativas com lista de IPs permitidos.
- Nenhuma regra de entrada com
0.0.0.0/0em portas 22 ou 3389. - Só os recursos necessários têm IP flutuante.
- kubeconfig protegido e MFA ativo na conta.
- Cluster na versão atual do Kubernetes.
🛠️ Solução de problemas
| Sintoma | Causa provável | O que fazer |
|---|---|---|
404 page not found | Domínio ou classe incorretos | Confira o host e o ingressClassName; rode kubectl describe ingress minha-app -n minha-app |
| Alerta de certificado | Secret ausente ou em outro namespace | kubectl get secret app-exemplo-tls -n minha-app |
502/503 | Aplicação fora do ar ou porta errada no Service | kubectl get pods,endpoints -n minha-app |
| Middleware não aplica | Nome ou namespace errados na anotação | Use o formato <namespace>-<nome>@kubernetescrd |
| Aplicação inacessível de fora | Balanceador com problema | Veja abaixo |
Como verificar o balanceador de carga no painel.
- Acesse Computar > Balanceadores de carga.
- Veja a coluna Status (Ativo ou Erro) e Estado dos membros.
- Clique no balanceador para abrir o painel lateral, aba Descrição geral. Ali aparecem os gráficos de Estado dos membros (Íntegro, Não íntegro, Erro, Desabilitado), Rede, Conexões ativas e Solicitações de erro. Use os botões 1 h, 6 h, 12 h, 24 h e 7 d para mudar o período.
- 📸 [PRINT: painel de visão geral do balanceador de carga]
Se o status for Erro ou houver membros Não íntegro, abra um chamado com o suporte informando o nome do balanceador.
🧠 Dúvidas?
Entre em contato com o suporte técnico da plataforma (24/7).