# ✅ P1-004 — VULNERABILITY SCANNING CI **Date**: 2025-12-12 **Objectif**: Ajouter un job CI qui scanne les vulnérabilités (dépendances Go, images Docker) --- ## 📋 RÉSUMÉ ✅ **Workflow GitHub Actions créé** : Scan automatique des vulnérabilités Go et Docker ✅ **Scan Go (govulncheck)** : Bloque les PRs si HIGH/CRITICAL trouvées ✅ **Scan Docker (Trivy)** : Scan des images Docker avec upload dans GitHub Security ✅ **Documentation complète** : Guide d'utilisation locale et CI ✅ **Makefile enrichi** : Nouvelles cibles pour scans locaux --- ## 📁 FICHIERS CRÉÉS/MODIFIÉS ### 1. `.github/workflows/vulnerability-scan.yml` (nouveau) - ✅ Workflow GitHub Actions pour scan automatique - ✅ Job `scan-go-dependencies` : Utilise `govulncheck` - ✅ Job `scan-docker-image` : Utilise Trivy (mode gate) - ✅ Job `scan-docker-image-report-only` : Utilise Trivy (mode report, schedule) - ✅ Bloque les PRs si HIGH/CRITICAL trouvées - ✅ Upload des rapports en artifacts - ✅ Commentaire automatique sur les PRs ### 2. `docs/VULNERABILITY_SCANNING.md` (nouveau) - ✅ Guide complet pour scans locaux - ✅ Instructions d'installation (govulncheck, Trivy) - ✅ Exemples de commandes - ✅ Interprétation des résultats - ✅ Bonnes pratiques ### 3. `Makefile` (modifié) - ✅ Nouvelle cible `vulncheck` : Scan Go uniquement - ✅ Nouvelle cible `docker-scan` : Scan Docker (CRITICAL/HIGH) - ✅ Nouvelle cible `docker-scan-full` : Scan Docker (toutes sévérités) - ✅ Cible `security` existante conservée --- ## 🎯 FONCTIONNALITÉS ### Scan Go (govulncheck) **Déclenchement** : - Sur chaque push/PR vers `main` ou `develop` - Tous les lundis à 2h UTC (schedule) - Manuellement via `workflow_dispatch` **Comportement** : - ✅ Bloque le merge si HIGH/CRITICAL trouvées - ✅ Upload du rapport en artifact - ✅ Commentaire automatique sur les PRs **Exécution locale** : ```bash # Via Makefile make vulncheck # Directement go install golang.org/x/vuln/cmd/govulncheck@latest govulncheck ./... ``` ### Scan Docker (Trivy) **Déclenchement** : - Sur chaque push/PR (mode gate, bloque si HIGH/CRITICAL) - Sur schedule (mode report only, ne bloque pas) **Comportement** : - ✅ Scan de l'image Docker construite - ✅ Upload des résultats dans GitHub Security (SARIF) - ✅ Upload du rapport en artifact - ✅ Bloque le merge si HIGH/CRITICAL trouvées (mode gate) **Exécution locale** : ```bash # Via Makefile make docker-scan # CRITICAL/HIGH uniquement make docker-scan-full # Toutes sévérités # Directement trivy image veza-backend-api:latest ``` --- ## 🔄 WORKFLOW CI ### Structure ```yaml jobs: scan-go-dependencies: - Checkout - Setup Go - Install govulncheck - Run govulncheck - Check for HIGH/CRITICAL - Upload report - Comment PR scan-docker-image: - Checkout - Setup Docker Buildx - Build image - Run Trivy - Upload to GitHub Security - Upload report scan-docker-image-report-only: - (même structure, mais exit-code: 0) ``` ### Permissions Le workflow nécessite : - `contents: read` : Lire le code - `security-events: write` : Uploader dans GitHub Security ### Artifacts Les rapports sont sauvegardés en artifacts : - `govulncheck-report` : Rapport Go (30 jours) - `trivy-report` : Rapport Docker (30 jours) - `trivy-report-scheduled` : Rapport schedule (30 jours) --- ## 📊 EXEMPLES DE SORTIE ### govulncheck ``` Scanning Go dependencies for vulnerabilities... Vulnerability #1: GO-2024-XXXX Package: github.com/example/package Version: v1.2.3 Fixed in: v1.2.5 Severity: HIGH Description: Description of the vulnerability Call stacks: - main.go:42: functionCall() ❌ HIGH or CRITICAL vulnerabilities found! ``` ### Trivy ``` veza-backend-api:scan (alpine 3.18.0) Total: 15 (CRITICAL: 2, HIGH: 5, MEDIUM: 6, LOW: 2) ┌─────────────────────┬────────────────┬──────────┬─────────────────────┐ │ Library │ Vulnerability │ Severity │ Installed Version │ ├─────────────────────┼────────────────┼──────────┼─────────────────────┤ │ openssl │ CVE-2024-XXXX │ CRITICAL │ 3.1.0-r0 │ │ libcrypto │ CVE-2024-YYYY │ HIGH │ 3.1.0-r0 │ └─────────────────────┴────────────────┴──────────┴─────────────────────┘ ``` --- ## 🧪 VALIDATION ### Tests locaux #### Scan Go ```bash # Installation go install golang.org/x/vuln/cmd/govulncheck@latest # Exécution govulncheck ./... # Via Makefile make vulncheck ``` **Résultat attendu** : Scan complet, rapport des vulnérabilités trouvées #### Scan Docker ```bash # Construire l'image make docker-build # Scanner make docker-scan # Ou directement trivy image veza-backend-api:latest ``` **Résultat attendu** : Scan de l'image, rapport des vulnérabilités ### Tests CI Le workflow sera testé lors du prochain push/PR vers `main` ou `develop`. Pour tester manuellement : ```bash # Via GitHub CLI gh workflow run vulnerability-scan.yml # Via l'interface GitHub # Actions > Vulnerability Scan > Run workflow ``` --- ## 📝 COMMANDES LOCALES ### Scan Go ```bash # Installation go install golang.org/x/vuln/cmd/govulncheck@latest # Scan complet govulncheck ./... # Scan avec rapport JSON govulncheck -json ./... > vulncheck-report.json # Via Makefile make vulncheck make security # Inclut aussi gosec ``` ### Scan Docker ```bash # Installation Trivy # macOS brew install trivy # Linux wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add - echo "deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list sudo apt-get update sudo apt-get install trivy # Construire l'image make docker-build # Scanner make docker-scan # CRITICAL/HIGH uniquement make docker-scan-full # Toutes sévérités # Ou directement trivy image veza-backend-api:latest trivy image --severity CRITICAL,HIGH veza-backend-api:latest ``` ### Scan Dockerfile ```bash trivy fs --security-checks vuln . ``` --- ## 🔍 DÉTAILS TECHNIQUES ### govulncheck - **Source** : Base de données Go Vulnerability - **Méthode** : Analyse des dépendances dans `go.mod` et `go.sum` - **Sévérités** : CRITICAL, HIGH, MEDIUM, LOW - **Blocage** : HIGH/CRITICAL bloquent le merge ### Trivy - **Source** : Base de données CVE (Common Vulnerabilities and Exposures) - **Méthode** : Scan de l'image Docker construite - **Sévérités** : CRITICAL, HIGH, MEDIUM, LOW, UNKNOWN - **Blocage** : HIGH/CRITICAL bloquent le merge (mode gate) - **Upload** : Résultats uploadés dans GitHub Security (SARIF) --- ## ⚙️ CONFIGURATION ### Mode "Report Only" Par défaut, le workflow bloque les PRs si HIGH/CRITICAL sont trouvées. Pour activer le mode "report only" (ne bloque pas), modifier le workflow : ```yaml - name: Check for HIGH/CRITICAL vulnerabilities run: | # ... scan ... exit 0 # Ne pas bloquer, juste reporter ``` ### Ignorer des vulnérabilités #### govulncheck Créer un fichier `.govulncheck-ignore` : ``` # Ignorer une vulnérabilité spécifique GO-2024-XXXX ``` #### Trivy Créer un fichier `.trivyignore` : ``` # Ignorer une CVE spécifique CVE-2024-XXXX ``` --- ## ✅ VALIDATION ### Compilation ```bash go build ./... ``` **Résultat** : ✅ **Compilation réussie** ### Tests locaux ```bash # Scan Go make vulncheck # Scan Docker (si image construite) make docker-build make docker-scan ``` **Résultat** : ✅ **Commandes exécutables localement** ### CI Le workflow sera validé lors du prochain push/PR. --- ## 🎯 OBJECTIFS ATTEINTS - ✅ **Scan Go (govulncheck)** : Workflow CI créé, bloque si HIGH/CRITICAL - ✅ **Scan Docker (Trivy)** : Workflow CI créé, upload dans GitHub Security - ✅ **Documentation** : Guide complet dans `docs/VULNERABILITY_SCANNING.md` - ✅ **Commandes locales** : Makefile enrichi, commandes documentées - ✅ **Mode report only** : Disponible pour schedule (ne bloque pas) - ✅ **Mode gate** : Bloque les PRs si HIGH/CRITICAL trouvées --- ## 📋 COMMANDES DE VALIDATION ### Installation des outils ```bash make install-tools ``` ### Scan Go ```bash make vulncheck ``` ### Scan Docker ```bash make docker-build make docker-scan ``` ### Scan complet (sécurité) ```bash make security ``` --- ## 🔗 RESSOURCES - [govulncheck Documentation](https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck) - [Trivy Documentation](https://aquasecurity.github.io/trivy/) - [Go Vulnerability Database](https://pkg.go.dev/vuln/) - [GitHub Security Advisories](https://github.com/advisories) --- **Statut final** : ✅ **P1-004 IMPLÉMENTÉ ET DOCUMENTÉ**