Aller au contenu

Confidentialite

SonarQube et Semgrep manipulent des données classees Confidentiel : résultats de scan qui révèlent des vulnerabilites non corrigees, des failles de sécurité et des defauts architecturaux. Ce chapitre detaille les mesures de protection correspondantes, en référence au cadre de Classification et zones de confiance.


Rappel de classification

Donnée Classification Justification
Résultats de scan (issues) Confidentiel Révèlent des vulnerabilites exploitables
Security hotspots Confidentiel Points d'attention sécurité avant correction
Rapports SAST (Semgrep/SARIF) Confidentiel Contiennent des extraits de code vulnerables
Metriques de dette technique Interne Information de gestion, pas de risque d'exploitation
Quality profiles (regles) Interne Configuration publiquement connue
Configuration SonarQube Confidentiel Révèle l'architecture d'analyse et les exceptions
Tokens d'analyse CI Restreint Permettent de soumettre des résultats au nom d'un projet

Impact d'une fuite

Un attaquant qui accede aux résultats SonarQube obtient la liste complète des vulnerabilites non corrigees de tous les projets, avec le code source concerne. C'est un plan d'attaque cle en main.


RBAC par projet

Modèle de permissions

SonarQube supporte un RBAC granulaire par projet. Le principe : chaque équipe ne voit que les projets dont elle est responsable.

Rôle SonarQube Permissions Attribution
sonar-administrators Administration globale, tous les projets Équipe plateforme uniquement
sonar-users Accès lecture aux projets autorises Tous les développeurs
Project Admin Gérer le projet (profils, quality gate, issues) Tech lead du projet
Issue Admin Gérer les issues (faux positifs, won't fix) Développeur senior
Codeviewer Voir le code source dans SonarQube Membres de l'équipe projet
User Voir le dashboard et les issues Accès de base par projet

Alignement avec Gitea

Les permissions SonarQube doivent etre alignees avec les permissions Gitea :

Groupe Gitea Groupe SonarQube Projets autorises
org/team-backend team-backend Projets backend de l'équipe
org/team-frontend team-frontend Projets frontend de l'équipe
org/team-infra team-infra Projets infrastructure
org/platform-admins sonar-administrators Tous les projets

Configuration des permissions par defaut

# Creer un template de permissions
curl -u admin:TOKEN -X POST \
  "http://localhost:9000/api/permissions/create_template" \
  -d "name=default-project" \
  -d "description=Permissions par defaut pour les nouveaux projets"

# Ajouter le groupe projet avec les permissions de base
curl -u admin:TOKEN -X POST \
  "http://localhost:9000/api/permissions/add_group_to_template" \
  -d "templateName=default-project" \
  -d "groupName=sonar-users" \
  -d "permission=user"

# Definir comme template par defaut
curl -u admin:TOKEN -X POST \
  "http://localhost:9000/api/permissions/set_default_template" \
  -d "templateName=default-project"

Pas d'accès anonyme

Désactiver l'accès anonyme dans la configuration SonarQube. Tout accès — même en lecture — doit etre authentifie.

# Desactiver l'acces anonyme
curl -u admin:TOKEN -X POST \
  "http://localhost:9000/api/settings/set" \
  -d "key=sonar.forceAuthentication" \
  -d "value=true"

Gestion des tokens API

Types de tokens

Type de token Portee Duree de vie Usage
Global Analysis Soumettre des analyses (tous projets) 90 jours max CI/CD pipeline global
Project Analysis Soumettre des analyses (un projet) 90 jours max CI/CD pipeline par projet
User Token Accès API au nom de l'utilisateur 90 jours max Scripts, SonarLint

Politique de tokens

# Definir la duree max des tokens (90 jours)
curl -u admin:TOKEN -X POST \
  "http://localhost:9000/api/settings/set" \
  -d "key=sonar.auth.token.maxAllowedLifetime" \
  -d "value=90"
Regle Justification
Duree de vie max : 90 jours Forcer la rotation régulière
Un token par usage (CI, script, IDE) Traçabilité et revocation granulaire
Stocker dans le gestionnaire de secrets Jamais en clair dans le code ou les configs
Revoquer au départ d'un collaborateur Cycle de vie JML
Auditer les tokens non utilises Nettoyage mensuel

Stockage des tokens CI

# Gitea Actions : stocker le token dans les secrets du depot ou de l'organisation
# Settings > Secrets and variables > Actions > New repository secret
# Nom : SONAR_TOKEN
# Valeur : sqt_xxxxxxxxxxxxxxxxxxxx

# Utilisation dans le workflow
env:
  SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

Ne jamais committer un token

Les tokens SonarQube donnent accès aux résultats d'analyse (classifies Confidentiel). Un token committe dans un dépôt est une fuite de données sensibles. Utiliser un scanner pre-commit (Semgrep p/secrets) pour détecter les tokens avant le push.


Isolation réseau

Segment Chaîne logicielle

SonarQube est déployé dans le segment Chaîne logicielle, accessible uniquement depuis les CI runners et les postes de développement.

graph TD
    subgraph Zone["Zone Chaine logicielle"]
        subgraph Qualite["Segment Qualite (10.30.3.0/24)"]
            SQ["SonarQube"]
            PG["PostgreSQL"]
            Traefik["Traefik<br/>(reverse proxy)"]
        end
        SCM["SCM (Gitea)"]
        CICD["CI/CD (Runners)"]
        Registre["Registre (Harbor)"]
    end

Regles de flux

Source Destination Port Protocole Justification
CI Runners SonarQube 443/TCP HTTPS Soumission des rapports d'analyse
Développeurs (IDE) SonarQube 443/TCP HTTPS SonarLint + Dashboard
SonarQube PostgreSQL 5432/TCP PostgreSQL + TLS Persistance
SonarQube Keycloak 443/TCP SAML/OIDC Authentification SSO
Management SonarQube 9000/TCP HTTPS Health checks, metriques

Bloquer l'accès direct depuis Internet

SonarQube ne doit jamais etre expose directement sur Internet. L'accès se fait via le reverse proxy dans le segment Chaîne logicielle, derriere le VPN ou le bastion pour les accès distants.


Chiffrement du stockage

Volumes chiffres

Volume Contenu Chiffrement
sonarqube_data Index Elasticsearch, cache d'analyse LUKS (at-rest)
pgdata Base PostgreSQL (issues, mesures) LUKS (at-rest)
sonarqube_extensions Plugins installes Optionnel
# Creer un volume chiffre LUKS pour les donnees SonarQube
sudo cryptsetup luksFormat /dev/vdb
sudo cryptsetup open /dev/vdb sonarqube-data
sudo mkfs.xfs /dev/mapper/sonarqube-data
sudo mount /dev/mapper/sonarqube-data /home/sonarqube/data

Connexions chiffrees

# PostgreSQL : forcer TLS
# postgresql.conf
ssl = on
ssl_cert_file = '/certs/server.crt'
ssl_key_file = '/certs/server.key'

# SonarQube : connexion TLS a PostgreSQL
# sonar.properties ou variable d'environnement
SONAR_JDBC_URL=jdbc:postgresql://postgres:5432/sonarqube?ssl=true&sslmode=verify-full

Audit des accès

Événements a journaliser

SonarQube produit des logs d'activité pour le suivi des accès aux données sensibles.

Événement Niveau Justification
Connexion utilisateur Info Traçabilité des accès
Consultation d'un rapport de scan Info Qui a vu les vulnerabilites
Modification d'une issue (faux positif) Warning Decision de ne pas corriger un defaut
Modification du quality gate Warning Changement de politique de qualité
Creation/revocation de token Warning Gestion des accès API
Modification des permissions Warning Changement de droits sur un projet
Export de données (API) Warning Extraction de données sensibles

Configuration des logs

# sonar.properties
# Niveau de log pour le suivi d'audit
sonar.log.level=INFO
sonar.log.level.app=INFO

# Format JSON pour integration SIEM
sonar.log.jsonOutput=true

Integration avec le SIEM

# Alloy / Promtail : collecter les logs SonarQube
- job_name: sonarqube
  static_configs:
    - targets: [localhost]
      labels:
        job: sonarqube
        classification: confidentiel
        __path__: /home/sonarqube/logs/*.log

Alertes sur les accès aux vulnerabilites

Configurer une alerte lorsqu'un utilisateur consulte les issues de sécurité d'un projet auquel il n'est pas attribue. Cela peut indiquer une tentative de reconnaissance.