K8s em Exemplos: Contexto de Segurança

Security context controla configurações de privilégio e acesso. Aplique no nível do Pod (todos containers) ou nível do container. Essencial para hardening de produção e defesa em profundidade.

security-context-pod.yaml

Security context no nível do Pod aplica a todos containers. runAsNonRoot previne execução como root. fsGroup define GID para volumes montados. supplementalGroups adiciona GIDs adicionais.

spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
    runAsGroup: 1000
    fsGroup: 1000
    supplementalGroups:
      - 2000
      - 3000
security-context-container.yaml

Security context no nível do container sobrescreve o nível do Pod para aquele container. Remove capabilities Linux e previne escalação de privilégio. Cada container pode ter configurações diferentes.

spec:
  containers:
    - name: app
      securityContext:
        allowPrivilegeEscalation: false
        readOnlyRootFilesystem: true
        capabilities:
          drop:
            - ALL
security-context-capabilities.yaml

Linux capabilities são privilégios granulares. Remova ALL e adicione apenas o necessário. Adições comuns: NET_BIND_SERVICE (bind em portas <1024), SYS_PTRACE (debugging). Evite capabilities perigosas como SYS_ADMIN.

securityContext:
  capabilities:
    drop:
      - ALL
    add:
      - NET_BIND_SERVICE
security-context-seccomp.yaml

Seccomp (Secure Computing Mode) restringe syscalls que um container pode fazer. RuntimeDefault usa o profile padrão do container runtime. Localhost usa um profile customizado do node.

spec:
  securityContext:
    seccompProfile:
      type: RuntimeDefault
security-context-readonly.yaml

readOnlyRootFilesystem torna o filesystem do container imutável. Previne atacantes de escrever malware. Monte volumes graváveis para diretórios que precisam de escrita.

spec:
  containers:
    - name: app
      securityContext:
        readOnlyRootFilesystem: true
      volumeMounts:
        - name: tmp
          mountPath: /tmp
        - name: cache
          mountPath: /var/cache
  volumes:
    - name: tmp
      emptyDir: {}
    - name: cache
      emptyDir:
        sizeLimit: 100Mi
security-context-production.yaml

Security context completo pronto para produção. Combine configurações de Pod e container para defesa em profundidade. Esta é a baseline recomendada para maioria dos workloads.

spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
    runAsGroup: 1000
    fsGroup: 1000
    seccompProfile:
      type: RuntimeDefault
  containers:
    - name: app
      image: my-app:v1
      securityContext:
        allowPrivilegeEscalation: false
        readOnlyRootFilesystem: true
        capabilities:
          drop:
            - ALL
      volumeMounts:
        - name: tmp
          mountPath: /tmp
  volumes:
    - name: tmp
      emptyDir: {}
terminal

Debug problemas de security context verificando eventos do Pod e status do container. Erros comuns: “container has runAsNonRoot but image will run as root” e “permission denied” em mounts de volume (frequentemente problemas de fsGroup). Use comando id para verificar usuário/grupo em execução.

$ kubectl exec my-pod -- id
uid=1000 gid=1000 groups=1000,2000,3000

$ kubectl exec my-pod -- ls -la /var/lib/data
drwxrwsr-x 2 root 1000 4096 Jan 15 10:00 .
-rw-r--r-- 1 1000 1000  128 Jan 15 10:00 config.json

$ kubectl get pod my-pod \
    -o jsonpath='{.spec.securityContext}'
{"fsGroup":1000,"runAsGroup":1000,"runAsNonRoot":true,"runAsUser":1000}

$ kubectl describe pod my-pod | grep -A5 "State:"
    State:          Running
      Started:      Mon, 15 Jan 2024 10:00:00 +0000
    Ready:          True

Índice | GitHub | Use as setas do teclado para navegar |