CI/CD sécurisé avec GitHub Actions : de zéro à la production

March 15, 2025

CI/CD sécurisé avec GitHub Actions : de zéro à la production

Lors de mon stage DevSecOps chez Bifora Data Consulting, j'ai été chargé de mettre en place des pipelines CI/CD sécurisés pour l'application KPITN. Voici ce que j'ai appris.

Pourquoi sécuriser dès le pipeline ?

L'approche "shift left" consiste à détecter les vulnérabilités le plus tôt possible dans le cycle de développement — au moment du commit, pas en production. Cela réduit drastiquement le coût de correction.

Un bug corrigé en développement coûte 10x moins cher qu'en production.

La structure du pipeline

name: CI/CD Sécurisé on: push: branches: [main, develop] pull_request: branches: [main] jobs: sast: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Analyse SAST avec Semgrep uses: semgrep/semgrep-action@v1 with: config: >- p/owasp-top-ten p/docker build-and-push: needs: sast runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build image Docker run: docker build -t ${{ env.IMAGE_NAME }}:${{ github.sha }} . - name: Scan image avec Trivy uses: aquasecurity/trivy-action@master with: image-ref: ${{ env.IMAGE_NAME }}:${{ github.sha }} format: 'sarif' severity: 'CRITICAL,HIGH' exit-code: '1' deploy: needs: build-and-push runs-on: ubuntu-latest environment: production steps: - name: Deploy via SSH uses: appleboy/ssh-action@v1 with: host: ${{ secrets.VPS_HOST }} username: ${{ secrets.VPS_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | docker pull ${{ env.IMAGE_NAME }}:${{ github.sha }} docker compose up -d --no-deps app

Les éléments clés

1. SAST (Static Application Security Testing)

J'ai utilisé Semgrep avec les rulesets OWASP Top 10 et Docker. Il détecte notamment :

  • Les secrets hardcodés dans le code
  • Les injections SQL potentielles
  • Les mauvaises pratiques Docker (USER root, etc.)

2. Scan d'image Docker avec Trivy

Avant tout déploiement, Trivy scanne l'image Docker pour détecter les CVE connues dans les dépendances. Le pipeline échoue si une vulnérabilité CRITICAL ou HIGH est détectée.

3. Environnements GitHub avec approbation manuelle

Pour la production, j'ai configuré un environnement protégé dans GitHub qui requiert une approbation manuelle. Simple mais efficace.

Durcissement du VPS Linux

En parallèle du pipeline, j'ai durci le VPS de déploiement :

  • Désactivation de l'accès root SSH — uniquement clés SSH
  • fail2ban pour bloquer les tentatives de brute force
  • UFW avec règles minimales (80, 443, 22 uniquement depuis IPs connues)
  • ModSecurity comme WAF devant Nginx

Résultats

  • 0 secret leakés depuis la mise en place
  • Délai de détection des vulnérabilités : build-time au lieu de post-déploiement
  • Conformité automatique avec les standards OWASP

Conclusion

La sécurité dans le CI/CD n'est pas une contrainte — c'est un filet de sécurité automatisé qui vous évite les cauchemars en production. Le coût en temps de setup (quelques heures) vaut largement la tranquillité d'esprit.

Article basé sur mon expérience chez Bifora Data Consulting (2026).

GitHub
LinkedIn
X