Aller au contenu principal

TP 5 : Sécurisation des communications avec Network Policies et CronJob

Objectif :

Ce TP vise à comprendre et expérimenter l'utilisation des Network Policies dans Kubernetes afin de restreindre les communications réseau entre les Pods. Nous utiliserons un CronJob pour tester l'accès réseau à un service.


Phase 1 : Déploiement d'un service cible

  • Action : Déployer un service HTTP simple accessible dans le cluster.

    • Namespace : mynamespace
    • Nom du pod : web-pod
    • Image : nginx:latest
    • Port : 80
  • Observation : Le service doit être accessible depuis n'importe quel pod du namespace.

Indice
Déployer un **Deployment** avec un **Service ClusterIP** exposant le port 80.

Phase 2 : Création d'un CronJob pour tester l'accès au service

  • Action : Déployer un CronJob qui tente d’accéder au service toutes les minutes.

    • Namespace : mynamespace
    • Nom du CronJob : test-cronjob
    • Image : busybox
    • Commande : wget -qO- http://web-service
  • Observation : Le CronJob doit réussir à atteindre le service.

Indice
Utiliser `kubectl logs` pour voir les requêtes du CronJob.

Phase 3 : Application d’une Network Policy restrictive

  • Action : Appliquer une NetworkPolicy interdisant l’accès au service web-service sauf depuis des pods ayant un label spécifique (role=allowed).

    • Nom de la NetworkPolicy : deny-all-except-allowed
    • Namespace : mynamespace
    • Restriction : Bloquer tout accès par défaut, sauf pour les pods ayant role=allowed.
  • Observation : Le CronJob doit échouer à atteindre le service après l’application de la NetworkPolicy.

Indice
Vérifier l'effet de la **NetworkPolicy** avec `kubectl describe networkpolicy deny-all-except-allowed`.

Phase 4 : Autorisation sélective

  • Action : Modifier le CronJob pour lui ajouter le label role=allowed.

  • Observation : Après l’ajout du label, le CronJob doit de nouveau pouvoir accéder au service.

Indice
Modifier le **template** du pod dans le **CronJob** et réappliquer la configuration avec `kubectl apply -f`.

Solution

Afficher

apiVersion: apps/v1
kind: Deployment
metadata:
name: web-pod
namespace: mynamespace
spec:
replicas: 1
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web-service
namespace: mynamespace
spec:
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: batch/v1
kind: CronJob
metadata:
name: test-cronjob
namespace: mynamespace
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
metadata:
labels:
app: tester
spec:
containers:
- name: busybox
image: busybox
command: ["wget", "-qO-", "http://web-service"]
restartPolicy: Never
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-except-allowed
namespace: mynamespace
spec:
podSelector:
matchLabels:
app: web
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: allowed
---
apiVersion: batch/v1
kind: CronJob
metadata:
name: test-cronjob-allowed
namespace: mynamespace
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
metadata:
labels:
role: allowed
spec:
containers:
- name: busybox
image: busybox
command: ["wget", "-qO-", "http://web-service"]
restartPolicy: Never



Phase Avancée : Exploration des différentes règles de NetworkPolicy

  • Tester des règles supplémentaires :
    • Autoriser uniquement l’accès depuis un certain namespace.
    • Restreindre l’accès selon un port spécifique.
    • Bloquer tout trafic entrant ou sortant pour un pod spécifique.