El hardening de la NSA viene con varias secciones, mas interesante que el OWASP que son los fallos mundiales. Sin configuraciones practicas y especificas para no ser parte de ese grupito.
La guia PDF de NSA del gobierno de estados unidos tiene mucho mas detalle y explicacion de porque cada punto.
Pero la lista en KubeArmor github es mas aplicable.
Hardening de Pods:
- Los contenedores deben ser construidos, con usuarios de tipo non-root y de grupos non-root. Y deben ser colocados los non-root user en el manifiesto de K8.
apiVersion: v1
kind: Pod
metadata:
name: non-root-pod
spec:
securityContext:
runAsUser: 1001 #El usaurio no debe ser 0
runAsGroup: 1001 #El grupo no debe ser 0
runAsNonRoot: true # Esta bandera deber ser true
containers:
- name: app
image: nginx
- Usar motores de contenedores rootless. Son estos motores que no tienen root en sus imagenes, me sucede con Openshift.
- Hacer los filesystem inmutables. Hay una bandera para esto en los manifiestos.
containers:
- name: app
image: nginx
securityContext:
readOnlyRootFilesystem: true # Debe ser true
- Usar repositorios confiables e imagenes firmadas digitalmente.
- Escanear los contenedores (scheck sysdig blogs)
- Forzar la aplicacion de politicas segun el cluster y el caso de uso (PSA, PSP, kyverno, OPA).
- Harden las capacidades del pod (Linux capabilites) solo usar las necesarias segun el caso de uso.
securityContext:
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
- Prevenir el automount de cuentas de servicio en un pod. Lo ideal es que no se habiliten estas credenciales. Si un pod necesita acceso al cluster o servicios internos o externos debe ser mediante RBAC.
spec:
automountServiceAccountToken: false
- Usar una container runtime Hardened, con alguna estrategia (Hypervisor-backed or Kernel based or Application sandboxes container runtimes). Como gVisor o FireCracker
- Restringir los PIDs de los pods.
En el kubelet (si tiene acceso)
--pod-max-pids=100
--system-reserved=pid=1000
--kube-reserved=pid=500
Hardening de Namespaces:
- Aislar los namespaces para multiples individuos, equipos o aplicaciones mediante reglas RBAC.
- Limitar los recursos (Resource Quota, LimitRange Policy)
Hardening de Red y Plano de control:
- Utilizar una network policy por defecto para denegar todo el trafico de ingress o egress a cualquier pod.
- Utilizar certificados TLS para encriptar el trafico para todos los servicios que se exponen externamente, mediante NodePort, LoadBalancer u otros.
- El API Server no debe exponerse a internet o a una red que no sea de confianza
- Aplicar certifciados TLS para forzar la comunicacion HTTPS entre el etcd y el api-server.
- Usar una CA (autoridad certificadora) para el etcd.
- Usuarios no autenticados non-root deben ser bloqueados de acceder a kubeconfig files, etc.
- Segmenta la red, de los worker nodes y los control nodes. Segun el tipo de trafico.
- Encritar todo el trafico entre componentes de kubernetes.
- Restringir todo el acceso a recursos de tipo secret mediante RBAC policies.
- Usar una encriptacion fuerte para los datos de secretos.
- Si se ejecuta en un cloud provider, prevenir el acceso a la instancia de metadatos cloud.
Autenticacion y autorizacion:
- Implemetar un metodo de autenticacion o delegar la autenticacion a un servicio de terceros.
- Deshabilitar los request anonimos mediante la opcion –anonymous-auth=false en el API Server
- Crear politicas RBAC, con usuarios unicos para roles, administradores, developers, service accounts y equipos de infraestructura.
- El acceso a pods debe ser restringido para aquellos que los necesitan mediante RBAC.
For a more detailed information, check out: https://media.defense.gov/2022/Aug/29/2003066362/-1/-1/0/CTR_KUBERNETES_HARDENING_GUIDANCE_1.2_20220829.PDF