Saltar al contenido principal

🔐 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:

MarcadorOndeO que controla
🖥️ PainelPainel do NuvionRede ao redor do cluster: grupos de segurança, IPs flutuantes, balanceadores
⌨️ kubectlLinha de comandoExposiçã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.
  • kubectl instalado no seu computador.
  • O arquivo kubeconfig do cluster:
    1. Acesse Computar > Kubernetes.
    2. Clique no nome do cluster para abrir o painel lateral.
    3. Clique em Baixar kubeconfig.
    4. 📸 [PRINT: painel lateral do cluster com o botão Baixar kubeconfig]
  • Aponte o kubectl para 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.

  1. Tenha o certificado e a chave do seu domínio (fullchain.pem e privkey.pem).
  2. 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
  1. 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 secretName e se ele está no mesmo namespace.
  • 404 em HTTPS: confira se o host do 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.

  1. Acesse Computar > Grupos de segurança.
  2. Clique no grupo desejado. Um painel lateral abre com três abas: Regras, Propriedades e VMs atribuídas.
  3. Em Regras, veja a seção Entrada. Cada linha mostra Protocolo, Intervalo de portas e Fonte.
  4. 📸 [PRINT: aba Regras de um grupo de segurança, seção Entrada]

O que procurar.

  • Fonte 0.0.0.0/0 em 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.

  1. Em Grupos de segurança, clique em Criar grupo de segurança.
  2. Preencha o Nome e, se quiser, a Descrição.
  3. 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- ou kube_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.

  1. Acesse Computar > Kubernetes. Clusters com atualização pendente mostram o selo Atualização disponível ao lado da versão.
  2. Clique no cluster e, em Versão Kubernetes, use Atualizar.
  3. 📸 [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ão NodePort.
  • O Ingress usa ingressClassName: traefik.
  • O Ingress usa a entrada websecure e tem tls com 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/0 em 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​

SintomaCausa provávelO que fazer
404 page not foundDomínio ou classe incorretosConfira o host e o ingressClassName; rode kubectl describe ingress minha-app -n minha-app
Alerta de certificadoSecret ausente ou em outro namespacekubectl get secret app-exemplo-tls -n minha-app
502/503Aplicação fora do ar ou porta errada no Servicekubectl get pods,endpoints -n minha-app
Middleware não aplicaNome ou namespace errados na anotaçãoUse o formato <namespace>-<nome>@kubernetescrd
Aplicação inacessível de foraBalanceador com problemaVeja abaixo

Como verificar o balanceador de carga no painel.

  1. Acesse Computar > Balanceadores de carga.
  2. Veja a coluna Status (Ativo ou Erro) e Estado dos membros.
  3. 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.
  4. 📸 [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).