🖨️ Version PDF
À la fin de ce cours, vous serez capable de :
Mieux vaut réparer avant que ça casse, plutôt que de patcher après l’attaque !
En DevOps, on parle de DevSecOps :
c’est le DevOps avec la sécurité intégrée à chaque étape
L’objectif est de détecter les vulnérabilités le plus tôt possible dans le cycle de développement. Idéalement avant même que l’application soit déployée.
GitLab intègre nativement des outils de sécurité automatisés :
SAST analyse le code source sans exécuter l’application.
Il s’agit d’une analyse statique, comme un correcteur orthographique pour le code.
Imaginons que vous écriviez une recette de cuisine (votre code) :
Le SAST relit votre recette avant la cuisson pour vous indiquer :
SAST
Il ne goûte pas le plat, mais vérifie la logique et les ingrédients.
GitLab fournit un template prédéfini appelé SAST.gitlab-ci.yml :
SAST.gitlab-ci.yml
include: - template: Security/SAST.gitlab-ci.yml
Ainsi, lors de l’exécution de votre pipeline, GitLab exécute une série de scanners selon le langage utilisé :
Remarque : Il arrive qu’il mette des alertes pour des vulnérabilités théoriques inexploitables étant donné que l’analyse se fait sur du code statique. Il faut revoir et affiner les règles au fil du temps afin de réduire le bruit, de refléter les modifications de la base de code et de tenir compte de l’évolution des schémas d’attaque. SAST a une compréhension limitée du contexte de l’impact.
Injection SQL
API non sécurisée
Secrets dans le code
Absence de validation
Voici les principaux paramètres configurables pour les tests SAST avec GitLab.
Ces paramètres permettent de configurer le comportement général du scan SAST.
SAST_DEFAULT_ANALYZERS
semgrep,flawfinder
SAST_EXCLUDED_PATHS
spec/,test/
SAST_DEFAULT_BRANCH
main
SAST_DISABLED
false
Ces paramètres permettent d’affiner le comportement du scan SAST, notamment pour gérer les performances, les exclusions, ou les analyseurs spécifiques.
SAST_ANALYZER_IMAGE_TAG
4
SAST_BANDIT_LEVEL
high
SAST_BANDIT_CONFIDENCE
medium
SAST_SEMGREP_RULES
.semgrep/rules.yaml
SAST_FLAWFINDER_LEVEL
3
SAST_SOOS_SCAN_MODE
full
SAST_PHP_SECURITY_AUDIT_LEVEL
Ces paramètres permettent de configurer des analyseurs pour des langages ou frameworks spécifiques.
SAST_GOSEC_LEVEL
SAST_ESLINT_LEVEL
error
SAST_RUBOCOP_LEVEL
warning
SAST_SPOTBUGS_LEVEL
SAST_KUBESCAPE_SCAN
true
Ces paramètres permettent de contrôler la charge et les limites du scan SAST.
SAST_MAX_FILE_SIZE
10
SAST_TIMEOUT
3600
SAST_MEMORY_LIMIT
4096
Voici un exemple de configuration YAML pour un scan SAST dans un pipeline GitLab :
include: - template: SAST.gitlab-ci.yml variables: SAST_DEFAULT_ANALYZERS: "semgrep,bandit,flawfinder" SAST_EXCLUDED_PATHS: "spec/,test/,vendor/" SAST_BANDIT_LEVEL: "high" SAST_SEMGREP_RULES: ".semgrep/rules.yaml" SAST_MAX_FILE_SIZE: "10" SAST_TIMEOUT: "3600"
Voici une liste des analyseurs SAST couramment utilisés selon le langage :
stages: - test - sast sast: stage: sast include: - template: Security/SAST.gitlab-ci.yml tags: - docker
Donc ici, GitLab analyse le code et génère un rapport de sécurité qui est disponible dans l’onglet Security --> Vulnerabilities du projet.
Security --> Vulnerabilities du projet
DAST teste l’application en fonctionnement (comme un pirate bienveillant).
Il s’agit d’une analyse dynamique, réalisée après le déploiement. GitLab lance un scanner web automatisé qui explore le site et cherche des failles connues (voir le cours sur OWASP ZAP).
Avant le travail du DAST, le SAST a vérifié les plans de la maison (équivalent du code dans notre exemple métaphorique)
Le DAST, c’est le testeur de porte de votre appartement ou de votre maison :
Par chance, GitLab propose un template dédié !
include: - template: Security/DAST.gitlab-ci.yml dast: variables: DAST_WEBSITE: "https://waoufwaouf.fr"
En réalité, GitLab déploie un scanner basé sur OWASP ZAP (Zed Attack Proxy) qui va tester les formulaires, les cookies, les liens et les redirections.
Injection SQL ou XSS
Session non sécurisée
Mauvaises redirections
En-têtes HTTP manquant
Voici les principaux paramètres configurables pour les tests DAST avec GitLab DAST.
Ces paramètres permettent de configurer le comportement général du scan DAST.
DAST_WEBSITE
http://localhost:8080
DAST_FULL_SCAN_ENABLED
DAST_API_SPECIFICATION
openapi.json
DAST_AUTH_URL
http://localhost:8080/login
DAST_USERNAME
admin
DAST_PASSWORD
s3cr3t
DAST_AUTH_EXCLUDE_URLS
http://localhost:8080/logout
Ces paramètres permettent d’affiner le comportement du scan, notamment pour gérer les performances, les exclusions, ou les tests spécifiques.
DAST_BROWSER_SCAN
DAST_ZAP_CLI_OPTIONS
-a -j
DAST_TARGET_AUDIENCE
internal
DAST_EXCLUDED_URLS
http://localhost:8080/admin
DAST_SCAN_PROFILE
Quick Scan
DAST_ZAP_USE_AJAX_SPIDER
DAST_ZAP_AUTH_HEADER
Authorization: Bearer token
Ces paramètres permettent de configurer des tests spécifiques, comme les injections SQL, les XSS, etc.
DAST_SQL_INJECTION
DAST_XSS
DAST_CSRF
DAST_SECURITY_HEADERS
Ces paramètres permettent de contrôler la charge et les limites du scan.
DAST_ZAP_MAX_SCAN_DURATION
60
DAST_ZAP_THREADS_PER_HOST
5
DAST_ZAP_SPIDER_MAX_DEPTH
Voici un exemple de configuration YAML pour un scan DAST dans un pipeline GitLab :
include: - template: DAST.gitlab-ci.yml variables: DAST_WEBSITE: "http://localhost:8080" DAST_FULL_SCAN_ENABLED: "true" DAST_API_SPECIFICATION: "openapi.json" DAST_AUTH_URL: "http://localhost:8080/login" DAST_USERNAME: "admin" DAST_PASSWORD: "s3cr3t" DAST_BROWSER_SCAN: "true" DAST_ZAP_CLI_OPTIONS: "-a -j" DAST_EXCLUDED_URLS: "http://localhost:8080/admin" DAST_SQL_INJECTION: "true" DAST_XSS: "true" DAST_ZAP_MAX_SCAN_DURATION: "60"
stages: - build - test - dast include: - template: Security/DAST.gitlab-ci.yml variables: DAST_WEBSITE: "http://localhost:8080" DAST_FULL_SCAN_ENABLED: "true"
Donc, le scanner OWASP ZAP s’exécute et un rapport DAST s’affiche dans l’onglet Security > Vulnerabilities, comme pour le SAST.
Security > Vulnerabilities
Objectif : Configurer un pipeline CI/CD qui analyse la sécurité d’une petite application web basique.
const express = require('express'); const app = express(); app.get('/', (req, res) => res.send('Bonjour depuis GitLab Security !')); app.listen(8080, () => console.log('Serveur démarré sur le port 8080'));
.gitlab-ci.yml
stages: - test - sast - dast # SAST : analyse du code source include: - template: Security/SAST.gitlab-ci.yml # DAST : test de sécurité de l'application déployée dast: stage: dast image: docker:stable variables: DAST_WEBSITE: "http://localhost:8080" DAST_FULL_SCAN_ENABLED: "true" script: - echo "Analyse dynamique en cours..." tags: - docker
Normalement, GitLab exécute automatiquement les 2 jobs :
On peut dire de SAST protège le code source et que DAST protège les internautes ou utilisateur.trices.
Tableau récapitulatif
Si vous voulez aller plus loin en ce qui concerne la sécurité, vous pouvez ajouter d’autres outils comme ceux-ci :
Vous avez compris que GitLab ne se limite par à l’automatisation du code, c’est un écosystème de sécurité proactive.
Auteur : Philippe Bouget