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.