Introduction
Les tests DAST (Dynamic Application Security Testing) permettent d'identifier les vulnérabilités en analysant une application en cours d'exécution. Contrairement au SAST, le DAST interagit avec l'interface comme un attaquant réel. En 2026, l'automatisation avancée via OWASP ZAP dans les pipelines CI/CD est devenue indispensable pour les équipes DevSecOps. Ce tutoriel vous guide pas à pas dans l'intégration professionnelle de scans dynamiques, la gestion des contextes complexes et l'analyse automatisée des résultats.
Prérequis
- Docker et Docker Compose installés
- Connaissances avancées en CI/CD (GitHub Actions ou GitLab CI)
- OWASP ZAP 2.15+ et Python 3.11+
- Une application web accessible en local ou via URL
Installation et lancement de ZAP
version: '3.8'
services:
zap:
image: owasp/zap2docker-stable
volumes:
- ./zap:/zap/wrk
command: zap.sh -daemon -host 0.0.0.0 -port 8080 -config api.key=secretkey123Ce fichier compose lance ZAP en mode daemon avec une clé API sécurisée. Le volume partagé permet de stocker les rapports et les contextes persistants.
Configuration avancée du contexte
import requests
ZAP_URL = 'http://localhost:8080'
API_KEY = 'secretkey123'
def create_context():
r = requests.get(f'{ZAP_URL}/JSON/context/action/newContext', params={'apikey': API_KEY, 'contextName': 'ProductionApp'})
print(r.json())
create_context()Ce script Python crée un contexte nommé dédié à l'application cible. Cela permet d'isoler les règles, les exclusions et les authentifications pour des scans précis et reproductibles.
Script de scan complet avec authentification
import requests
import time
ZAP_URL = 'http://localhost:8080'
API_KEY = 'secretkey123'
TARGET = 'https://app.example.com'
requests.get(f'{ZAP_URL}/JSON/spider/action/scan', params={'apikey': API_KEY, 'url': TARGET})
time.sleep(30)
requests.get(f'{ZAP_URL}/JSON/ascan/action/scan', params={'apikey': API_KEY, 'url': TARGET, 'contextName': 'ProductionApp'})
print('Scan lancé avec succès')Ce script déclenche successivement un spider puis un scan actif avec le contexte créé. Il inclut une pause pour laisser le spider terminer avant le scan actif.
Intégration dans GitHub Actions
name: DAST Scan
on: [push]
jobs:
dast:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run ZAP Scan
run: |
docker compose up -d
python advanced_scan.py
docker compose downCe workflow déclenche automatiquement un scan DAST à chaque push. Il utilise le docker-compose et le script Python pour exécuter les tests de manière reproductible en CI.
Analyse et export des résultats
import requests
ZAP_URL = 'http://localhost:8080'
API_KEY = 'secretkey123'
r = requests.get(f'{ZAP_URL}/JSON/core/other/jsonreport', params={'apikey': API_KEY})
with open('zap-report.json', 'w') as f:
f.write(r.text)
print('Rapport exporté')Ce script récupère le rapport JSON complet et le sauvegarde. Il peut ensuite être analysé pour bloquer le pipeline en cas de vulnérabilités critiques.
Bonnes pratiques
- Toujours utiliser des contextes et des règles d'exclusion pour éviter les faux positifs
- Intégrer les scans DAST en parallèle des tests fonctionnels
- Versionner les contextes ZAP dans le dépôt Git
- Définir des seuils de sévérité pour bloquer automatiquement les déploiements
- Exécuter des scans nocturnes complets en plus des scans rapides en CI
Erreurs courantes à éviter
- Oublier de configurer l'authentification dans le contexte ZAP
- Lancer des scans sans exclusions sur des environnements de production
- Ignorer les faux positifs et saturer les équipes de tickets
- Ne pas versionner les scripts de configuration et de reporting
Pour aller plus loin
Découvrez nos formations avancées sur la sécurité applicative et l'automatisation DevSecOps sur Learni Group.