Bez network policies může v Kubernetes každý pod komunikovat s každým jiným podem ve všech namespacech. Kompromitovaný pod tak má přístup k databázi, interním API a dalším službám bez omezení. Default deny s explicitním povolením je základ zero-trust přístupu v Kubernetes — každá komunikace musí být explicitně povolena. Lateral movement po kompromitaci jednoho podu je tak výrazně ztížen.
Default deny¶
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
spec:
podSelector: {}
policyTypes: [Ingress, Egress]
Tato politika blokuje veškerý příchozí i odchozí provoz pro všechny pody v namespace. Je to výchozí bod — od něj přidáváte explicitní výjimky. Bez policyTypes by prázdný podSelector neměl žádný efekt. Nastavte default deny v každém namespace a pak přidávejte specifická pravidla pro povolení potřebné komunikace.
Povolení specifické komunikace¶
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
Tato politika říká: pod s labelem app: api přijímá ingress provoz pouze od podů s labelem app: frontend na portu 8080 a smí posílat egress provoz pouze na pody app: postgres na portu 5432. Veškerá ostatní komunikace zůstává blokována default deny politikou.
Praktické tipy¶
Začněte audit módem — nasaďte politiky s logging CNI pluginem (Cilium) a sledujte, jaká komunikace probíhá. Pak postupně přidávejte omezení. Nezapomínejte na egress pravidla pro DNS (port 53 na kube-dns) — bez nich pody nebudou schopny resolvovat doménová jména. Používejte namespace selectors pro komunikaci mezi namespacemi.
Klíčový takeaway¶
Default deny all, pak povolujte explicitně. Network policies vyžadují CNI plugin s podporou policies (Calico, Cilium, Weave Net). Vanilla Kubernetes s kubenet network policies nepodporuje.