---
title: "SonarQube & SAST — Analyse Statique de Code"
domain: devops
subdomain: cicd
type: snippet
tags: [sonarqube, sast, semgrep, bandit, code-review, devsecops, static-analysis]
difficulty: intermediate
status: stable
updated: "Sat May 30 2026 00:00:00 GMT+0000 (Coordinated Universal Time)"
---
## SAST — Concepts

```
SAST (Static Application Security Testing)
  → Analyse du code SOURCE sans l'exécuter
  → Détecte : injections, crypto faible, secrets, mauvaises configs

DAST (Dynamic Application Security Testing)
  → Teste l'APPLICATION en cours d'exécution
  → Détecte : vulnérabilités runtime, auth, sessions

IAST (Interactive AST)
  → Agent dans l'application pendant les tests
  → Combine SAST + DAST

SCA (Software Composition Analysis)
  → Analyse les dépendances tierces
  → Détecte : CVE dans bibliothèques, licences
```

---

## SonarQube — Déploiement

```yaml
# docker-compose.yml
services:
  sonarqube:
    image: sonarqube:10-community
    ports:
      - "9000:9000"
    environment:
      - SONAR_JDBC_URL=jdbc:postgresql://db:5432/sonar
      - SONAR_JDBC_USERNAME=sonar
      - SONAR_JDBC_PASSWORD=sonar
      - SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true
    volumes:
      - sonar_data:/opt/sonarqube/data
      - sonar_extensions:/opt/sonarqube/extensions
      - sonar_logs:/opt/sonarqube/logs
    depends_on:
      - db

  db:
    image: postgres:15
    environment:
      - POSTGRES_USER=sonar
      - POSTGRES_PASSWORD=sonar
      - POSTGRES_DB=sonar
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  sonar_data:
  sonar_extensions:
  sonar_logs:
  postgres_data:
```

```bash
# Accès : http://localhost:9000
# Login initial : admin / admin → changer immédiatement
```

---

## Configuration projet

```properties
# sonar-project.properties
sonar.projectKey=mon-application
sonar.projectName=Mon Application
sonar.projectVersion=1.0

# Sources
sonar.sources=src
sonar.tests=tests
sonar.exclusions=**/node_modules/**,**/vendor/**,**/*.min.js

# Coverage
sonar.python.coverage.reportPaths=coverage.xml
sonar.javascript.lcov.reportPaths=coverage/lcov.info
sonar.java.coveragePlugin=jacoco

# Encoding
sonar.sourceEncoding=UTF-8

# Qualité de code
sonar.python.version=3.11
```

```bash
# Scanner depuis le projet
sonar-scanner \
  -Dsonar.host.url=http://localhost:9000 \
  -Dsonar.token=sqp_XXXXXXXXXX \
  -Dsonar.projectKey=mon-app

# Via Maven
mvn sonar:sonar -Dsonar.token=sqp_XXXXXXXXXX

# Via npm
npx sonar-scanner
```

---

## Quality Gate — Sécurité

```
# Quality Gate par défaut "Sonar way"
Conditions de blocage :
  □ Security Rating = A (0 vulnérabilités nouvelles)
  □ Reliability Rating = A (0 bugs bloquants)
  □ Maintainability Rating = A
  □ Coverage on New Code > 80%
  □ Duplicated Lines on New Code < 3%

# Quality Gate strict sécurité
Administration > Quality Gates > Create
  + Security Rating = A
  + Security Hotspots Reviewed = 100%
  + Open 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

```bash
# Installation
pip install semgrep

# Scan avec règles OWASP Top 10
semgrep --config=p/owasp-top-ten .

# Règles spécifiques par langage
semgrep --config=p/python .
semgrep --config=p/javascript .
semgrep --config=p/java .
semgrep --config=p/php .

# Règles de sécurité avancées
semgrep --config=p/security-audit .
semgrep --config=p/secrets .

# Output JSON pour CI
semgrep --config=p/owasp-top-ten --json > results.json

# Règle personnalisée
cat > rules/sqli.yaml << 'EOF'
rules:
  - id: raw-sql-query
    patterns:
      - pattern: |
          cursor.execute("..." + $VAR + "...")
    message: "SQL injection risk: use parameterized queries"
    languages: [python]
    severity: ERROR
    metadata:
      cwe: "CWE-89"
      owasp: "A03:2021"
EOF
semgrep --config=rules/sqli.yaml .
```

---

## Bandit — SAST Python

```bash
# Installation
pip install bandit

# Scan basique
bandit -r ./src

# Rapport HTML
bandit -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és
bandit -r ./src -l  # Low+
bandit -r ./src -ll # Medium+
bandit -r ./src -lll # High uniquement

# Ignorer des tests
bandit -r ./src --skip B101,B601  # 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

```bash
# Installation
npm 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"
  }
}

# Scan
npx eslint src/ --ext .js,.ts
```

---

## Code Review Sécurité — Checklist

```
AUTHENTIFICATION & SESSIONS
□ Passwords hashés avec bcrypt/argon2 (pas MD5/SHA1)
□ Tokens générés avec CSPRNG (pas Math.random)
□ Sessions invalidées au logout côté serveur
□ MFA disponible sur les comptes privilégiés

VALIDATION DES ENTRÉES
□ Validation côté serveur pour TOUS les inputs
□ Requêtes SQL paramétrées (pas de concaténation)
□ Échappement HTML pour tout output dans le DOM
□ Whitelist plutôt que blacklist pour la validation

CRYPTOGRAPHIE
□ Algorithmes approuvés : AES-256, RSA-2048+, ECDSA
□ Pas de clés hardcodées dans le code
□ Secrets dans les variables d'environnement ou coffre-fort
□ TLS 1.2+ pour toutes les communications

GESTION DES ERREURS
□ Pas de stacktrace exposée aux utilisateurs
□ Messages d'erreur génériques (pas "User not found" vs "Wrong password")
□ Logging des erreurs sans données sensibles (pas de passwords en log)

DÉPENDANCES
□ Dépendances à jour (npm audit, pip-audit, mvn dependency:check)
□ Pas de dépendances abandonnées ou vulnérables
□ lock files commités (package-lock.json, Pipfile.lock)
```

---

## 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 |
