Ohne Network Policies kann in Kubernetes jeder Pod mit jedem anderen Pod ueber alle Namespaces hinweg kommunizieren. Ein kompromittierter Pod hat somit uneingeschraenkten Zugriff auf Datenbanken, interne APIs und andere Dienste. Default Deny mit explizitem Erlauben ist die Grundlage von Zero Trust in Kubernetes — jede Kommunikation muss explizit erlaubt werden. Laterale Bewegung nach der Kompromittierung eines einzelnen Pods wird dadurch erheblich erschwert.
Default Deny¶
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
spec:
podSelector: {}
policyTypes: [Ingress, Egress]
Diese Policy blockiert jeglichen ein- und ausgehenden Verkehr fuer alle Pods im Namespace. Sie ist der Ausgangspunkt — von hier fuegen Sie explizite Ausnahmen hinzu. Ohne policyTypes haette ein leerer podSelector keine Wirkung. Setzen Sie Default Deny in jedem Namespace und fuegen Sie dann spezifische Regeln hinzu, um die notwendige Kommunikation zu erlauben.
Spezifische Kommunikation erlauben¶
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-api
spec:
podSelector:
matchLabels:
app: api
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- port: 8080
egress:
- to:
- podSelector:
matchLabels:
app: postgres
ports:
- port: 5432
Diese Policy besagt: Ein Pod mit dem Label app: api akzeptiert Ingress-Verkehr nur von Pods mit dem Label app: frontend auf Port 8080 und darf Egress-Verkehr nur an Pods app: postgres auf Port 5432 senden. Jede andere Kommunikation bleibt durch die Default-Deny-Policy blockiert.
Praktische Tipps¶
Beginnen Sie im Audit-Modus — stellen Sie Policies mit einem Logging-CNI-Plugin (Cilium) bereit und beobachten Sie, welche Kommunikation stattfindet. Fuegen Sie dann schrittweise Einschraenkungen hinzu. Vergessen Sie nicht Egress-Regeln fuer DNS (Port 53 zu kube-dns) — ohne sie koennen Pods keine Domainnamen aufloesen. Verwenden Sie Namespace-Selektoren fuer die Kommunikation zwischen Namespaces.
Wichtigste Erkenntnis¶
Default Deny All, dann explizit erlauben. Network Policies erfordern ein CNI-Plugin mit Policy-Unterstuetzung (Calico, Cilium, Weave Net). Vanilla Kubernetes mit kubenet unterstuetzt keine Network Policies.