Aller au contenu principal
Sommaire de la formation

Les Network Policies : Règles de sécurité pour contrôler le trafic réseau entre les pods

coolibra339 vues

Les Network Policies sont des objets Kubernetes qui permettent de définir des règles de sécurité pour contrôler le trafic réseau entre les pods. Ils sont utilisés pour définir les politiques de sécurité réseau au niveau du namespace et permettent de spécifier quel trafic est autorisé ou refusé entre les pods.

Pour tester les NetworkPolicy, vous devez d'abord déployer les applications correspondantes (par exemple, web-app, nginx, frontend, backend, et database).

 

Exemple 1 : Autoriser tout le trafic dans un namespace (politique de réseau ouvert) :

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all-policy
namespace: dev
spec:
  podSelector: {}  # Sélectionne tous les pods de l'espace de noms
  policyTypes:
  - Ingress         # Autorise le trafic entrant (des autres pods)
  - Egress          # Autorise le trafic sortant (vers d'autres pods)

 

Dans cet exemple, la Network Policy allow-all-policy spécifie que tous les pods du namesapce dev associé sont autorisés à communiquer les uns avec les autres, que ce soit en entrée ou en sortie.

Exemple 2 : Autoriser uniquement un certain type de trafic entrant :

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-http-policy
spec:
  podSelector: {}  # Sélectionne tous les pods de l'espace de noms
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: web     # Autorise le trafic entrant depuis les pods avec l'étiquette "app: web"
  policyTypes:
  - Ingress

Dans cet exemple, la Network Policy allow-http-policy spécifie que tous les pods du namespace sont autorisés à recevoir du trafic entrant uniquement des pods qui ont l'étiquette "app: web".

Exemple 3 : Autoriser le trafic sortant uniquement vers un service spécifique :

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-outgoing-db-policy
spec:
  podSelector: {}  # Sélectionne tous les pods de l'espace de noms
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: database    # Autorise le trafic sortant vers les pods avec l'étiquette "app: database"
  policyTypes:
  - Egress

Dans cet exemple, la Network Policy allow-outgoing-db-policy spécifie que tous les pods du namespace sont autorisés à envoyer du trafic sortant uniquement vers les pods qui ont l'étiquette "app: database".

 

Restriction avec des règles plus strictes

  • frontend: Le service frontend est la seule autorisée à envoyé du flux sur le web-app sur le port 80
  • web-app: Le service web-app autorise en entrée que le flux venant de frontend sur le port 80 et ne peut envoyer du flux que vers le backend sur le port 5678
  • backend: Le service backend autorise en entrée que le flux venant de web-app sur le port 5678 et ne peut envoyer du flux que vers le database sur le port 5432
  • database: Le service database autorise en entrée que le flux venant de backend sur ke port 5432

  • Frontend.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
  labels:
    app: frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
        - name: frontend
          image: nginx:alpine
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: frontend
  labels:
    app: frontend
spec:
  selector:
    app: frontend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

---

# Seul le pod frontend peut acceder qu'au pod web-app sur le port 80.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-webapp
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: web-app      
  egress: # frontend peut appeler que le web-app sur le port 80
    - to:
        - podSelector:
            matchLabels:
              app: web-app
      ports:
        - protocol: TCP
          port: 80
    - to: # Permettre les requêtes DNS
        - namespaceSelector: {}
          podSelector:
            matchLabels:
              k8s-app: kube-dns
      ports:
        - protocol: UDP
          port: 53
  policyTypes:
    - Egress

 

  • Webb-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  labels:
    app: web-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
        - name: web-app
          image: nginx:alpine
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: web-app
  labels:
    app: web-app
spec:
  selector:
    app: web-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

---

# Seul le pod frontend peut accéder au pod web-app sur le port 80.
# Le service web-app peut accéder uniquement au service backend sur le port 8080.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-webapp-to-backend
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: web-app
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: frontend
      ports:
        - protocol: TCP
          port: 80          
  egress:
    - to:
        - podSelector:
            matchLabels:
              app: backend
      ports:
        - protocol: TCP
          port: 5678
    - to: # Permettre les requêtes DNS
        - namespaceSelector: {}
          podSelector:
            matchLabels:
              k8s-app: kube-dns
      ports:
        - protocol: UDP
          port: 53
  policyTypes:
    - Ingress
    - Egress

 

  • backend.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
  labels:
    app: backend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
        - name: backend
          image: hashicorp/http-echo
          args:
            - "-text=Hello from Backend. Bye !!!"
          ports:
            - containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
  name: backend
  labels:
    app: backend
spec:
  selector:
    app: backend
  ports:
    - protocol: TCP
      port: 5678
      targetPort: 5678
  type: ClusterIP

---

# Seul le service web-app peut accéder au service backend sur le port 8080.
# Le service backend peut accéder uniquement au service database sur le port 5432.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-only-webapp-to-backend
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: web-app
      ports:
        - protocol: TCP
          port: 5678      
  egress:
    - to:
        - podSelector:
            matchLabels:
              app: database
      ports:
        - protocol: TCP
          port: 5432
    - to: # Permettre les requêtes DNS
        - namespaceSelector: {}
          podSelector:
            matchLabels:
              k8s-app: kube-dns
      ports:
        - protocol: UDP
          port: 53
  policyTypes:
    - Ingress
    - Egress

 

  • database.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: database
  labels:
    app: database
spec:
  replicas: 1
  selector:
    matchLabels:
      app: database
  template:
    metadata:
      labels:
        app: database
    spec:
      containers:
        - name: database
          image: postgres:alpine
          env:
            - name: POSTGRES_USER
              value: user
            - name: POSTGRES_PASSWORD
              value: password
            - name: POSTGRES_DB
              value: example
          ports:
            - containerPort: 5432
---
apiVersion: v1
kind: Service
metadata:
  name: database
  labels:
    app: database
spec:
  selector:
    app: database
  ports:
    - protocol: TCP
      port: 5432
      targetPort: 5432
  type: ClusterIP


---

# Le pod database accepte uniquement le trafic provenant de backend.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: restrict-database-access
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: database
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: backend
      ports:
        - protocol: TCP
          port: 5432
  policyTypes:
    - Ingress

 

  • Appliquer les YAML :
kubectl apply -f frontend.yaml
kubectl apply -f web-app.yaml
kubectl apply -f backend.yaml
kubectl apply -f database.yaml

 

 

Tester le trafic :

  • Depuis le service frontend faire un curl vers le service web-app: curl web-app:80

kubectl exec -it svc/frontend -- sh

curl web-app:80 # doit marcher
curl backend:5678 # doit pas marcher car frontend est autorisé uniquement sur le service web-app

 

  • Depuis le service web-app faire un curl vers le service backend: curl backend:5678
kubectl exec -it svc/web-app -- sh

curl backend:5678 # doit marcher
curl frontend:80 # doit pas marcher car web-app est autorisé uniquement sur le service backend

 

Commentaires

Connectez-vous pour rejoindre la discussion.

Aucun commentaire pour le moment.