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
- Namespace :
Observation : Le service doit être accessible depuis n'importe quel pod du namespace.
Indice
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
- Namespace :
Observation : Le CronJob doit réussir à atteindre le service.
Indice
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
.
- Nom de la NetworkPolicy :
Observation : Le CronJob doit échouer à atteindre le service après l’application de la NetworkPolicy.
Indice
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
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.