Sécuriser son code source : le volet DevSecOps
Introduction
La sécurité est un élément clé du développement logiciel et GitLab facilite l’intégration de scans de sécurité directement dans les pipelines CI/CD. L’ajout de ces tests permet de détecter les vulnérabilités de manière automatisée, sans autre impact qu’une légère augmentation du temps d’exécution du pipeline.
Ce chapitre explore le volet DevSecOps de GitLab dont nous avons déjà parlé dans le chapitre Comprendre le cycle de développement logiciel de cet ouvrage. Il présente les sept principaux types de tests disponibles : l’analyse statique du code (Static Application Security Testing, SAST), la détection de secrets, les tests dynamiques (Dynamic Application Security Testing, DAST), l’analyse des dépendances, la sécurité des conteneurs, la conformité des licences et l’analyse des fichiers de configuration issus de l’IaC.
Nous verrons comment activer et configurer ces analyseurs pour s’adapter aux besoins spécifiques de vos projets. Nous aborderons également trois fonctionnalités essentielles qui simplifient leur utilisation : la lecture des rapports de scan, le suivi des vulnérabilités et l’intégration de scanners tiers.
À l’issue...
Le fonctionnement des analyseurs de sécurité
Lors de la configuration des analyseurs de sécurité, il est important de savoir que la plupart d’entre eux offrent de nombreuses options que nous ne pourrons pas couvrir entièrement dans ce chapitre. Nous allons donc nous concentrer sur leur activation de base, en présentant quelques paramètres essentiels à leur fonctionnement.
La plupart des scanners sont réservés à l’abonnement GitLab Ultimate, mais certains d’entre eux sont accessibles dans les éditions Premium ou « community ». En date de rédaction de cet ouvrage, les scans de type SAST, la détection des secrets, l’analyse des conteneurs et celle de l’IaC sont disponibles pour tous les types de licences, bien que certaines fonctionnalités avancées restent limitées.
L’illustration suivante montre la différence entre les menus Sécurisation des abonnements community et Ultimate. Bien que des onglets existent pour Capacités de sécurité et Événements d’audit dans la version gratuite, si vous les ouvrez, vous verrez que GitLab vous invite à mettre à niveau votre forfait pour les activer…

Dans ce chapitre, nous avons activé notre essai gratuit de GitLab Ultimate de 60 jours pour faire une présentation plus complète des outils de sécurité offerts par la plateforme. Nous tenterons le plus possible de donner des exemples qui s’appuient sur la version gratuite de GitLab.
1. Le mode d’exécution...
L’analyse de type SAST
Le SAST examine le code source d’un projet sans l’exécuter. Cette approche, souvent appelée white box testing, permet d’identifier les vulnérabilités potentielles en analysant le code source, les fichiers de configuration et la logique interne de l’application sans l’exécuter.
1. Fonctionnement de l’analyseur
Contrairement aux tests dynamiques qui évaluent le comportement d’une application en cours d’exécution, le SAST détecte des erreurs pouvant entraîner des failles de sécurité très tôt dans le processus de développement.
Ce type de scanner repère notamment les mauvaises pratiques de programmation, les anti-patterns et les code smells qui sont des constructions potentiellement risquées ou non sécurisées.
Un anti-pattern est une solution courante à un problème de conception qui semble correcte, mais qui entraîne des conséquences négatives à long terme, comme une complexité excessive ou une mauvaise maintenabilité.
Le code smell est un indicateur de problèmes potentiels dans le code source, comme des fonctions trop longues ou un couplage excessif, qui peuvent rendre le code plus difficile à comprendre et à modifier.
Par exemple, en Python, définir un répertoire temporaire via temp_dir = " /tmp" peut sembler anodin, mais il est préférable d’utiliser le module intégré « tempfile » pour garantir la création sécurisée de fichiers temporaires et leur suppression automatique après usage afin de réduire les risques de fuite de données sensibles. Le SAST est conçu pour repérer ce type d’erreurs avant qu’elles ne deviennent des failles exploitables.
GitLab utilise différents analyseurs SAST adaptés aux langages de programmation...
La détection de secrets
La détection de secrets permet d’identifier des informations sensibles qui ne devraient pas être présentes dans un dépôt Git. Ce scanner recherche des éléments tels que des clés API, des jetons d’accès et des identifiants stockés accidentellement dans le code source.
1. Fonctionnement de l’analyseur
Contrairement au SAST qui se concentre sur les failles de sécurité dans la logique du code, la détection de secrets vise à prévenir l’exposition involontaire de données confidentielles.
Ce scanner repose sur des expressions régulières (regex) pour identifier les secrets parmi plus de 50 types connus, tels que :
-
les jetons d’accès personnel GitLab ;
-
les clés SSH privées ;
-
les clés API Google Cloud (GCP) ;
-
les jetons d’authentification Kubernetes (Kubeconfig) ;
-
les identifiants (service principals) AWS ou Azure.
Ces éléments sont souvent utilisés dans des scripts ou des fichiers de configuration et ils ne devraient jamais être stockés en clair dans un dépôt Git.
L’un des avantages de cette approche est qu’elle est indépendante du langage et du type de fichier. Que le secret soit contenu dans un fichier Python, un fichier JSON, un README ou un fichier...
L’analyse de type DAST
Le DAST évalue la sécurité des applications web en testant leurs URL ou points de terminaison (endpoints) API.
1. Fonctionnement de l’analyseur
Le DAST est aussi appelé black box testing, car il teste l’application en cours d’exécution sans connaître son code interne. Il simule des attaques externes pour identifier des failles exploitables, comme les injections SQL ou les failles XSS.
Une injection SQL est une faille de sécurité qui permet à un attaquant d’injecter des requêtes malveillantes dans une base de données via un champ de saisie non sécurisé, ce qui peut entraîner le vol, la modification ou la suppression de données sensibles.
Une faille XSS permet à un acteur malintentionné d’injecter du code JavaScript malveillant dans une page web consultée par d’autres utilisateurs. Ce type d’attaque peut servir à voler des cookies, détourner des sessions ou manipuler l’affichage du site.
Lorsqu’il est configuré pour analyser un site web, le DAST explore chaque page en suivant les liens et les interactions détectés, tout en vérifiant la présence de vulnérabilités. Voici quelques problèmes qu’il peut détecter :
-
la transmission d’informations confidentielles via des paramètres d’URL ;...
L’analyse des dépendances
L’analyse des dépendances examine les bibliothèques et frameworks utilisés dans un projet afin de détecter des vulnérabilités connues. Cet outil est disponible seulement pour l’abonnement GitLab Ultimate.
1. Fonctionnement de l’analyseur
Ce type de scanner analyse les fichiers de configuration des gestionnaires de paquets comme Gemfile.lock pour Ruby, requirements.txt pour Python ou pom.xml pour Java. Il identifie aussi bien les dépendances directes que transitives, ce qui permet de signaler des failles dans des bibliothèques utilisées indirectement par votre projet.
Une dépendance transitive est une bibliothèque dont dépend une autre bibliothèque utilisée dans un projet, mais qui n’est pas directement incluse par le développeur. GitLab analyse ce type de dépendances même si elles ne sont pas référencées directement dans le code.
L’outil d’analyse des dépendances consulte une base de données de vulnérabilités connues pour alerter sur les versions problématiques. Contrairement au SAST, il n’analyse pas le code des dépendances, mais vérifie simplement si des failles ont déjà été signalées pour une version donnée.
Une fonctionnalité intéressante...
L’analyse des conteneurs
L’analyse des conteneurs permet de détecter des vulnérabilités dans les images Docker et les distributions Linux sous-jacentes.
1. Fonctionnement de l’analyseur
Cet outil fonctionne de la même manière que l’analyse des dépendances, mais il se concentre sur les packages système utilisés dans les images Docker.
Chaque image est construite à partir d’une distribution Linux de base (Ubuntu, Debian, Alpine, etc.) qui contient des paquets préinstallés. Ceux-ci sont régulièrement mis à jour pour corriger des failles de sécurité. L’analyse des conteneurs vérifie donc si votre image repose sur une version obsolète ou vulnérable d’un package système.
GitLab propose également une option permettant d’analyser les bibliothèques et les dépendances installées dans une image Docker, y compris celles ajoutées via un gestionnaire de paquets spécifique au langage (par exemple, avec pip install Flask pour installer Flask en Python). Cependant, comme cette fonctionnalité peut générer des doublons avec l’analyse des dépendances, elle est désactivée par défaut.
L’analyse des conteneurs cible toutes les images Docker stockées dans le registre de conteneurs de votre projet...
L’analyse de l’Infrastructure as Code
Comme nous l’avons déjà mentionné précédemment, l’IaC est une approche qui consiste à gérer et provisionner des composants d’infrastructure informatique de manière programmatique plutôt que par des configurations manuelles. Des outils comme Terraform, OpenTofu, Ansible, Azure Resource Manager (ARM) ou AWS CloudFormation permettent d’automatiser le déploiement et la gestion d’environnements.
Cependant, cette flexibilité introduit des risques de sécurité. Une mauvaise configuration peut exposer des données sensibles, ouvrir des accès non sécurisés ou rendre un composant ou un environnement vulnérables. C’est pourquoi GitLab propose un scanner IaC qui analyse les fichiers de configuration pour détecter les mauvaises pratiques et les failles de sécurité avant d’effectuer des déploiements.
1. Fonctionnement de l’analyseur
Le scanner IaC de GitLab agit comme un SAST, mais il est spécifiquement conçu pour analyser les fichiers de configuration d’infrastructure. Il détecte les failles de sécurité connues, notamment :
-
utilisation de protocoles non sécurisés (par exemple : HTTP au lieu de HTTPS pour un endpoint sensible) ;
-
manque de chiffrement des données...
L’analyse de conformité des licences
GitLab permet d’analyser automatiquement les licences logicielles des dépendances d’un projet pour s’assurer de leur compatibilité avec la licence du logiciel développé.
Les bibliothèques (libraries) open source sont publiées sous différentes licences logicielles qui définissent les conditions d’utilisation, de modification et de distribution. Il est donc important de s’assurer que les licences des dépendances de votre projet sont compatibles avec celle sous laquelle vous publiez votre propre logiciel. L’utilisation de bibliothèques sous une licence logicielle incompatible peut poser des problèmes juridiques ou commerciaux qui nécessitent le remplacement de ces dépendances.
Certaines licences sont permissives, comme les licences MIT (Massachusetts Institute of Technology) ou BSD (Berkeley Software Distribution) qui autorisent une utilisation et une redistribution sans restriction majeure. D’autres sont plus limitatives, comme GPL (General Public License) ou AGPL (Affero General Public License), car elles obligent tout projet utilisant les bibliothèques d’un produit qu’elles protègent à adopter la même licence logicielle. D’autres encore imposent des restrictions plus spécifiques comme des limitations pour certains pays.
1. Fonctionnement de l’analyseur
La fonctionnalité Conformité des licences (License Compliance) de GitLab est disponible seulement avec l’abonnement Ultimate. Elle permet d’analyser automatiquement les licences des bibliothèques utilisées...
Les autres types d’analyseurs de sécurité
Jusqu’à présent, nous avons travaillé avec les analyseurs les plus populaires de GitLab, mais il y en a d’autres que nous proposons de présenter brièvement. N’hésitez pas à en faire l’essai s’ils sont pertinents pour vos projets !
1. Test à données aléatoires guidées par couverture de code
Les « tests à données aléatoires guidés par la couverture de code » (Coverage Fuzzing ou Coverage-Guided Fuzz Testing) sont des tests basés sur le fuzzing intelligent. Ils génèrent des données d’entrée aléatoires tout en utilisant la couverture de code comme critère d’optimisation.
Contrairement aux tests fuzzing classiques, cette approche explore plus efficacement les chemins d’exécution du programme afin d’identifier des bugs, des plantages ou des vulnérabilités exploitables. Comme la plupart des analyseurs présentés dans ce chapitre, cette fonctionnalité s’inscrit dans une logique « shift left », car elle permet de tester les applications dès les premières phases du développement.
2. Test de l’API par injection de données aléatoires
Comme son nom l’indique, la fonctionnalité...
L’intégration d’analyseurs de sécurité tiers
Bien que GitLab propose une suite complète de scanners, il peut arriver que vous souhaitiez intégrer vos propres analyseurs de sécurité dans vos pipelines.
Les deux principales conditions pour que vous puissiez exécuter un outil tiers dans un pipeline sont qu’il soit disponible sous forme d’image Docker et qu’il puisse être lancé en ligne de commande.
Exemple simple d’intégration
Un exemple simple d’intégration pourrait ressembler à ceci :
my_sast_scanner:
stage: test
image: my_sast_scanner-image:latest
script:
- sast-scanner-cli --scan ./src --output results.json
artifacts:
reports:
sast: my_sast_scanner/scanner-results.json
Vous pouvez aussi ajouter allow_failure: true pour éviter l’échec du pipeline si des vulnérabilités sont détectées.
Pour que GitLab affiche les résultats d’un analyseur externe dans ses rapports de sécurité, les résultats doivent être formatés en JSON selon un schéma spécifique.
Comme nous le voyons dans l’exemple précédent, pour générer un rapport avec un analyseur...
Les outils de surveillance des vulnérabilités
L’abonnement Ultimate de GitLab fournit certains outils et rapports de sécurité pour regrouper et présenter les résultats des analyseurs dans l’interface utilisateur. Ces derniers permettent d’identifier et de suivre les vulnérabilités détectées à différentes étapes du développement.
Chaque outil propose une perspective unique sur la sécurité du projet de manière à faciliter le suivi des problèmes détectés selon leur contexte d’apparition. À l’exception des onglets des pipelines qui peuvent être consultés sous le menu Compilation, puis Pipeline, les différents outils de surveillance que nous allons présenter font tous partie du menu Sécurisation d’un projet ou d’un groupe.
1. Tableau de bord de sécurité
Le Tableau de bord de sécurité de GitLab fournit une vue globale des vulnérabilités détectées dans un projet (ou plusieurs, si le tableau est consulté à partir d’un groupe) à travers le temps. Il fournit un historique des vulnérabilités présentes sur la branche par défaut en fonction de certains statuts : critique, haute, moyenne, basse, info, inconnue.
2. Rapport de vulnérabilités...
Conclusion
Dans ce chapitre, nous avons exploré les principales fonctionnalités des scanners de sécurité de GitLab en couvrant l’analyse statique du code source (SAST), les tests dynamiques d’applications (DAST) ainsi que la détection des secrets, des dépendances, de l’IaC et des licences.
Chaque analyseur apporte une protection complémentaire en renforçant la sécurité à différents niveaux dans les projets. L’intégration de ces outils dans un pipeline CI/CD a un impact minimal sur les performances et elle offre une meilleure visibilité sur les vulnérabilités.
À travers notre présentation des différents analyseurs, nous avons également abordé les rapports de sécurité et le suivi des vulnérabilités en montrant comment GitLab centralise ces informations.
Grâce à ces fonctionnalités, les équipes de développement peuvent identifier et corriger les failles de sécurité plus efficacement, sans perturber l’avancement de leurs projets. La maîtrise de ces outils permet d’adopter une approche DevSecOps, laquelle s’appuie sur le principe « shift left » qui se concrétise par l’ajout d’étapes de sécurisation dans la partie CI des pipelines. Dans le prochain...