Pipeline CI/CD¶
Concepts fondamentaux¶
Qu'est-ce que la CI/CD ?¶
La CI/CD (Continuous Integration / Continuous Delivery) est un ensemble de pratiques DevOps qui automatisent le cycle de vie du logiciel, de l'ecriture du code jusqu'a son deploiement en production.
| Concept | Definition | Objectif |
|---|---|---|
| Continuous Integration (CI) | Chaque commit declenche automatiquement la compilation, les tests et l'analyse du code | Detecter les erreurs au plus tot, maintenir un code toujours deployable |
| Continuous Delivery (CD) | Le code valide est automatiquement prepare pour le deploiement, avec approbation manuelle | Reduire le temps entre le developpement et la mise en production |
| Continuous Deployment | Le deploiement en production est entierement automatique apres validation | Eliminer les interventions manuelles, deployer plusieurs fois par jour |
Delivery vs Deployment
La Continuous Delivery necessite une approbation humaine avant le deploiement en production. La Continuous Deployment supprime cette etape : tout code qui passe les tests est automatiquement deploye. Notre infrastructure utilise la Continuous Delivery avec validation manuelle avant production.
Approche Shift-Left¶
Le Shift-Left consiste a integrer la securite le plus tot possible dans le cycle de developpement, plutot qu'en fin de chaine. Chaque defaut detecte tot coute exponentiellement moins cher a corriger.
flowchart LR
subgraph SHIFT["Shift-Left : securite integree a chaque etape"]
direction LR
CODE["Code"] --> SAST["SAST<br/>SonarQube"]
SAST --> SECRETS["Secrets<br/>GitLeaks"]
SECRETS --> BUILD["Build<br/>Docker"]
BUILD --> SCAN["Scan<br/>Trivy"]
SCAN --> DAST["DAST<br/>OWASP ZAP"]
DAST --> DEPLOY["Deploy"]
end
style SAST fill:#E65100,color:#fff
style SECRETS fill:#B71C1C,color:#fff
style SCAN fill:#1565C0,color:#fff
style DAST fill:#7B1FA2,color:#fff
Etapes du pipeline¶
Vue d'ensemble¶
Le pipeline CI/CD implemente 5 etapes de validation avant tout deploiement :
flowchart TB
COMMIT["Commit Git"] --> S1
subgraph S1["1. Qualite du code"]
SQ["SonarQube SAST<br/>Analyse statique"]
end
subgraph S2["2. Detection de secrets"]
GL["GitLeaks<br/>Scan regex"]
end
subgraph S3["3. Securite conteneurs"]
TR["Trivy<br/>Scan CVE images"]
end
subgraph S4["4. Tests dynamiques"]
ZAP["OWASP ZAP<br/>DAST web"]
end
subgraph S5["5. Deploiement"]
DEP["Deploy staging<br/>puis production"]
end
S1 --> S2 --> S3 --> S4 --> S5
style S1 fill:#E65100,color:#fff
style S2 fill:#B71C1C,color:#fff
style S3 fill:#1565C0,color:#fff
style S4 fill:#7B1FA2,color:#fff
style S5 fill:#2E7D32,color:#fff
Pipeline bloquant
Chaque etape est bloquante : si SonarQube detecte une vulnerabilite critique, le pipeline s'arrete immediatement. Le code ne peut pas progresser tant que le probleme n'est pas resolu. C'est le principe fondamental du Shift-Left.
Outils de securite¶
SonarQube -- SAST (Static Application Security Testing)¶
SonarQube analyse le code source sans l'executer pour detecter les problemes de qualite et de securite.
| Capacite | Description |
|---|---|
| Vulnerabilites | Injection SQL, XSS, path traversal, deserialization |
| Code smells | Code duplique, complexite cyclomatique, methodes trop longues |
| Bugs | Null pointer, resource leak, dead code |
| Dette technique | Estimation du temps necessaire pour corriger tous les problemes |
| Quality Gate | Seuil configurable (0 vulnerabilite critique, couverture > 80%) |
Fonctionnement¶
SonarQube construit un AST (Abstract Syntax Tree) du code source et applique des regles de detection. Chaque probleme est classe par severite (Blocker, Critical, Major, Minor, Info) et associe a une categorie CWE (Common Weakness Enumeration).
Quality Gate
Le Quality Gate est un ensemble de conditions que le code doit respecter pour passer a l'etape suivante. Notre configuration exige : zero vulnerabilite critique, zero bug bloquant, et couverture de tests > 60% pour les nouveaux projets.
GitLeaks -- Detection de secrets¶
GitLeaks scanne le code et l'historique Git a la recherche de secrets exposes (cles API, mots de passe, tokens, certificats prives).
| Type de secret | Pattern detecte | Exemple |
|---|---|---|
| Cles API | Regex sur les formats connus (AWS, GCP, Azure) | AKIA... (AWS Access Key) |
| Mots de passe | Variables password, passwd, secret en dur |
password = "admin123" |
| Tokens | Patterns JWT, OAuth, GitLab tokens | glpat-... (GitLab Personal Access Token) |
| Cles privees | Blocs PEM -----BEGIN PRIVATE KEY----- |
Cles SSH, certificats TLS |
Fonctionnement¶
GitLeaks utilise des expressions regulieres configurables pour identifier les motifs de secrets dans le code. Il scanne non seulement les fichiers actuels mais aussi l'historique Git complet, car un secret commite puis supprime reste accessible dans l'historique.
Secrets dans l'historique
Un secret supprime dans un commit ulterieur reste visible dans l'historique Git. Si GitLeaks detecte un secret historique, il faut considerer ce secret comme compromis, le revoquer immediatement et le remplacer via Vault.
Trivy -- Securite des conteneurs¶
Trivy (Aqua Security) scanne les images Docker pour identifier les vulnerabilites connues (CVE) dans les paquets systeme et les dependances applicatives.
| Capacite | Description |
|---|---|
| CVE scanning | Identification des vulnerabilites connues dans les paquets OS |
| Dependances | Analyse des librairies applicatives (npm, pip, gem, go modules) |
| Misconfiguration | Detection des erreurs de configuration Dockerfile |
| SBOM | Generation de la nomenclature logicielle (Software Bill of Materials) |
| Severite | Classification CVSS (Critical, High, Medium, Low) |
Fonctionnement¶
Trivy decompresse chaque couche (layer) de l'image Docker, inventorie tous les paquets installes et les compare avec les bases de vulnerabilites (NVD, Red Hat, Debian, Alpine). Le scan est rapide (quelques secondes) et peut etre integre directement dans le pipeline CI.
OWASP ZAP -- DAST (Dynamic Application Security Testing)¶
OWASP ZAP (Zed Attack Proxy) teste les applications web en cours d'execution en simulant des attaques reelles.
| Type de test | Description |
|---|---|
| Spider | Cartographie automatique de l'application (pages, formulaires, API) |
| Active scan | Injection de payloads malveillants (SQLi, XSS, LFI, SSRF) |
| Passive scan | Analyse des reponses HTTP (headers de securite, cookies, CORS) |
| API scan | Test des endpoints REST/GraphQL via OpenAPI/Swagger |
| Authentication | Tests avec et sans authentification pour verifier les controles d'acces |
Difference SAST vs DAST¶
| Critere | SAST (SonarQube) | DAST (OWASP ZAP) |
|---|---|---|
| Quoi | Analyse le code source | Analyse l'application en execution |
| Quand | Avant la compilation | Apres le deploiement (staging) |
| Acces | Necessite le code source | Necessite l'URL de l'application |
| Forces | Couverture complete du code, detection precise | Detecte les problemes de runtime et de configuration |
| Faiblesses | Faux positifs, ne voit pas les problemes de runtime | Couverture limitee aux chemins atteints |
Strategies de deploiement¶
Blue/Green¶
Le deploiement Blue/Green utilise deux environnements identiques. Le trafic est bascule instantanement de l'ancien (Blue) vers le nouveau (Green) :
flowchart LR
LB["Load Balancer"] -->|100% trafic| BLUE["Blue<br/>(v1 -- actif)"]
LB -.->|0% trafic| GREEN["Green<br/>(v2 -- standby)"]
LB2["Load Balancer"] -.->|0% trafic| BLUE2["Blue<br/>(v1 -- standby)"]
LB2 -->|100% trafic| GREEN2["Green<br/>(v2 -- actif)"]
BLUE -->|"Bascule instantanee"| GREEN2
style BLUE fill:#1565C0,color:#fff
style GREEN fill:#2E7D32,color:#fff
style BLUE2 fill:#1565C0,color:#fff
style GREEN2 fill:#2E7D32,color:#fff
| Avantage | Inconvenient |
|---|---|
| Rollback instantane (rebascule vers Blue) | Necessite le double de ressources |
| Zero downtime | Complexite de synchronisation des donnees |
| Test complet avant bascule | Cout plus eleve |
Canary¶
Le deploiement Canary envoie progressivement un pourcentage croissant du trafic vers la nouvelle version :
| Etape | Trafic v1 | Trafic v2 | Duree | Action |
|---|---|---|---|---|
| 1 | 95% | 5% | 15 min | Monitoring des metriques |
| 2 | 80% | 20% | 30 min | Verification des erreurs |
| 3 | 50% | 50% | 1h | Validation performance |
| 4 | 0% | 100% | - | Bascule complete |
Si une anomalie est detectee a n'importe quelle etape, le trafic est immediatement redirige a 100% vers v1 (rollback automatique).
Rolling update¶
Le Rolling update remplace les instances une par une, en maintenant toujours un nombre minimum d'instances saines. C'est la strategie par defaut de Docker Compose et Kubernetes.
GitLab CI¶
Architecture¶
Le pipeline est defini dans le fichier .gitlab-ci.yml a la racine de chaque projet :
| Concept | Description |
|---|---|
| Stages | Etapes sequentielles du pipeline (build, test, scan, deploy) |
| Jobs | Taches executees dans un stage (peuvent etre paralleles au sein d'un stage) |
| Runners | Machines qui executent les jobs (VMs dediees VLAN 114) |
| Artifacts | Fichiers produits par un job et transmis aux jobs suivants |
| Cache | Fichiers reutilises entre pipelines pour accelerer l'execution |
| Environments | Cibles de deploiement (staging, production) avec historique |
Integration Vault¶
Les pipelines recuperent les secrets et certificats TLS directement depuis HashiCorp Vault via son API, sans stocker de credentials dans les variables GitLab :
sequenceDiagram
participant GL as GitLab Runner
participant VL as Vault (10.15.100.74)
participant NX as Nexus (10.15.100.65)
participant TG as Cible deploiement
GL->>VL: 1. Authentification JWT (token GitLab)
VL->>GL: 2. Token Vault temporaire (TTL 1h)
GL->>VL: 3. Lecture secrets (KV) + certificat TLS (PKI)
VL->>GL: 4. Secrets + certificat (TTL 24h)
GL->>NX: 5. Pull image Docker signee
NX->>GL: 6. Image verifiee
GL->>TG: 7. Deploiement avec secrets injectes
Zero credentials dans GitLab
Aucun mot de passe, cle API ou certificat n'est stocke dans les variables CI/CD de GitLab. Le runner s'authentifie aupres de Vault via un JWT token emis par GitLab, et Vault delivre des secrets temporaires (TTL limite). En cas de compromission du runner, les secrets expirent automatiquement.
Methode d'authentification¶
| Etape | Detail |
|---|---|
| 1. JWT | GitLab emet un JWT signe contenant le projet, la branche et le pipeline ID |
| 2. Vault Auth | Vault verifie le JWT via la methode jwt auth backend |
| 3. Policy | Vault applique une policy Vault qui limite l'acces aux secrets du projet |
| 4. Secrets | Le runner lit les secrets autorises (KV) et demande des certificats (PKI) |
| 5. TTL | Tous les secrets ont une duree de vie limitee (1h pour les tokens, 24h pour les certificats) |
Infrastructure CI/CD¶
| Composant | IP | VLAN | Role |
|---|---|---|---|
| GitLab CE | 10.15.100.71 | 106 (Infra) | Forge logicielle, registre de conteneurs, CI/CD |
| Nexus OSS | 10.15.100.65 | 106 (Infra) | Registre Docker, proxy RPM/npm/PyPI, stockage artifacts |
| GitLab Runners | VLAN 114 | 114 (Dev) | Execution des jobs CI/CD (machines dediees) |
| SonarQube | 10.15.100.72 | 106 (Infra) | Analyse statique du code (SAST) |
| Vault | 10.15.100.74 | 106 (Infra) | Gestion des secrets et certificats pour les pipelines |
Isolation des runners
Les runners GitLab sont deployes dans un VLAN dedie (114) isole des VLANs de production. Ils n'ont acces qu'aux services necessaires (GitLab, Nexus, Vault, SonarQube) via des regles firewall strictes. Cela limite l'impact d'une compromission d'un runner sur le reste de l'infrastructure.
Workflow complet¶
flowchart TB
DEV["Developpeur<br/>git push"] --> GL["GitLab<br/>10.15.100.71"]
GL --> S1["Stage 1: Build"]
S1 --> S1a["Compilation / Build image Docker"]
S1a --> S1b["Push image vers Nexus"]
S1b --> S2["Stage 2: Test"]
S2 --> S2a["Tests unitaires"]
S2a --> S2b["Tests d'integration"]
S2b --> S3["Stage 3: Security Scan"]
S3 --> S3a["SonarQube (SAST)"]
S3 --> S3b["GitLeaks (secrets)"]
S3 --> S3c["Trivy (CVE conteneurs)"]
S3a & S3b & S3c --> S4["Stage 4: Dynamic Test"]
S4 --> S4a["OWASP ZAP (DAST)"]
S4a --> S5["Stage 5: Deploy Staging"]
S5 --> S5a["Deploiement staging"]
S5a --> S5b["Tests de fumee"]
S5b --> S6["Stage 6: Deploy Production"]
S6 --> S6a["Approbation manuelle"]
S6a --> S6b["Deploiement production"]
S6b --> S6c["Verification sante"]
S6c --> MON["Monitoring<br/>Zabbix + Wazuh"]
style S3 fill:#B71C1C,color:#fff
style S6a fill:#FF9800,color:#fff
style MON fill:#2E7D32,color:#fff
Approbation manuelle en production
Le deploiement en production necessite une approbation manuelle dans GitLab (Continuous Delivery, pas Continuous Deployment). Un membre autorise de l'equipe doit valider le deploiement apres verification du staging. Cette etape est tracee et auditable.