Intermediário Sistema e Host

Segurança de Containers — Docker, Kubernetes, imagens, capabilities e network policies

Containers não são VMs. Eles compartilham o kernel do host. Um container comprometido pode impactar o host ou outros containers se as configurações de segurança não forem aplicadas corretamente.

Segurança de imagens Docker

A imagem é o ponto de partida. Uma imagem insegura contamina todos os containers derivados:

# Ruim: usa root, imagem base genérica e grande
FROM ubuntu:latest
RUN apt-get install -y python3
COPY app.py /app/app.py
CMD ["python3", "/app/app.py"]

# Melhor: imagem mínima, usuário não-root, sem pacotes desnecessários
FROM python:3.12-alpine
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
CMD ["python3", "app.py"]

Escaneie imagens antes do deploy:

# Trivy — scanner de vulnerabilidades em imagens
trivy image python:3.12-alpine
trivy image --severity HIGH,CRITICAL minha-app:latest

Capabilities Linux — reduza ao mínimo

Containers herdam capabilities do kernel. Remova tudo e adicione só o necessário:

# docker-compose.yml
services:
  app:
    image: minha-app:latest
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE   # só se precisar de porta < 1024
    security_opt:
      - no-new-privileges:true
    read_only: true

Nunca rode containers com --privileged em produção — isso equivale a dar acesso root ao host.

Seccomp e AppArmor

Seccomp filtra quais syscalls o container pode fazer:

# Docker já aplica um perfil seccomp padrão
# Para inspecionar o perfil atual:
docker inspect --format='{{.HostConfig.SecurityOpt}}' meu_container

# Aplicar perfil customizado restritivo:
docker run --security-opt seccomp=/path/to/perfil.json minha-app

Kubernetes — configurações de segurança

Pod Security Standards

# SecurityContext no pod
apiVersion: v1
kind: Pod
metadata:
  name: app-segura
spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
    fsGroup: 2000
    seccompProfile:
      type: RuntimeDefault
  containers:
  - name: app
    image: minha-app:1.2.3
    securityContext:
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
      capabilities:
        drop: ["ALL"]

Network Policies — segmentação de rede

Por padrão, todos os pods se comunicam entre si. Network Policies implementam o princípio do menor privilégio na camada de rede:

# Permitir apenas tráfego do frontend para o backend na porta 8080
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: producao
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 8080

RBAC — controle de acesso

# ServiceAccount com permissões mínimas
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: app-reader
rules:
- apiGroups: [""]
  resources: ["configmaps"]
  verbs: ["get", "list"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: app-reader-binding
subjects:
- kind: ServiceAccount
  name: minha-app-sa
roleRef:
  kind: Role
  name: app-reader
  apiGroup: rbac.authorization.k8s.io

Checklist de segurança

Docker:
  - Imagem base mínima (alpine, distroless)
  - Usuário não-root no Dockerfile
  - Scan de vulnerabilidades no CI/CD (Trivy, Grype)
  - Sem secrets em variáveis de ambiente — use secrets manager
  - Sem --privileged, sem montagem de /var/run/docker.sock

Kubernetes:
  - Pod Security Standards habilitado (enforce: restricted)
  - Network Policies definidas para todos os namespaces
  - RBAC com ServiceAccounts dedicadas por aplicação
  - Imagens com tag de versão fixa (nunca :latest em produção)
  - Admission controllers: OPA/Gatekeeper ou Kyverno para enforce de políticas