# TD DevSecOps/SRE : Construire, Sécuriser et Monitorer une Application TODO Ce répertoire contient tout le matériel nécessaire pour réaliser un TD de 4 heures sur les principes du Site Reliability Engineering (SRE) et du DevSecOps. Le but est de mettre en place un pipeline CI/CD complet, d’automatiser le déploiement d’une application Web simple, d’intégrer des scans de sécurité et un monitoring continu via Prometheus et Grafana, puis de pratiquer la gestion d’incidents. ## 1. Pré-requis techniques Avant de commencer, assurez-vous de disposer des outils suivants : - un **compte GitHub** pour héberger votre projet et exécuter les workflows GitHub Actions ; - **Docker** et **Docker Compose** installés sur votre machine (Docker Desktop sous Windows/Mac ou Docker Engine sous Linux/WSL) ; - **Git** installé et un terminal fonctionnel ; - un navigateur Web pour consulter Grafana et Prometheus. ## 2. Présentation de l’application de base L’application fournie se trouve dans `app.py`. C’est une API REST minimale écrite avec Flask qui gère une liste de tâches (TODO) en mémoire : - `GET /` : renvoie un simple message de santé ("OK") ; - `GET /tasks` : renvoie toutes les tâches ; - `POST /tasks` : crée une nouvelle tâche (JSON avec `title` obligatoire et `description` optionnelle) ; - `PUT /tasks/<id>` : marque une tâche comme terminée ; - `DELETE /tasks/<id>` : supprime une tâche. Les métriques HTTP sont exposées sur `GET /metrics` grâce à `prometheus_flask_exporter`. Un endpoint supplémentaire `/health` a été ajouté pour les vérifications de santé. Un endpoint `/error` provoque volontairement une erreur (division par zéro) et peut être utilisé pour simuler une panne dans la partie gestion d’incidents. Pour lancer l’application localement (pour le développement) : ```bash python3 -m venv venv source venv/bin/activate pip install -r requirements.txt python app.py ``` L’API sera accessible sur `http://localhost:5000`. ## 3. Construction et exécution avec Docker Un `Dockerfile` est fourni pour empaqueter l’application. Pour construire et exécuter l’image : ```bash # À la racine du projet docker build -t todo-app . docker run --rm -p 5000:5000 todo-app ``` Vous pouvez alors utiliser `curl` pour créer et lister des tâches : ```bash curl -X POST -H "Content-Type: application/json" \ -d '{"title":"Apprendre Flask"}' http://localhost:5000/tasks curl http://localhost:5000/tasks ``` ## 4. Pipeline CI/CD automatisé avec GitHub Actions Le répertoire `.github/workflows/ci.yml` contient un pipeline prêt à l’emploi. Ce workflow se déclenche à chaque `push` ou `pull_request` sur la branche `main` : 1. **Build et push de l’image** : l’image Docker est construite puis envoyée vers Docker Hub. **Important :** créez les secrets `DOCKERHUB_USERNAME` et `DOCKERHUB_TOKEN` dans les paramètres de votre dépôt GitHub. Ces secrets doivent correspondre à votre identifiant Docker Hub et à un token (ou Personal Access Token) capable de push. 2. **Scan de vulnérabilités avec Trivy** : la tâche `Run Trivy` analyse l’image nouvellement créée et génère un rapport SARIF. Ce rapport est automatiquement publié dans l’onglet Security du dépôt. 3. **Conformité Infrastructure as Code avec Checkov** : la dernière étape exécute Checkov sur l’ensemble du dépôt (Dockerfile, docker-compose, fichiers YAML) et génère un deuxième rapport SARIF. Celui-ci est également envoyé à GitHub Security. Vous pouvez adapter le tag de l’image ou ajouter des étapes (tests unitaires, linter…) selon vos besoins. ## 5. Déploiement et monitoring avec Docker Compose Le fichier `docker-compose.yml` permet de lancer simultanément : - `app` : votre API TODO ; - `prometheus` : serveur Prometheus configuré pour collecter les métriques de l’application toutes les 15 secondes ; - `grafana` : instance Grafana pour visualiser les métriques. Démarrez l’ensemble des services en arrière-plan : ```bash sudo docker compose up -d --build ``` Les services seront accessibles aux adresses suivantes : - API TODO : http://localhost:5000 - Prometheus : http://localhost:9090 - Grafana : http://localhost:3000 (identifiant : `admin`, mot de passe : `admin`) Dans Grafana, ajoutez une **data source** Prometheus avec l’URL `http://prometheus:9090`. Créez ensuite un dashboard affichant par exemple : - le nombre de requêtes par seconde : `rate(flask_http_request_duration_seconds_count[1m])` ; - la latence moyenne : `avg(flask_http_request_duration_seconds_sum / flask_http_request_duration_seconds_count)` ; - la répartition des codes HTTP 2xx, 4xx, 5xx. Ces requêtes s’appuient sur les métriques exposées automatiquement par `prometheus_flask_exporter`. ## 6. Simulation et gestion d’incidents 1. Lancez la stack avec `sudo docker compose up -d --build`. Vérifiez dans Grafana que les métriques remontent et que les courbes évoluent lorsque vous envoyez des requêtes à votre API. 2. Simulez une panne en visitant `http://localhost:5000/error` dans votre navigateur ou avec `curl`. Cette route provoque une erreur 500 (division par zéro) et doit entraîner une montée du taux d’erreurs dans Prometheus. 3. Rédigez un **rapport d’incident** en vous basant sur le modèle `incident-report-template.md`. Le rapport doit inclure : - Le contexte (date, heure, service impacté) ; - La détection et le diagnostic (comment l’alerte a été remarquée, quelles métriques ont servi) ; - La cause racine (le bug dans l’application) ; - Les actions correctives et le rétablissement ; - Les leçons apprises et les actions préventives. Pour rédiger un post-mortem, inspirez-vous des bonnes pratiques décrites dans la documentation SRE et l’article d’incident.io : l’objectif est d’apprendre collectivement et de renforcer la résilience du service sans blâmer les individus. ## 7. Livrables attendus Pour valider le TD, vous devez fournir : - un dépôt GitHub public ou privé contenant ce projet complété ; - le workflow GitHub Actions opérationnel (fichier `.github/workflows/ci.yml`) ; - un `docker-compose.yml` fonctionnel incluant votre application, Prometheus et Grafana ; - une capture d’écran ou export JSON de votre dashboard Grafana montrant les métriques de l’application ; - un rapport d’incident/post-mortem (`incident-report.md`). ## 8. Barème indicatif - **Automatisation du déploiement** : 30 % – pipeline GitHub Actions qui construit l’image et la pousse vers Docker Hub. - **Scans de sécurité** : 20 % – utilisation de Trivy et Checkov avec publication des rapports. - **Monitoring et observabilité** : 25 % – instrumentation de l’application, configuration de Prometheus et Grafana, création de dashboards. - **Qualité du rapport d’incident** : 25 % – clarté du post-mortem, analyse des causes et actions de prévention. Bonne chance ! Ce TD est l’occasion de mettre en pratique des notions essentielles de SRE et de DevSecOps tout en manipulant des outils modernes (Docker, GitHub Actions, Prometheus, Grafana, Trivy, Checkov). N’hésitez pas à aller plus loin : ajouter des tests unitaires, intégrer un linter, mettre en place des alertes Prometheus, etc.