Network Policies for Zero Trust — deny EVERYTHING, then allow as needed.
1. Deny All ( baseline):
1apiVersion: networking.k8s.io/v12kind: NetworkPolicy3metadata:4 name: deny-all5 namespace: production6spec:7 podSelector: {}8 policyTypes:9 - Ingress10 - Egress
2. Allow frontend → backend:
1apiVersion: networking.k8s.io/v12kind: NetworkPolicy3metadata:4 name: allow-frontend-to-backend5spec:6 podSelector:7 matchLabels:8 app: backend9 ingress:10 - from:11 - podSelector:12 matchLabels:13 app: frontend14 ports:15 - protocol: TCP16 port: 8080
3. Allow backend → database (egress):
1apiVersion: networking.k8s.io/v12kind: NetworkPolicy3metadata:4 name: backend-egress-to-db5spec:6 podSelector:7 matchLabels:8 app: backend9 egress:10 - to:11 - podSelector:12 matchLabels:13 app: database14 ports:15 - protocol: TCP16 port: 543217 # DNS (required for functionality!)18 - to:19 - namespaceSelector: {}20 podSelector:21 matchLabels:22 k8s-app: kube-dns23 ports:24 - protocol: UDP25 port: 5326 - protocol: TCP27 port: 53
Caveat: NetworkPolicy does not block DNS by default — need to add egress rule for kube-dns.
Cilium L7 NetworkPolicy:
1apiVersion: cilium.io/v22kind: CiliumNetworkPolicy3metadata:4 name: l7-policy5spec:6 endpointSelector:7 matchLabels:8 app: backend9 ingress:10 - fromEndpoints:11 - matchLabels:12 app: frontend13 toPorts:14 - ports:15 - port: "8080"16 protocol: TCP17 rules:18 http:19 - method: GET20 path: /api/.*
Cilium allows filtering at L7 level (method, path, headers).