15/11/2024

CybersécuritéLinux

Auditez et sécurisez votre code avec SonarQube sur Debian 12 ou AlmaLinux 9

I. Présentation

Dans ce tutoriel, nous allons apprendre à installer et à configurer SonarQube, une plateforme open source pour l'analyse et la mesure continue de la qualité du code source.

SonarQube permet de détecter les bugs, les vulnérabilités et les mauvaises pratiques dans le code. Il est compatible avec plusieurs distributions, dont Debian 12 et AlmaLinux 9.4.

Nous allons couvrir les étapes nécessaires pour mettre en place SonarQube, incluant la mise à jour du système, l'installation de Java, PostgreSQL, et SonarQube, ainsi que la configuration de SonarScanner pour analyser vos projets.

SonarQube s'intègre parfaitement dans les pipelines CI/CD, en particulier avec GitLab CI ou Jenkins, pour automatiser l'analyse de la qualité du code. Cela permet d'identifier les problèmes de code dès les premières étapes du développement, améliorant ainsi la qualité du code et réduisant les risques de bugs en production.

SonarQube prend en charge de nombreux langages de programmation, y compris Java, JavaScript, TypeScript, C#, Python, PHP, Kotlin, Go, Ruby,et bien d'autres. Cette compatibilité étendue fait de lui un outil polyvalent pour toute équipe de développement.

II. Préparer le serveur pour SonarQube

A. Les prérequis

Pour suivre cette procédure, vous devez avoir accès au serveur, que ce soit en local ou par l'intermédiaire d'une connexion à distance (en SSH, par exemple). Vous devez disposer des droits "root" sur le serveur. Vous devez également avoir un projet à analyser afin de pouvoir faire une première en main de l'outil.

Dans ce tutoriel, nous allons également utiliser WinSCP pour faciliter le transfert des fichiers entre votre machine hôte et votre VM.

B. Mise à jour du système

Ouvrez un terminal sur votre VM et mettez à jour les paquets existants :

# Debian
sudo apt -y update && sudo apt upgrade && sudo apt full-upgrade && sudo apt autoclean && sudo apt clean

# AlmaLinux
sudo dnf update -y && sudo dnf upgrade -y && sudo dnf autoremove -y && sudo dnf clean all

C. Préparer WinSCP

Pour partager les fichiers de code entre votre VM et votre machine hôte, vous pouvez utiliser WinSCP, choisissez "SFTP" comme protocole et remplissez avec vos informations la fenêtre de login, puis appuyez sur "Connexion".

Le protocole SFTP (Secure File Transfer Protocol) utilise SSH (Secure Shell) pour transférer des fichiers en toute sécurité. SFTP offre une authentification sécurisée et un chiffrement des données, garantissant que vos fichiers ne peuvent pas être interceptés pendant le transfert.

Explications :

  • Nom d'hôte : l'adresse IP de votre serveur
  • Numéro de port : port SSH (22)
  • Nom d'utilisateur : votre nom d'utilisateur sur votre serveur
  • Mot de passe : le mot de passe de votre utilisateur sur le serveur

À ce moment-là, une fenêtre d'avertissement s'ouvrira, cliquer simplement sur "Accepter".

Vous êtes maintenant connecté avec votre VM, vous pouvez effectuer des copier-coller de votre machine hôte vers votre VM et inversement.

D. Installer Java JDK 17

Installez Java 17, SonarQube requiert spécifiquement cette version :

# Debian
sudo apt install openjdk-17-jdk -y

# AlmaLinux
sudo dnf install java-17-openjdk-devel -y

Vérifiez l'installation de Java en affichant la version installée :

java -version

E. Installer et configurer PostgreSQL

Installez PostgreSQL et les utilitaires supplémentaires :

# Debian
sudo apt install postgresql postgresql-contrib -y

# AlmaLinux
sudo dnf install postgresql postgresql-server postgresql-contrib -y

Commencez par passer à l'utilisateur PostgreSQL :

# Debian
sudo -i -u postgres

# AlmaLinux
sudo postgresql-setup --initdb
sudo systemctl start postgresql
sudo systemctl enable postgresql
sudo -i -u postgres

Explication de la commande "sudo -i -u postgres" :

  • sudo : Commande super-administrateur
  • -i : ouvre une session de shell comme si l'utilisateur se connectait directement
  • -u postgres : spécifie que la commande doit être exécutée en tant qu'utilisateur postgres

Ensuite, ouvrez l'invite de commande PostgreSQL :

# Debian
psql

# AlmaLinux
psql
ALTER USER postgres PASSWORD 'nouveau_mot_de_passe';

Créez un utilisateur sonar avec un mot de passe et une base de données "sonarqube" en utilisant les commandes suivantes :

CREATE USER sonar WITH ENCRYPTED PASSWORD 'sonar_password';
CREATE DATABASE sonarqube OWNER sonar;
GRANT ALL PRIVILEGES ON DATABASE sonarqube TO sonar;
\q

Explication des commandes :

  • Première commande : crée un nouvel utilisateur PostgreSQL nommé 'sonar' avec le mot de passe 'sonar_password'.
  • Deuxième commande : crée une nouvelle base de données nommée 'sonarqube' dont le propriétaire est l'utilisateur 'sonar'.
  • Troisième commande : accorde tous les privilèges sur la base de données 'sonarqube' à l'utilisateur 'sonar'.
  • Quatrième commande : quitter l'invite de commande PostgreSQL.

Désormais, nous allons apporter des modifications à la configuration de PostgreSQL. Modifiez ce fichier :

# Debian
sudo nano /etc/postgresql/15/main/pg_hba.conf

# AlmaLinux
sudo nano /var/lib/pgsql/data/pg_hba.conf

Vérifiez que le fichier "pg_hba.conf" contient bien ces lignes, sinon ajoutez-les :

# Debian
# IPv4 local connections:
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             127.0.0.1/32            scram-sha-256

# IPv6 local connections:
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             ::1/128                 scram-sha-256

# AlmaLinux
# "local" is for Unix domain socket connections only
local   all             all                                     md5

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5

# IPv6 local connections:
host    all             all             ::1/128                 md5

Explication des lignes ajoutées :

  • host all all 127.0.0.1/32 scram-sha-256 : Autorise les connexions IPv4 locales avec la méthode d'authentification scram-sha-256.
  • host all all ::1/128 scram-sha-256 : Autorise les connexions IPv6 locales avec la méthode d'authentification scram-sha-256.

Puis, redémarrez PostgreSQL :

sudo systemctl restart postgresql

III. Installation et configuration de SonarQube

A. Télécharger et installer SonarQube

Téléchargez SonarQube depuis le dépôt officiel ou celui-ci via la commande wget :

wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-9.9.5.90363.zip

Commencez par extraire le contenu de l'archive zip dans le répertoire "/opt".

sudo unzip sonarqube-9.9.5.90363.zip -d /opt

Ensuite, renommez le répertoire extrait de l'archive avec le nom "sonarqube" pour simplifier l'accès.

sudo mv /opt/sonarqube-9.9.5.90363 /opt/sonarqube

B. Créer un utilisateur pour SonarQube

Sur votre machine Linux, créez un utilisateur pour SonarQube. Nous allons crée un utilisateur système sans répertoire personnel, avec un groupe et un login désactivé, nommé "sonarqube". Puis, changer le propriétaire et le groupe du répertoire SonarQube pour l'utilisateur "sonarqube".

# Debian
sudo adduser --system --no-create-home --group --disabled-login sonarqube
sudo chown -R sonarqube:sonarqube /opt/sonarqube

# AlmaLinux
sudo groupadd sonarqube
sudo useradd --system --no-create-home --gid sonarqube --shell /usr/sbin/nologin sonarqube
sudo chown -R sonarqube:sonarqube /opt/sonarqube

C. Configurer SonarQube

Désormais, nous allons effectuer la configuration de SonarQube, notamment pour lui indiquer les informations de connexion à la base de données.

sudo nano /opt/sonarqube/conf/sonar.properties

Ajoutez/modifiez les lignes suivantes :

sonar.jdbc.username=sonar
sonar.jdbc.password=sonar_password
sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube

Explication des lignes ajoutées :

  • Première ligne : spécifie le nom d'utilisateur de la base de données PostgreSQL pour SonarQube.
  • Deuxième ligne : spécifie le mot de passe de l'utilisateur de la base de données PostgreSQL pour SonarQube.
  • Troisième ligne : spécifie l'URL de connexion à la base de données PostgreSQL pour SonarQube.

Enregistrez et fermez le fichier une fois la modification effectuée.

D. Configurer systemd

La prochaine étape consiste à configurer systemd pour SonarQube.

sudo nano /etc/systemd/system/sonarqube.service

Ajoutez le contenu suivant :

[Unit]
Description=SonarQube service
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/opt/sonarqube/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonarqube/bin/linux-x86-64/sonar.sh stop
User=sonarqube
Group=sonarqube
Restart=always
LimitNOFILE=65536
LimitNPROC=8192

[Install]
WantedBy=multi-user.target

Explication des sections :

  • [Unit] : contient les métadonnées et les dépendances du service.
  • [Service] : définit comment le service doit être démarré et arrêté, ainsi que les paramètres d'exécution.
  • [Install] : spécifie comment le service doit être installé et démarré par défaut.

Désormais, pour démarrer et activer SonarQube, vous pouvez utiliser ces commandes :

sudo systemctl daemon-reload
sudo systemctl start sonarqube
sudo systemctl enable sonarqube

E. Télécharger et configurer SonarScanner

Nous allons télécharger et installer SonarScanner. Il est en charge d'effectuer l'analyse d'un projet et d'envoyer les résultats à SonarQube.

Téléchargez SonarScanner depuis le dépôt officiel ou celui-ci avec la commande wget :

wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-6.0.0.4432.zip

Extrayez l'archive :

sudo unzip sonar-scanner-cli-6.0.0.4432.zip -d /opt
sudo mv /opt/sonar-scanner-6.0.0.4432 /opt/sonar-scanner

Ajoutez SonarScanner à la variable d'environnement "PATH" :

sudo nano /etc/profile

Ajoutez la ligne suivante à la fin du fichier :

export PATH=$PATH:/opt/sonar-scanner/bin

Cette ligne ajoute le répertoire "sonar-scanner/bin" au chemin d'accès global du système pour permettre l'exécution de SonarScanner depuis n'importe quel répertoire.

Rechargez le fichier "/etc/profile" et vérifiez le "PATH" et les versions :

source /etc/profile
echo $PATH
sonar-scanner --version

F. Ajuster la valeur de Memory Map Areas

SonarQube intègre ElasticSearch, ce dernier étant utilisé pour gérer l'indexation et la recherche des données d'analyse pendant le processus d'analyse de la qualité du code. Ceci permet à SonarQube d'être très rapide.

Pour que tout fonctionne bien, vous devez changer la valeur de "Memory Map Areas". Vous devez ouvrir le fichier "sysctl.conf" pour changer la valeur de "vm.max_map_count".

sudo nano /etc/sysctl.conf
vm.max_map_count=262144

Redémarrez et vérifiez le statut de SonarQube :

sudo systemctl restart sonarqube
sudo systemctl status sonarqube

IV. Analyser un projet avec SonarQube

Tout est prêt, nous pouvons passer à l'analyse d'un projet avec SonarQube. Ceci nous donnera l'occasion d'accéder à l'interface web de SonarQube pour créer votre projet et récupérer certaines informations.

A. Transférer les données du projet

Créez un répertoire pour votre projet et un sous-répertoire nommé SonarQube, puis ajustez les droits.

sudo mkdir -p votre_projet/SonarQube
sudo chown -R debuser:debuser /home/debuser/votre_projet

En utilisant WinSCP, transférez votre code à analyser dans le nouveau dossier que vous avez créé :

Vous pouvez lister les fichiers dans le répertoire de votre projet pour vérifier que la copie a réussi :

ls -ll votre_projet/SonarQube/

On peut observer que tous les fichiers ont bien été transférés :

B. Accéder à l'interface de SonarQube

Avec votre navigateur, rendez-vous sur cette adresse : http://localhost:9000/ ou http://votre_ip:9000/. Vous devriez arriver sur la page de connexion de SonarQube.

Si cela ne fonctionne pas, il s'agit probablement d'une règle à créer dans le pare-feu. Sur Alma Linux, voici comment créer cette règle :

sudo firewall-cmd --permanent --add-port=9000/tcp
sudo firewall-cmd --reload

Connectez-vous avec les identifiants par défaut :

  • Nom d'utilisateur : admin
  • Mot de passe : admin

Vous allez devoir changer le mot de passe après votre première connexion. Je vous invite à autogénérer un mot de passe fort, par exemple avec le site generateur-motsdepasse.fr ou l’application KreatPass.

C. Créer un projet

Une fois arrivé sur la page d'accueil, choisissez "Manually" :

Vous allez nommer votre projet :

Une fois arrivé sur la page de votre projet, choisissez "Locally" :

Donnez un nom à votre Token et une durée ("No expiration" est conseillé dans un premier temps) :

Conservez bien votre Token :

Créez le fichier de configuration "sonar-project.properties" dans le répertoire de votre projet :

sudo nano votre_projet/sonar-project.properties
# exemple de démonstration : 
# sudo nano votre_projet/SonarQube/sonar-project.properties

Ajoutez le contenu suivant au fichier :

sonar.projectKey=votre_clé_projet
sonar.projectName=votre_nom_de_projet
sonar.projectVersion=1.0
sonar.sources=.
sonar.host.url=http://localhost:9000
sonar.login=votre_token

# exemple de démonstration
# sonar.projectKey=Votre-Projet
# sonar.projectName=Votre-Projet
# sonar.projectVersion=1.0
# sonar.sources=.
# sonar.host.url=http://localhost:9000
# sonar.login=sqp_8bda7dbff5db898dbf614d21c1bcbec40c72f8cd

Voici des explications sur les lignes ajoutées :

  • sonar.projectKey=votre_clé_projet : spécifie la clé unique de votre projet SonarQube.
  • sonar.projectName=votre_nom_de_projet : spécifie le nom de votre projet SonarQube.
  • sonar.projectVersion=1.0 : spécifie la version de votre projet SonarQube.
  • sonar.sources=. : spécifie le répertoire des sources à analyser (le répertoire courant).
  • sonar.host.url=http://localhost:9000 : spécifie l'URL du serveur SonarQube.
  • sonar.login=votre_token : spécifie le token d'authentification pour accéder à SonarQube.

D. Exécuter SonarScanner

Naviguez vers le répertoire de votre projet si ce n'est pas déjà fait :

cd votre_projet/SonarQube

Accordez les permissions nécessaires :

sudo chown -R debuser:debuser /home/debuser/votre_projet/SonarQube
sudo chmod -R 755 /home/debuser/votre_projet/SonarQube

La première commande change le propriétaire et le groupe du répertoire de votre projet pour "debuser". La seconde commande modifie les permissions du répertoire de votre projet pour permettre la lecture, l'écriture et l'exécution par le propriétaire, et la lecture et l'exécution par les autres utilisateurs.

Exécutez l'analyse du code source de votre projet en utilisant SonarScanner et en envoyant les résultats à votre instance SonarQube.

sonar-scanner

Vous verrez alors le succès de l'analyse.

L'interface web devrait s'être mise à jour, rendez-vous dans Issues et à votre clavier pour résoudre les problèmes (l'on peut voir que j'ai une note de E pour la sécurité, vous pouvez voir en détail les possibles failles dans "Security Hotspots").

On peut observer que je n'ai que des failles "LOW", mais avec un nombre de 65. Ce qui justifie la note de E pour la sécurité, après analyse, il s'avère que la cause est similaire pour toutes ces failles. En effet, un lien qui pointe vers l'extérieur sans avoir d'attribut "rel="noopener", je vais donc maintenant pouvoir corriger cela.

V. Conclusion

En suivant ce tutoriel, vous avez appris à installer et configurer SonarQube sur Debian 12 ou AlmaLinux 9 pour auditer votre code source.

L'intégration de SonarQube dans votre pipeline de développement est une étape importante pour réduire les vulnérabilités potentielles présentes dans votre code.

Si vous rencontre des difficultés pour la mise en œuvre de SonarQube, n'hésitez pas à commenter cet article.

author avatar
Killian VAN RUYMBEKE Ingénieur Cybersécurité M1
Ingénieur Cybersécurité M1 en alternance, j'ai une forte appétence pour tous les domaines technologiques. Dans un esprit d'entraide, j’essaie de partager les connaissances que j'ai pu acquérir à travers mes articles.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

4 commentaires sur “Auditez et sécurisez votre code avec SonarQube sur Debian 12 ou AlmaLinux 9

  • Bonjour,
    La version de SonarQube utilisée est-elle la version communautaire gratuite ? Il n’est pas fait mention de licence dans l’article (qui est tres interessant).
    Merci.

    Répondre
  • Bonjour,

    C’est bien la version communautaire open source, c’est pour ça que je n’ai pas fait mention de l’utilisation de licences dans le tutoriels ^^

    Répondre
  • Bonjour,

    Je me calque sur votre tuto en suivant la documentation officielle à côté, le paramètre « Type= » dans la section « Service » n’est pas le même (au moment de la déclaration du service pour systemd), ainsi que l' »ExecStart » mais c’est autre chose.
    J’ai essayé de prendre la documentation officielle en changeant juste cette valeur par « simple » qui est recommandée (Car « forking » ne l’est pas d’après cette doc : https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html) .

    Savez-vous pourquoi juste en changeant cette valeur, SonarQube est impossible à start/restart, mais il reste accessible via l’interface web.

    Auriez-vous des suppositions ?

    Merci pour votre retour,

    Répondre
  • J’ai eu ma réponse.
    Je ne me suis pas assez bien documenté, désolé pour le post pollution.

    Merci!

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.