Skip to content

abdallah-76/devops-ci-python-app

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🔐 devops-ci-python-app

CI/CD Pipeline Python Docker Trivy License

Pipeline CI/CD complet autour d'un scanner de sécurité web en Python.
Tests automatisés → Build Docker → Scan CVE Trivy → Déploiement AWS EC2.


📌 Présentation

Ce projet met en œuvre un pipeline DevSecOps complet :

  1. Une application Python qui analyse les en-têtes HTTP de sécurité d'un site web
  2. Des tests unitaires avec pytest et couverture de code
  3. Une image Docker optimisée et sécurisée
  4. Un pipeline GitHub Actions (CI/CD) avec 4 jobs séquentiels
  5. Un scan de vulnérabilités CVE de l'image Docker avec Trivy
  6. Un déploiement automatique sur AWS EC2 via SSH

🧱 Architecture du projet

devops-ci-python-app/
│
├── app/
│   ├── __init__.py
│   └── scanner.py          # Application principale
│
├── tests/
│   ├── __init__.py
│   └── test_scanner.py     # Tests unitaires pytest
│
├── .github/
│   └── workflows/
│       └── ci.yml          # Pipeline CI/CD GitHub Actions
│
├── Dockerfile              # Conteneurisation de l'app
├── requirements.txt        # Dépendances Python
├── .gitignore
└── README.md

🔍 L'application — Scanner d'en-têtes HTTP

Qu'est-ce que les en-têtes de sécurité HTTP ?

Quand un navigateur visite un site web, le serveur renvoie des en-têtes HTTP dans sa réponse. Certains de ces en-têtes sont des directives de sécurité recommandées par l'OWASP pour protéger les utilisateurs contre différentes attaques.

En-têtes analysés

En-tête Protection contre
Strict-Transport-Security Force HTTPS, empêche les attaques MITM
X-Content-Type-Options Empêche le MIME sniffing
X-Frame-Options Protège contre le clickjacking
Content-Security-Policy Empêche les injections XSS et données
X-XSS-Protection Protection XSS (navigateurs anciens)
Referrer-Policy Contrôle les données de navigation partagées

Utilisation

# Installer les dépendances
pip install -r requirements.txt

# Scanner un site
python -m app.scanner https://example.com

# Exemple de sortie :
# 🔍 Analyse de : https://example.com
# 📡 Status HTTP : 200
# ✅ Score : 3 / 6 en-têtes présents
#
# ✅ En-têtes présents :
#    ✔ Strict-Transport-Security
#    ✔ X-Content-Type-Options
#    ✔ X-Frame-Options
#
# ⚠️  En-têtes manquants :
#    ✘ Content-Security-Policy
#    ✘ X-XSS-Protection
#    ✘ Referrer-Policy

🧪 Tests unitaires

Les tests sont écrits avec pytest et utilisent unittest.mock pour simuler les requêtes HTTP sans connexion internet — ce qui est essentiel pour un pipeline CI/CD stable et rapide.

Lancer les tests

# Tests simples
pytest tests/ -v

# Tests avec couverture de code
pytest tests/ -v --cov=app --cov-report=term-missing

Ce qui est testé

Test Description
test_all_headers_present Score maximum si tous les en-têtes sont présents
test_no_headers_present Score 0 si aucun en-tête
test_partial_headers Score partiel avec 2 en-têtes
test_http_error Gestion propre d'une erreur réseau
test_status_code_returned Vérification du code HTTP retourné

🐳 Docker

Pourquoi Docker ?

Docker permet d'empaqueter l'application avec toutes ses dépendances dans une image portable. Elle s'exécute de façon identique sur n'importe quelle machine ou serveur.

Build et Run manuel

# Construire l'image
docker build -t devops-ci-python-app:latest .

# Lancer le scanner dans un conteneur
docker run devops-ci-python-app:latest

# Scanner une URL spécifique
docker run devops-ci-python-app:latest python -m app.scanner https://monsite.com

Bonnes pratiques appliquées dans le Dockerfile

  • ✅ Image de base python:3.11-slim (légère, moins de surface d'attaque)
  • ✅ Copie de requirements.txt en premier (optimisation du cache Docker)
  • --no-cache-dir pour réduire la taille de l'image
  • ✅ Pas de secrets dans l'image

⚙️ Pipeline CI/CD — GitHub Actions

Vue d'ensemble

Push sur main
     │
     ▼
┌─────────┐    ┌─────────┐    ┌──────────┐    ┌─────────┐
│  TEST   │───▶│  BUILD  │───▶│   SCAN   │───▶│ DEPLOY  │
│ pytest  │    │ Docker  │    │  Trivy   │    │  EC2    │
└─────────┘    └─────────┘    └──────────┘    └─────────┘

Les jobs sont séquentiels grâce au mot-clé needs. Si un job échoue, les suivants ne s'exécutent pas.

Détail des jobs

Job 1 — 🧪 Test

  • Lance pytest avec couverture de code
  • Si un test échoue → le pipeline s'arrête

Job 2 — 🐳 Build

  • Construit l'image Docker
  • Sauvegarde l'image comme artefact pour le job suivant

Job 3 — 🔒 Scan Trivy

  • Installe Trivy (scanner de CVE open-source d'Aqua Security)
  • Scanne l'image Docker pour détecter les vulnérabilités HIGH et CRITICAL
  • Affiche un rapport dans les logs

Job 4 — 🚀 Deploy (seulement sur main)

  • Se connecte à l'instance AWS EC2 via SSH
  • Met à jour le code (git pull)
  • Rebuild et relance le conteneur Docker

Secrets GitHub nécessaires

Pour que le déploiement fonctionne, configurer ces secrets dans Settings → Secrets and variables → Actions :

Secret Description
EC2_HOST Adresse IP publique de l'instance EC2
EC2_USER Utilisateur SSH (ex: ubuntu)
EC2_SSH_KEY Contenu complet de la clé privée .pem

🔒 Scan de vulnérabilités — Trivy

Qu'est-ce que Trivy ?

Trivy est un scanner de sécurité open-source développé par Aqua Security. Il analyse les images Docker pour détecter des CVE (Common Vulnerabilities and Exposures) — c'est-à-dire des failles de sécurité connues dans les bibliothèques utilisées.

Exemple de sortie Trivy

2024-01-15T10:23:45.123Z INFO  Vulnerability scanning is enabled
┌──────────────┬────────────────┬──────────┬───────────────────┬──────────────────┐
│   Library    │ Vulnerability  │ Severity │ Installed Version │  Fixed Version   │
├──────────────┼────────────────┼──────────┼───────────────────┼──────────────────┤
│ urllib3      │ CVE-2023-45803 │ MEDIUM   │ 1.26.7            │ 1.26.18, 2.0.7   │
└──────────────┴────────────────┴──────────┴───────────────────┴──────────────────┘

Pourquoi c'est important en entreprise ?

Dans un contexte professionnel (banque, assurance, etc.), les équipes de sécurité exigent que les images déployées ne contiennent pas de vulnérabilités critiques. Intégrer Trivy dans le pipeline permet de bloquer automatiquement le déploiement si une faille CRITICAL est détectée.


☁️ Déploiement AWS EC2

Infrastructure

  • Instance : EC2 t2.micro (Free Tier)
  • OS : Ubuntu 22.04 LTS
  • Prérequis sur l'EC2 : Docker installé, Git installé, repo cloné

Configuration initiale de l'EC2

# Sur l'instance EC2 (connexion SSH initiale)
sudo apt update && sudo apt install -y docker.io git
sudo usermod -aG docker ubuntu

# Cloner le projet
git clone https://github.com/abdallah-76/devops-ci-python-app.git
cd devops-ci-python-app

🛠️ Stack technique

Outil Rôle
Python 3.11 Langage de l'application
pytest Framework de tests unitaires
Docker Conteneurisation
GitHub Actions Automatisation CI/CD
Trivy Scan de vulnérabilités CVE
AWS EC2 Hébergement cloud
SSH Déploiement sécurisé

📚 Ce que j'ai appris

Ce projet m'a permis de comprendre et mettre en pratique :

  • La conteneurisation avec Docker et les bonnes pratiques de Dockerfile
  • L'écriture de tests unitaires avec mocking pour isoler les dépendances
  • La création d'un pipeline CI/CD complet avec des jobs séquentiels
  • Le concept de DevSecOps : intégrer la sécurité dans le pipeline de développement
  • La gestion des secrets dans GitHub Actions (jamais de credentials en clair)
  • Le scan de vulnérabilités CVE avec Trivy sur une image Docker
  • Le déploiement automatisé sur un serveur cloud via SSH

👤 Auteur

Abdallah Maammar
Étudiant en L3 Informatique — Admis en Master Réseaux, Systèmes & Cybersécurité (Sorbonne)
🔗 github.com/abdallah-76
🔗 LinkedIn


📄 Licence

MIT — libre d'utilisation et de modification.

About

Pipeline DevSecOps - Scanner HTTP + CI/CD + Trivy

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors