🧨 Sécuriser un pipeline CI/CD : mission (im)possible ?

« Spoiler : c’est pas gagné. »
– Un DevOps un jour, tous les RSSI depuis.


🧪 CI/CD : pour livrer plus vite… ou exposer plus vite ?

La CI/CD, c’est un peu comme une Formule 1 : ça va très vite, ça impressionne tout le monde, mais si le pilote oublie de freiner, c’est le mur assuré.
Et spoiler : en cybersécurité, le mur, c’est souvent l’exploitation d’un pipeline mal verrouillé.

Alors que les DSI investissent dans des firewalls next-gen et que les SOC traquent le moindre nmaple vrai gruyère est parfois juste là, dans un .yml glissé dans un repo GitHub.

Bienvenue dans l’univers merveilleux des pipelines CI/CD, où :

  • les tokens secrets se baladent en clair,
  • les runners ont les droits d’un ministre,
  • et le stagiaire peut publier en prod… par inadvertance.

📦 Petit rappel pour les nouveaux venus : CI/CD, késako ?

CI (Intégration Continue) : automatiser les tests et la construction du code dès qu’un changement est poussé.

CD (Déploiement Continu) : automatiser la mise en production de ce code validé.

🔧 Outils populaires : GitHub Actions, GitLab CI, Jenkins, CircleCI, TravisCI, etc.


🔓 Où ça pète ? (et souvent violemment)

1. Secrets dans les variables d’environnement

AWS_SECRET_ACCESS_KEY: "oh_non_pas_ca_123"
Un classique : les secrets codés en dur dans les pipelines ou dans les variables d’environnement accessibles par n’importe quel job.
➡️ Résultat : exfiltration facile, surtout via une PR malveillante.

2. Droits trop larges sur les runners

Les runners partagés qui peuvent tout faire (et le font) sont une aubaine pour un attaquant.
➡️ Jenkins exposé sur Internet ? C’est Noël avant l’heure.

3. Mauvaise gestion des dépendances

Utiliser npm install sans vérification, c’est comme laisser ta porte d’entrée ouverte avec un panneau « pas de mot de passe ici ».
➡️ Attaques par supply chain garanties.

Voir notre article : Gestion des identités non humaines

4. Repos publics avec des workflows secrets

“Mais c’est sur GitHub, donc c’est safe, non ?”
Ah, non. L’accès en lecture suffit pour reverse-engineerer les workflows et préparer une attaque ciblée.

Voir notre article : Banana Squad & Co


🧠 Le savais-tu ? (Encadré pédagogique)

Runner : machine (ou conteneur) qui exécute le pipeline (build, test, déploiement).

Secret : variable sensible (token, mot de passe, clé SSH).

Token GitHub Actions : jeton auto-généré par GitHub pour chaque job ; à manipuler comme du nitroglycérine.


☣️ Exemples d’incidents réels (pour bien dormir la nuit)


🧱 Comment sécuriser (sans tout casser)

✅ Utilise un Secrets Manager (Vault, AWS Secrets, Doppler…)

Et pas des secrets .GITHUB_TOKEN qui traînent dans tous les jobs.

✅ Active le principe de least privilege

Ton pipeline n’a pas besoin d’accéder à toute ton infra pour faire un npm build.

✅ Isole tes environnements

Un workflow de test ne devrait jamais pouvoir déployer en prod.

✅ Audite régulièrement ton pipeline

Linte ton YAML, scanne les dépendances (trivynpm auditsnyk).

✅ Vérifie ce que tu merges

Un pull_request_target mal sécurisé peut être exploité pour injecter du code malicieux.

🧰 Outils de sécurité et bonnes pratiques CI/CD

OWASP CI/CD Security Guidelines
👉 Guide complet (en anglais, très clair) :
https://owasp.org/www-project-cicd-security-guideline/

Hardening GitHub Actions (GitHub Docs)
👉 Conseils officiels GitHub pour sécuriser ses workflows :
https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions

Snyk – Analyse des dépendances (gratuite)
👉 Audit des vulnérabilités dans le code et les libs :
https://snyk.io

Trivy (scanner open source de vulnérabilités)
👉 GitHub officiel du projet AquaSec :
https://github.com/aquasecurity/trivy

Secrets detection avec Gitleaks
👉 Super outil pour détecter les secrets dans les repos :
https://github.com/gitleaks/gitleaks

📦 Vault & gestion des secrets

HashiCorp Vault (gestion de secrets)
👉 Page officielle du projet :
https://www.vaultproject.io/

AWS Secrets Manager
👉 Documentation officielle :
https://docs.aws.amazon.com/secretsmanager/


🔐 Exemple : pipeline GitHub Actions (presque) blindé

yaml
name: Build and Deploy

on:
  push:
    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      id-token: write  # Pour OIDC (auth sans secret)
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install dependencies
        run: npm ci

      - name: Run tests
        run: npm test

  deploy:
    needs: build
    runs-on: ubuntu-latest
    environment:
      name: production
      url: https://monapp.exemple.com
    permissions:
      contents: read
      deployments: write
    steps:
      - name: Deploy via OIDC
        uses: some-deploy-action
        with:
          oidc_token: ${{ steps.auth.outputs.id_token }}

✅ Ce qu’on aime ici :

  • Permissions minimales par job
  • Secrets non exposés directement (utilisation d’OIDC)
  • Déploiement conditionné à la réussite des tests

🎯 Jenkins : même combat

Jenkins est une merveille d’automatisation… et une plaie si mal sécurisée.

  • Désactive les builds anonymes
  • Ne stocke pas de secrets dans credentials.xml
  • Évite les plugins non maintenus
  • Isole les agents dans des environnements dédiés
  • Évite de faire tourner Jenkins en tant que root (non, vraiment)

🖼️ pipeline sécurisé vs pipeline kamikaze

pipeline sécurisé vs pipeline kamikaze

🎤 En conclusion

La CI/CD, c’est super.
Mais ce n’est pas parce que c’est automatisé que c’est sécurisé.
Un pipeline mal foutu, c’est comme un autoroute ouverte sans péage : tout le monde passe, et le premier bot venu t’embarque dans le mur.

👉 Si tu veux continuer à déployer tranquillement, commence par sécuriser tes pipelines.
Sinon… tu seras dans le prochain article “Fail du mois” de SecuSlice.

🧨 Sécuriser un pipeline CI/CD : mission (im)possible ?
Partager cet article : Twitter LinkedIn WhatsApp

🖋️ Publié sur SecuSlice.com

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut