NetworkPolicies
Par défaut, Kubernetes autorise tout le trafic entre pods. Un pod compromis peut contacter n'importe quel autre pod du cluster. Les NetworkPolicies implémentent le principe de moindre privilège réseau : on définit explicitement les flux autorisés, tout le reste est refusé.
Principe de fonctionnement
Les NetworkPolicies sont des règles de firewall au niveau du pod, implémentées par le CNI (Calico, Cilium, Antrea... Flannel seul ne supporte pas les NetworkPolicies). Elles sont namespaced et s'appliquent aux pods sélectionnés par un podSelector.
Une NetworkPolicy active crée un mode "deny implicite" pour le trafic ciblé : si une NetworkPolicy sélectionne un pod en ingress, tout le trafic entrant non explicitement autorisé est bloqué.
Deny-all par défaut (bonne pratique)
# Bloquer tout le trafic entrant dans le namespace
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
namespace: production
spec:
podSelector: {} # Sélectionne tous les pods du namespace
policyTypes:
- Ingress
---
# Bloquer aussi le trafic sortant
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-egress
namespace: production
spec:
podSelector: {}
policyTypes:
- EgressPolitiques granulaires
# Autoriser uniquement le frontend à parler au backend
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-ingress
namespace: production
spec:
podSelector:
matchLabels:
app: backend # S'applique aux pods backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend # Autorise uniquement le frontend
ports:
- protocol: TCP
port: 8080# Autoriser l'accès depuis un autre namespace (monitoring)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-monitoring
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: monitoring
ports:
- port: 9090# Autoriser l'egress vers DNS et une base de données externe
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: app-egress
namespace: production
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Egress
egress:
- ports: # DNS (obligatoire pour la résolution de noms)
- port: 53
protocol: UDP
- port: 53
protocol: TCP
- to:
- ipBlock:
cidr: 10.0.1.5/32 # IP de la base de données
ports:
- port: 5432Debugging des NetworkPolicies
# Tester la connectivité
kubectl run test --image=busybox --rm -it -- sh
# wget -O- http://backend-service:8080/healthz
# Lister les NetworkPolicies
kubectl get networkpolicies -A
# Avec Cilium : visualiser les flux bloqués
cilium monitor --type dropNetworkPolicies L7 avec Cilium
Cilium étend les NetworkPolicies au niveau applicatif (L7) via ses CiliumNetworkPolicy. On peut autoriser uniquement certaines méthodes HTTP, certains chemins, certains headers — ce que les NetworkPolicies Kubernetes standard (L3/L4) ne permettent pas.