SonarQube
Présentation
Cette page a pour but de décrire certains aspects de SonarQube utilisé par les bureaux d'études de Régaz.
Description
"SonarQube (précédemment Sonar) est un logiciel libre permettant de mesurer la qualité du code source en continu."
Le site officiel : https://www.sonarqube.org/
Authentification Active Directory
Introduction
La documentation concernant l'authentification dans SonarQube est accessible à : https://docs.sonarqube.org/latest/instance-administration/delegated-auth/
Un des aspects importants de cette documentation est le mappage de groupes, dont la traduction française de la documentation est la suivante :
"Lors de l'utilisation du mappage de groupe, les mises en garde suivantes s'appliquent, quelle que soit la méthode d'authentification déléguée utilisée :
- l'appartenance à des groupes synchronisés remplacera toute appartenance configurée localement dans SonarQube à chaque connexion
- l'appartenance à un groupe n'est synchronisée que si un groupe du même nom existe dans SonarQube
- l'appartenance au groupe par défaut
sonar-users
reste (il s'agit d'un groupe système) même si le groupe n'existe pas dans le fournisseur d'identité
Lorsque le mappage de groupe est configuré, la source d'authentification déléguée devient le seul et unique endroit pour gérer l'appartenance à un groupe, et les groupes de l'utilisateur sont récupérés à chaque connexion."
Particularités Active Directory
L'imbrication de groupes consiste à dire que si un groupe A appartient à un groupe B, alors, l'utilisateur du groupe A appartient au groupe B.
Dans le cas du souhait d'utiliser la fonctionnalité d'imbrication de groupes dans l'Active Directory, il va falloir vérifier que que ce dernier ait cette fonctionnalité d'activée.
Pour vérifier ce comportement, voici la commande à lancer depuis un serveur Linux vers un serveur Active Directory :
ldapsearch -x -LLL -h ADServer -D QueryUser -w QueryPassword -b "DC=example,DC=local" "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=CN=MyUser,OU=CompanyUsers,DC=example,DC=local))" 1.1
Voici le détail des options :
- ADServer
- Nom du serveur Active Directory
- QueryUser
- Utilisateur qui a le droit d'interrogation de l'AD
- QueryPassword
- Mot de passe de l'utilisateur qui interroge l'AD
- DC=example,DC=local
- Base de recherche de l'AD
- (&(objectClass=group)(member:1.2.840.113556.1.4.1941:=CN=MyUser,OU=CompanyUsers,DC=example,DC=local))
- Filtre de recherche, dont l'association de plusieurs filtres sont possibles grâce au caractère "&"
- objectClass=group
- Filtre permettant de rechercher des objet de type groupe
- member:1.2.840.113556.1.4.1941:=CN=MyUser,OU=CompanyUsers,DC=example,DC=local
- Filtre permettant de rechercher les groupes imbriqués dans lesquels est l'utilisateur MyUser
- member:1.2.840.113556.1.4.1941
- Filtre activant la recherche dans les groupes imbriqués
- Voir la documentation sur les opérateurs dans la syntaxe des filtre de recherche, plus particulièrement la règle LDAP_MATCHING_RULE_IN_CHAIN
- CN=MyUser,OU=CompanyUsers,DC=example,DC=local
- Utilisateur concerné par la recherche
- 1.1
- Option permettant de ne retourner que le DN des objets trouvés
- En l'absence de cette option, le détail des objets trouvés sera affiché, rendant l'interprétation des résultats compliquée
Le résultat de cette requête doit retourner les groupes dont l'utilisateur appartient, y compris les groupes imbriqués. Si les groupes imbriqués n'apparaissent pas, cela signifie que la fonctionnalité n'est pas activée sur l'Active Directory.
Installation du plugin
Installation interactive
Se rendre dans le menu "Administration", puis dans le "Marketplace" et rechercher le plugin "LDAP" :
Cliquer sur Install pour l'installer, puis passer à l'étape de configuration du plugin.
En cas de problème lors de l'installation interactive, tenter une installation manuelle.
Installation manuelle
En cas de problème lors de l'installation interactive (par exemple, une version de SonarQube trop ancienne pour la version du plugin disponible sur le marketplace), il est possible de l'installer manuellement.
Pour ce faire, se rendre sur https://binaries.sonarsource.com/Distribution/sonar-ldap-plugin/, choisir la version du plugin désirée et la télécharger dans le dossier $SONARQUBE_HOME/extensions/plugins
.
Exemple pour une ancienne version de SonarQube et la version 2.2.0.608 du plugin ldap :
cd /var/lib/sonar/sonarqube-6.7.5/extensions/plugins wget https://binaries.sonarsource.com/Distribution/sonar-ldap-plugin/sonar-ldap-plugin-2.2.0.608.jar
Redémarrer SonarQube pour la prise en compte du plugin.
Configuration du plugin
Editer le fichier $SONARQUBE_HOME/conf/sonar.properties
et y insérer/modifier les paramètres suivants :
# LDAP Plugin
sonar.security.realm=LDAP
sonar.authenticator.downcase=true
ldap.url=ldap://ADServer
ldap.bindDn=CN=QueryUser,OU=TechnicalUsers,DC=example,DC=local
ldap.bindPassword=QueryPassword
ldap.user.baseDn=DC=groupegdb,DC=local
ldap.user.request=(&(objectClass=user)(sAMAccountName={login}))
ldap.user.realNameAttribute=displayName
ldap.group.baseDn=DC=groupegdb,DC=local
ldap.group.request=(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={dn}))
Ajuster les paramètres comme suit :
- LDAP
- Type d'authentification à utiliser
- ADServer
- Nom du serveur Active Directory
- CN=QueryUser,OU=TechnicalUsers,DC=example,DC=local
- DN de l'utilisateur qui a le droit d'interrogation de l'AD
- QueryPassword
- Mot de passe de l'utilisateur qui interroge l'AD
- DC=example,DC=local
- Base de recherche de l'AD
- A renseigner impérativement pour "ldap.group.baseDn"" dans le cas d'un souhait de gestion d'accès par groupe
- (&(objectClass=user)(sAMAccountName={login}))
- Filtre de recherche, dont l'association de plusieurs filtres sont possibles grâce au caractère "&"
- objectClass=user
- Filtre permettant de rechercher des objet de type user
- sAMAccountName={login}
- Mappage du login avec le champ correspondant dans l'AD
- Variable {login} produite par le plugin contenant l'identifiant que l'utilisateur a rentré en tentant de s'authentifier
- displayName
- Mappage avec le champ contenant le nom convivial dans l'AD
- (&(objectClass=group)(member:1.2.840.113556.1.4.1941:={dn}))
- Filtre de recherche, dont l'association de plusieurs filtres sont possibles grâce au caractère "&"
- objectClass=group
- Filtre permettant de rechercher des objet de type groupe
- member:1.2.840.113556.1.4.1941:={dn}
- Filtre permettant de rechercher les groupes imbriqués dans lesquels est l'utilisateur qui tente de s'authentifier
- member:1.2.840.113556.1.4.1941
- Filtre activant la recherche dans les groupes imbriqués
- Voir la documentation sur les opérateurs dans la syntaxe des filtre de recherche, plus particulièrement la règle LDAP_MATCHING_RULE_IN_CHAIN
- {dn}
- Utilisateur concerné par la recherche, variable produite par le plugin contenant le DN de l'utilisateur qui tente de s'authentifier
Redémarrer SonarQube pour la prise en compte du plugin.
Voici un exemple de connexion réussie au LDAP dans les logs de SonarQube :
[mygreatuser@mygreatserver:/] > tail -f /var/lib/sonar/sonarqube-6.7.5/logs/*|grep -i ldap ... 2020.04.30 19:20:26 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin LDAP / 2.2.0.608 / 79dc3fa4393a29667673c70182f3016288b548b7 2020.04.30 19:20:27 INFO web[][org.sonar.INFO] Security realm: LDAP 2020.04.30 19:20:27 INFO web[][o.s.p.l.LdapSettingsManager] User mapping: LdapUserMapping{baseDn=DC=example,DC=local, request=(&(objectClass=user)(sAMAccountName={0})), realNameAttribute=displayName, emailAttribute=mail} 2020.04.30 19:20:27 INFO web[][o.s.p.l.LdapSettingsManager] Group mapping: LdapGroupMapping{baseDn=DC=example,DC=local, idAttribute=cn, requiredUserAttributes=[dn], request=(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={0}))} 2020.04.30 19:20:27 INFO web[][o.s.p.l.LdapContextFactory] Test LDAP connection on ldap://ADServer: OK 2020.04.30 19:20:33 INFO ce[][o.s.c.c.CePluginRepository] Loaded plugin LDAP [ldap]
Configuration de la gestion d'accès
Une fois la configuration du plugin LDAP terminée, il est alors possible de définir des droits d'accès en fonction de l'identifiant et/ou des groupes d'appartenance de l'utilisateur.
Définir un groupe d'administrateurs
S'authentifier en tant qu'utilisateur admin
et aller dans "Administration -> Security -> Groups" :
Cliquer sur "Create Group" et renseigner les champs comme désirés (exemple : APP_TOOLS_SONARQUBE_ADM) :
Attention ! Le nom du groupe doit impérativement correspondre à un nom de groupe existant dans l'Active Directory.
Le groupe APP_TOOLS_SONARQUBE_ADM est correctement ajouté :
Aller ensuite dans "Administration -> Security -> Global Permissions" :
Cliquer sur "Search", renseigner le groupe précédemment créé et lui attribuer le droit d'Administer System :
Une fois ces étapes réalisées, pour qu'un utilisateur soit administrateur SonarQube, il suffira simplement qu'il soit dans le groupe Active Directory des administrateurs SonarQube. Aucune configuration supplémentaire ne sera nécessaire dans l'outil.
Autoriser un groupe sur un projet
S'authentifier en tant qu'administrateur et aller dans "Administration -> Projects -> Management" :
Cliquer sur le bouton "Action" puis sur "Edit Permissions" :
Cliquer sur "Search", renseigner le groupe d'utilisateurs Active Directory souhaité (exemple : APP_TOOLS_SONARQUBE_MYGREATPROJECT_USERS) et lui attribuer les droits désirés :
Une fois ces étapes réalisées, pour qu'un utilisateur accède à un projet SonarQube, il suffira simplement qu'il soit dans le groupe Active Directory autorisé à accéder à ce projet. Aucune configuration supplémentaire ne sera nécessaire dans l'outil.
Astuces
Réinitialiser le mot de passe administrateur
Selon les versions, la méthode d'implémentation des mots de passe applicatifs au sein de SonarQube diffère. De ce fait, chaque version a sa méthode de réinitialisation.
Version 6.7.x
La méthode est accessible sur la documentation officielle : https://docs.sonarqube.org/6.7/Authentication.html#src-11634809_Authentication-Ilosttheadminpassword
Se connecter à la base de données avec un utilisateur ayant les droits d'écriture sur les tables de SonarQube et lancer la commande suivante :
update users set crypted_password = '88c991e39bb88b94178123a849606905ebf440f5', salt='6522f3c5007ae910ad690bb1bdbf264a34884c6d' where login = 'admin'
Cela aura pour effet de réinitialiser le mot de passe de l'utilisateur "admin" à 'admin'.
Ensuite, bien évidement penser à se connecter en tant qu'admin et changer son mot de passe à une valeur plus sécurisée.