SonarQube & SAST — Analyse Statique de Code
Déploiement SonarQube, configuration des Quality Gates, outils SAST complémentaires (Semgrep, Bandit, Checkmarx) et code review sécurité
SAST — Concepts
SAST Static Application Security TestingAnalyse du code SOURCE sans lexcuterDtecte injections crypto faible secrets mauvaises configsDAST Dynamic Application Security TestingTeste l'APPLICATION en cours d'excutionDtecte vulnrabilits runtime auth sessionsIAST Interactive ASTAgent dans lapplication pendant les testsCombine SAST DASTSCA Software Composition AnalysisAnalyse les dpendances tiercesDtecte CVE dans bibliothques licences
SonarQube — Déploiement
# docker-compose.ymlservices:sonarqube:image: sonarqube:10-communityports:- "9000:9000"environment:- SONAR_JDBC_URL=jdbc:postgresql://db:5432/sonar- SONAR_JDBC_USERNAME=sonar- SONAR_JDBC_PASSWORD=sonar- SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=truevolumes:- sonar_data:/opt/sonarqube/data- sonar_extensions:/opt/sonarqube/extensions- sonar_logs:/opt/sonarqube/logsdepends_on:- dbdb:image: postgres:15environment:- POSTGRES_USER=sonar- POSTGRES_PASSWORD=sonar- POSTGRES_DB=sonarvolumes:- postgres_data:/var/lib/postgresql/datavolumes:sonar_data:sonar_extensions:sonar_logs:postgres_data:
# Accès : http://localhost:9000# Login initial : admin / admin → changer immédiatement
Configuration projet
# sonar-project.propertiessonar.projectKey=mon-applicationsonar.projectName=Mon Applicationsonar.projectVersion=1.0# Sourcessonar.sources=srcsonar.tests=testssonar.exclusions=**/node_modules/**,**/vendor/**,**/*.min.js# Coveragesonar.python.coverage.reportPaths=coverage.xmlsonar.javascript.lcov.reportPaths=coverage/lcov.infosonar.java.coveragePlugin=jacoco# Encodingsonar.sourceEncoding=UTF-8# Qualité de codesonar.python.version=3.11
# Scanner depuis le projetsonar-scanner-Dsonar.host.url=http://localhost:9000-Dsonar.token=sqp_XXXXXXXXXX-Dsonar.projectKey=mon-app# Via Mavenmvn sonarsonar -Dsonar.token=sqp_XXXXXXXXXX# Via npmnpx sonar-scanner
Quality Gate — Sécurité
# Quality Gate par défaut "Sonar way"Conditions de blocageSecurity Rating A 0 vulnrabilits nouvellesReliability Rating A 0 bugs bloquantsMaintainability Rating ACoverage on New Code > 80Duplicated Lines on New Code < 3# Quality Gate strict sécuritéAdministration > Quality Gates > CreateSecurity Rating ASecurity Hotspots Reviewed 100Open Issues Security 0 Blocker/Critical
Types de problèmes SonarQube
| Type | Description | Exemple | |------|-------------|---------| | Bug | Erreur logique | NullPointerException | | Vulnerability | Faille exploitable | SQLi, XSS | | Security Hotspot | À revoir manuellement | Crypto usage | | Code Smell | Dette technique | Méthode trop longue |
Semgrep — SAST Open Source
# Installationpip install semgrep# Scan avec règles OWASP Top 10semgrep --config=p/owasp-top-ten# Règles spécifiques par langagesemgrep --config=p/pythonsemgrep --config=p/javascriptsemgrep --config=p/javasemgrep --config=p/php# Règles de sécurité avancéessemgrep --config=p/security-auditsemgrep --config=p/secrets# Output JSON pour CIsemgrep --config=p/owasp-top-ten --json > resultsjson# Règle personnaliséecat > rules/sqli.yaml << 'EOF'rulesid raw-sql-querypatternspattern |cursorexecute"..." $VAR "..."message "SQL injection risk: use parameterized queries"languages pythonseverity ERRORmetadatacwe "CWE-89"owasp "A03:2021"EOFsemgrep --config=rules/sqli.yaml
Bandit — SAST Python
# Installationpip install bandit# Scan basiquebandit -r /src# Rapport HTMLbandit -r /src -f html -o bandit-report.html# Rapport JSON (CI/CD)bandit -r /src -f json -o bandit-report.json# Niveaux de sévérité filtrésbandit -r /src -l # Low+bandit -r /src -ll # Medium+bandit -r /src -lll # High uniquement# Ignorer des testsbandit -r /src --skip B101B601 # B101=assert, B601=shell injection# Exemples de findings courants# B301: pickle use → unsafe deserialization# B303: MD5/SHA1 use → weak crypto# B501: TLS not verified → SSL bypass# B601: subprocess with shell=True → command injection# B703: jinja2 autoescaping disabled → XSS
ESLint Security — JavaScript/TypeScript
# Installationnpm install --save-dev eslint eslint-plugin-security# .eslintrc.json"plugins" "security""extends" "plugin:security/recommended""rules""security/detect-sql-injection" "error""security/detect-non-literal-regexp" "warn""security/detect-eval-with-expression" "error""security/detect-child-process" "warn""security/detect-unsafe-regex" "error"# Scannpx eslint src --ext jsts
Code Review Sécurité — Checklist
AUTHENTIFICATION & SESSIONSPasswords hashs avec bcrypt/argon2 pas MD5/SHA1Tokens gnrs avec CSPRNG pas MathrandomSessions invalides au logout ct serveurMFA disponible sur les comptes privilgisVALIDATION DES ENTRESValidation ct serveur pour TOUS les inputsRequtes SQL paramtres pas de concatnationchappement HTML pour tout output dans le DOMWhitelist plutt que blacklist pour la validationCRYPTOGRAPHIEAlgorithmes approuvs AES-256, RSA-2048+, ECDSAPas de cls hardcodes dans le codeSecrets dans les variables denvironnement ou coffre-fortTLS 12 pour toutes les communicationsGESTION DES ERREURSPas de stacktrace expose aux utilisateursMessages derreur gnriques pas "User not found" vs "Wrong password"Logging des erreurs sans donnes sensibles pas de passwords en logDPENDANCESDpendances jour npm audit pip-audit, mvn dependencycheckPas de dpendances abandonnes ou vulnrableslock files commits package-lock.json, Pipfilelock
Comparaison outils SAST
| Outil | Langages | Prix | Force | |-------|----------|------|-------| | SonarQube | 30+ | Free/Pro | Intégration CI, dashboard | | Semgrep | 30+ | Free/Pro | Règles custom YAML | | Bandit | Python | Gratuit | Simple, rapide | | Checkmarx | 30+ | Commercial | Précision, compliance | | Fortify | 25+ | Commercial | Enterprise, certifié | | CodeQL | 10+ | GitHub | Analyse flux de données | | ESLint-security | JS/TS | Gratuit | Intégré IDE |