Analyses de sécurité dans GitLab CI : SAST, SCA, secrets et images Docker¶
Le DevOps est une culture qui a bouleversé pas mal de chose, notamment sur la sécurité, avec la notion de ShiftLeft.
On souhaite responsabiliser d'avantage le développeur sur cette problématique de produire du code le plus sûr possible. Je te montre ici quelques job qui pourrait t'aider pour améliorer tout cela. Pour aller plus loin, vois aussi Trivy pour l'Infra as Code et l'analyse dynamique avec ZAP en DAST.
Chaque outil couvre une famille d'analyse différente :
| Analyse | Ce qu'elle cherche | Outil |
|---|---|---|
| SAST (Static Application Security Testing) | Des failles dans ton propre code source | Semgrep |
| SCA (Software Composition Analysis) | Des CVE dans tes dépendances | npm audit |
| Container scanning | Des CVE dans ton image Docker | trivy image |
| Détection de secrets | Des tokens et credentials commités | Gitleaks |
| Misconfiguration | Des mauvaises pratiques dans tes Helm Charts et Dockerfiles | trivy config |
Tous ces jobs vivent dans le stage security. Seul le scan d'image attend le build (needs: sur le job qui pousse l'image) : les autres n'ont besoin que du code source et démarrent immédiatement avec needs: [].
Exemple avec NodeJS¶
Analyse du code source (SAST) - Semgrep¶
Semgrep analyse ton code source à la recherche de patterns dangereux : injection, XSS, eval() sur une donnée utilisateur, etc. C'est le seul outil de cette page qui fait du SAST au sens strict.
Exemple de code en CI/CD :
--config p/javascript charge les règles JavaScript du registry Semgrep, et --error fait échouer le job dès qu'une faille est trouvée. Sur un petit serveur Express qui passe req.query.expr à eval(), Semgrep remonte par exemple javascript.lang.security.audit.code-string-concat.code-string-concat (une donnée de requête Express qui atteint eval) et javascript.express.security.audit.xss.direct-response-write (une réponse écrite directement à partir d'une entrée utilisateur).
Audit des packages (SCA) - NPM¶
NodeJS te permet te faciliter ton développement avec des modules NPM. Ce package manager à des fonctions built-in pour te permetre d'analyser la présence d'eventuel CVE en comparant les dépendances de ton modules avec des bases de données autour de la sécurité.
Exemple de code en CI/CD :
Analyse d'image Docker (container scanning) - Trivy¶
Aqua Security propose un super outil open source, Trivy, qui te permet en plus d'analyser tes modules, ton image Docker. Ainsi il va pouvoir analyser les CVE que peut potentiellement contenir ta base-image.
Exemple de code en CI/CD :
Supply chain : épingle tes images de scan
En mars 2026, l'écosystème Trivy a subi une compromission supply chain : des images Docker vérolées ont été publiées sous les tags 0.69.4, 0.69.5, 0.69.6 et latest (cf. l'alerte Docker). N'utilise jamais latest pour un outil de sécurité : épingle une version précise, et en production épingle aussi l'image par digest (aquasec/trivy:<version>@sha256:<digest>), un tag Docker n'étant pas immuable.
Warning
Ce job scanne l'image poussée par le job kaniko du stage Build, d'où le needs: et le tag ${CI_COMMIT_SHA} pour un build de dev. Sans ce needs:, le scan pourrait tourner avant que l'image n'existe.
A toi de définir le bon tag pour target à la fois une image de dev, mais aussi l'image finale une fois que tu mergeras ta branche sur master qui elle aura un tag respectant par exemple le SEMVER
Exemple d'analyse effectuée par Trivy :

Tu n'as nullement besoin d'installer Docker pour pull l'image. Tu dois néanmoins setter les 2 variables d'environnements pour Trivy.
Trivy peut aussi analyser les leaks, secrets et autre credentials sensible que tu pourrais leaks, lorsqu'il analyse une image Dockerfile si celui-ci est présent dans ton code source:

Leaks & Secrets Detections¶
Repository analysis - GitLeaks¶
GitLeaks va te permettre de détecter si par mégarde tu as pu faire fuiter un secret, token, et autres credentials et données sensible dont tu ne devrais pas commiter sur le répo.
Tu peux l'utiliser pour scanner le repository Git dans tout ses commits via la commande gitleaks git, ou scanner ce que tu as indexé en local mais pas encore commité avec gitleaks git --pre-commit --staged. Les anciennes commandes detect et protect sont dépréciées depuis la v8.19.0.
Exemple de code en CI/CD :
Pourquoi un clone complet ?
Par défaut, GitLab fait un clone superficiel (shallow clone) de ton repository : gitleaks git ne verrait alors que les derniers commits et passerait à côté d'un secret commité puis supprimé plus tôt. GIT_DEPTH: "0" récupère tout l'historique.
Exemple d'output lors de la détection d'un potentiel leak :

Helm Chart analysis (misconfiguration) - Trivy¶
Trivy peut aussi t'analyser un helm chart que cela soit pour de la misconfiguration et autres best-practices, ou encore du secrets leaks aussi.
Exemple de code en CI/CD :
Exemple de best-practices pour creer un Helm Chart évitant des problèmes de sécurité :

Dockerfile analysis (misconfiguration) - Trivy¶
Trivy peut aussi analyser un Dockerfile afin d'y detecter toute sorte de leaks, mais aussi te propose des best-practices !
Exemple de code en CI/CD :
Exemple ici de sécurité sur un Dockerfile qui ne défini pas un USER spécifique et donc potentiellement être lancé avec un utilisteur root:

Mais Trivy peut aussi te donner des best-practices comme par exemple de définir un tag bien précis quand tu spécifies une base image. Tu pourrais potentiellement sur un futur build avoir une update d'image majeur et avoir des API non-compatibles qui te casse ton application
