Qu'est-ce que le plugin Dependency-Check de SonarQube ?
Le plugin Dependency-Check de Sonarqube (github) permet de détecter les vulnérabilités des dépendances utilisées dans le code source. Il est basé sur le projet OWASP Dependency-Check et utilise les bases de données de vulnérabilités de NVD et RetireJS. Grâce à ce plugin, il est possible d'identifier rapidement les vulnérabilités potentielles et donc de les corriger avant qu'elles ne soient exploitées par des attaquants. Dans cet article nous allons voir comment utiliser ce plugin avec une base de données selfhosted sur Azure mais nous partons du principe que vous avez déjà un Sonarqube fonctionnel. Si ce n'est pas le cas, vous pouvez vous référer à la documentation officielle de Sonarqube ici.
Mise en place de la BDD avec Terraform
Pour utiliser le plugin Dependency-Check de Sonarqube, on peut utiliser une simple H2 database locale ou mettre en place sa propre base de données centralisée. Nous allons donc voir dans la suite de cet article comment mettre en place une base de données PostgreSQL sur Azure avec Terraform afin de l'utiliser avec le plugin Dependency-Check de Sonarqube.
Tout d'abord il est nécessaire de créer le fichier provider.tf
dans notre repo où nous allons lancer notre code Terraform et d'y insérer le code suivant :
terraform {
required_version = ">=1.0"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>3.0"
}
}
}
provider "azurerm" {
features {}
}
On va ensuite créer dans un fichier main.tf
dans lequel nous allons insérer le code Terraform permettant de créer notre base de données:
resource "azurerm_resource_group" "rg" {
name = "my-rg"
location = "France Central"
}
resource "azurerm_postgresql_flexible_server" "psql-server" {
name = "my-psql-server"
resource_group_name = azurerm_resource_group.rg.name
location = "France Central"
version = "14"
administrator_login = "adminPsql"
administrator_password = "P@ssw0rd1234!"
zone = "1"
storage_mb = 32768
sku_name = "GP_Standard_D2s_v3"
}
resource "azurerm_postgresql_flexible_server_firewall_rule" "fw-rule" {
name = "my-fw-rule"
server_id = azurerm_postgresql_flexible_server.psql-server.id
start_ip_address = "0.0.0.0"
end_ip_address = "255.255.255.255"
}
Dans cet article, on déploie une base de données en public et avec des règles firewall permissives pour des raisons de simplicité. Il est cependant possible et recommandé de déployer la base de données en privée et/ou de mettre en place des règles firewall plus restrictives.
Remplissage de la BDD avec les données du Nist
Nous allons utiliser la base de données PostgreSQL avec le plugin Dependency-Check de Sonarqube pour récupérer nos vulnérabilités. Pour cela il est d'abord nécessaire de remplir notre base de données avec les données du Nist. Pour commencer on va initialiser notre base grâce au fichier postgre_init.sql. Celui-ci va créer les tables nécessaires à l'import des données du Nist et également créer un utilisateur reader qui sera utilisé pour lire la base de données.
Pensez à modifier ce fichier pour changer le mot de passe des utilisateur reader et admin et éventuellement leurs noms.
Pour ce faire on va utiliser la commande suivante en bash:
export PGPASSWORD="P@ssw0rd1234!"
psql --file=postgre_init.sql --host=my-psql-server.postgres.database.azure.com --port=5432 --username=adminPsql --dbname=postgres
Il peut être utile de télécharger et/ou de lancer le service postgresql.service pour que la commande fonctionne en fonction de l'environnement utilisé.
Une fois la base de données initialisée, on va pouvoir importer les données du Nist. Pour cela, on utilise le script de dependency check dependency-check.sh. Celui-ci permet de scanner un projet et de récupérer les vulnérabilités des dépendances utilisées mais permet également possible de l'utiliser pour récupérer les données du Nist. Pour cela on va utiliser la commande suivante en bash:
chmod 700 ./dependency-check.sh
export CONNECTSTR="jdbc:postgresql://my-psql-server.postgres.database.azure.com:5432/dependencycheck?user=adminPsql&password=P@ssw0rd1234!"
./dependency-check.sh --connectionString $CONNECTSTR --updateonly -dbDriverName org.postgresql.Driver -dbDriverPath ./lib/postgresql-42.6.0.jar
Il peut être necessaire de télécharger un driver jdbc pour que la commande fonctionne. Voici un lien vers le driver utilisé dans cet article : postgresql-42.6.0.jar
On peut également envisager de mettre en place un cronjob ou un autre service du même type pour mettre à jour les données du Nist régulièrement et s'assurer que notre base de données est à jour.
Scanne et récupération du rapport avec le plugin Dependency-Check de Sonarqube
Maintenant que notre base de données est fonctionnelle, on va pouvoir utiliser le plugin Dependency-Check de Sonarqube en utilisant celle-ci.
Dans un premier temps il est nécessaire d'ajouter ce plugin sur notre Sonarqube. Pour cela on va dans l'onglet Administration > Marketplace et on recherche le plugin Dependency-Check. On l'installe et on redémarre notre Sonarqube. On peut également le configurer dans l'onglet Administration > Configuration > General Settings > Dependency-Check :
On peut notamment configurer le chemin des différents rapports qu'on va générer avec le script dependency-check et également les différents niveaux de criticité.
Une fois le plugin installé et configuré, il faut maintenant utiliser le script dependency check sur les projets que l'on souhaite scanner. Voici un exemple de comment l'utiliser en bash pour un projet node en utilisant l'utilisateur reader créé précédemment dans la base de données:
export CONNECTSTR="my-psql-server.postgres.database.azure.com?user=ReaderUser&password=P@ssw0rd1234!"
cd dependency-check/bin
./dependency-check.sh --out '.' --scan ./package.json -f JSON -f HTML --connectionString $CONNECTSTR --noupdate -dbDriverName org.postgresql.Driver -dbDriverPath ./postgresql-42.6.0.jar --enableExperimental
L'exécution du script va nous générer un rapport HTML et JSON que l'on peut ensuite utiliser pour afficher les vulnérabilités dans Sonarqube. C'est le plugin installé précédemment qui va permettre de récupérer les données du rapport et de les afficher dans Sonarqube. On scan notre code comme on le ferait habituellement avec Sonarqube et c'est celui-ci qui va se charger de récupérer les rapports HTML et JSON générés plus tôt contenant la liste des vulnérabilités présentes dans notre projet.
Nos rapports sont ensuite accessibles au niveau de notre projet Sonarqube dans l'onglet More > Dependency-Check :
Conclusion
Dans cet article nous avons vu comment mettre en place une base de données PostgreSQL sur Azure avec Terraform et comment l'utiliser avec le plugin Dependency-Check de Sonarqube pour récupérer les vulnérabilités des dépendances utilisées dans notre code. Il est également important de noter que dans cet article nous avons simplifié la mise en place des différentes ressources. Il serait recommandé de déployer notre base de données en privée et d'utiliser un service comme Azure Devops par exemple pour remplir cette base et même jouer le script dependency-check.