Passer au contenu principal

Réseau (Kubernetes)

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:
  - Egress

Politiques 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: 5432

Debugging 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 drop

NetworkPolicies 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.

Sources