Version : Dolibarr ERP / CRM 23.x –mai 2025
1. Pourquoi introduire la 2FA dans Dolibarr ?
| Risque sans 2FA | Impact sur Dolibarr | Bénéfice attendu avec 2FA |
|---|---|---|
| Vol de mots de passe (phishing, fuite de base de données) | Accès non autorisé aux comptes clients, factures, stocks, paiements | Ajoute une couche de vérification qui rend le vol d’identifiant inefficace |
| Conformité RGPD / ISO 27001 | Difficulté à justifier la protection des données sensibles | Documentation d’un mécanisme d’authentification renforcé pour les audits |
| Multiplication des comptes (partenaires, fournisseurs, clients) | Gestion parfois chaotique des droits | Centralisation d’une méthode unique et sécurisée pour tous les acteurs |
En résumé : la 2FA devient un élément d’architecture qui s’insère naturellement dans la stack de Dolibarr (PHP + MySQL) tout en restant compatible avec les extensions du core.
2. Architecture globale de Dolibarr avec 2FA
+-------------------+ +----------------------+
| Navigateur Web | | Serveur Web (Apache)|
+-------------------+ +----------------------+
| |
| HTTPS (TLS1.3) |
v v
+-------------------+ +----------------------------+
| Front‑controller |-------> | Application PHP (Dolibarr) |
| (index.php) | | - Modules de connexion |
| | | - Modules 2FA (ex: totp, sms)|
+-------------------+ +----------------------------+
| |
| Session PHP + Cookies sécurisés |
v v
+-------------------+ +---------------------------
| Base de données |<-------| Table `user` (champ `totp_secret`)|
+-------------------+ +---------------------------
- Le cœur de Dolibarr reste inchangé : les modèles, services et API continuent de fonctionner comme d’habitude.
- Le point d’ancrage de la 2FA : les modules d’authentification sont chargés avant la validation de la session (hook
authenticatedu core). - Les secrets 2FA sont stockés dans la table
user(colonnetotp_secret), chiffrés côté serveur ou en base64 selon la configuration, mais jamais en clair.
3. Plugins 2FA disponibles pour Dolibarr
| Plugin | Type de token | Installation (1‑2‑3) | Exemple d’utilisation |
|---|---|---|---|
otp_totp |
OATH TOTP (Google Authenticator, Authy…) | 1. Télécharger le zip depuis la boutique Dolibarr 2. Décompresser dans ./custom/plugins/ 3. Activer via Paramètres → Sécurité → 2FA |
L’utilisateur scanne le QR‑code affiché dans le profil → saisit le code à 6‑chiffres. |
sms_twilio |
Code envoyé par SMS (Twilio) | 1. Créer une API Key Twilio 2. Entrer la clé dans le module 3. Valider le numéro de téléphone du compte | Idéal pour les comptes externes qui ne possèderont pas d’application d’authentification. |
email_yubikey |
Email contenant un lien à usage unique (ou YubiKey OTP) | 1. Activer l’envoi d’emails transactionnels 2. Configurer admin@example.com 3. Demander à l’utilisateur de cliquer sur le lien reçu |
Bonus : le lien expire après 10 minutes, ajout d’unsecond factor « email » complémentaire. |
hardware_token |
U2F / WebAuthn (clé de sécurité) | 1. Installer le module u2f 2. Enregistrer la clé dans le profil utilisateur 3. Définir les contraintes (ex. « toujours demander 2FA sur connexion admin ») |
Conformité aux normes ISO 27001 – aucune saisie de code, juste le touch de la clé. |
Astuce : tous ces plugins partagent la même interface d’administration located under
Paramètres → Sécurité → 2FA. Vous pouvez activer plusieurs méthodes simultanément (ex. TOTP + U2F) et choisir la politique de fallback.
4. Exemple concret : mise en œuvre du plugin otp_totp
4.1. Installation pas à pas
- Décompression
cd /var/www/dolibarr/htdocs
wget https://github.com/Dolibarr/dolibarr-otp-totp/releases/download/v1.2.0/otp_totp-1.2.0.zip
unzip otp_totp-1.2.0.zip -d custom/plugins/ - Activation du plugin
- Connectez‑vous à l’interface web en tant qu’administrateur.
- Menu
Extensions → Modules → Gestion des modules→ cliquez sur « Activer » à côté deTwo‑Factor Authenticator (OTP‑TOTP).
- Configuration du secret
- Accédez à
Paramètres → Sécurité → 2FA. - Cochez « Activer 2FA pour tous les utilisateurs ».
- Sous
'Méthode par défaut', choisissezTOTP.
- Accédez à
- Création du secret
- Pour chaque utilisateur, cliquez sur « Générer le secret TOTP » dans son profil (onglet
Profil → Sécurité). - Le plugin crée alors un secret base32 (ex.
JBSWY3DPEHPK3PXP) et le stockera chiffrée dansuser.totp_secret.
- Pour chaque utilisateur, cliquez sur « Générer le secret TOTP » dans son profil (onglet
4.2. Ligne de commande : génération programmatique du secret
require_once '/var/www/dolibarr/htdocs/includes/config.php';
require_once '$dolibarr_root/inc/common.inc.lib.php';
// $login = 'john.doe';
$user = new User($db);
$user->fetch('login', $login); // récupère l'objet User
$secret = TOTP::generateSecret(); // => "K7N2BX4Y6G9..."
$user->set_totp_secret($secret); // sauvegarde dans la BDD
echo "Secret TOTP généré pour $login : $secret\n";
4.3. Exemple d’utilisation côté client
Lors de la connexion d’un utilisateur avec 2FA activée :
| Étape | Action du serveur | Description |
|---|---|---|
| 1️⃣ | POST /index.php?main=user&login=login&pwd=... |
Vérification du nom d’utilisateur et du mot de passe. |
| 2️⃣ | Si le mot de passe est correct et que le compte possède totp_secret |
Dolibarr renvoie un formulaire auth_2fa.tpl contenant un champ « Code 2FA ». |
| 3️⃣ | L’utilisateur saisit le code à 6 chiffres généré par son authentificateur (ex. Authy) → POST /index.php?main=user&action=verify_2fa |
Le plugin compare le code avec le HMAC du secret + compteur (HMAC‑SHA1(secret, movingFactor)). |
| 4️⃣ | Si le code est valide, la session est créée avec l’indicateur 2fa_verified=1 (en $_SESSION). |
L’utilisateur a maintenant plein accès à Dolibarr. |
Note : le module fournit également un fallback (notation : « Code envoyé par e‑mail ») en cas d’oubli du token. Ce fallback doit être désactivé pour les comptes à privilèges élevés.
5. Exemple concret : mise en œuvre du plugin SMS (sms_twilio)
5.1. Configuration préalable
| Paramètre | Valeur |
|---|---|
| Account SID | ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| Auth Token | your_auth_token |
| From | +15551234567 |
| Test mode | false |
Ces informations se renseignent dans Paramètres → Sécurité → 2FA → Méthode SMS.
5.2. Enregistrement du numéro de téléphone
// Appeler depuis le profil utilisateur
$user->mobile_country_code = 'FR';
$user->mobile_number = '0612345678';
$user->save(); // persiste le numéro dans la BDD
5.3. Génération du code SMS
Le plugin utilise Twilio SDK :
require_once '/var/www/dolibarr/htdocs/business/thirdpartylibraries/twilio.php';
$client = new Twilio\Rest\Client($accountSid, $authToken);
$client->messages->create(
"+33{$user->mobile_number}", // destinataire
"+1{$from}", // numéro Twilio
"Votre code 2FA Dolibarr : " . rand(1000, 9999)
);
5.4. Vérification côté serveur
- L’utilisateur entre le code reçu via le formulaire de connexion →
action=verify_sms_2fa. - Le code est stocké dans la session (
$_SESSION['2fa_sms_code']). - Le serveur le compare avec le code transmis par le formulaire.
Conforme RGPD : les SMS sont chiffrés en transit (HTTPS) et les numéros sont stockés cryptés (
encrypt($num)).
6. Politique de gestion des pertes d’accès
| Situation | Procédure d’urgence | Niveau de privilège |
|---|---|---|
| Oublié le token 2FA (TOTP) | Utilisation du fallback (ex. email contenant un lien à usage unique) ou du code de récupération (déployé par l’administrateur) | Tous les utilisateurs |
| Compromission du compte (ex. vol de la clé) | Bloquer le compte → réinitialiser manuellement le secret 2FA + réinitialiser le mot de passe | Administrateur + groupe admin |
| Perte physique de la clé U2F | Désactiver l’enregistrement U2F via l’interface d’administration (délai de prise en charge 24 h) | Administrateur + groupe admin |
Code de récupération : généré une fois par compte (dans
user.recovery_code), valable 30 jours, stocké hashé (hash_recovery = password_hash($code)). L’utilisateur doit saisir ce code avant de pouvoir réinitialiser son secret 2FA.
7. Bonnes pratiques & recommandations architecturelles
- Utiliser HTTPS exclusivement : la session doit être sécurisée (cookie
Secure,HttpOnly). - Limiter le nombre de tentatives 2FA : bloquer l’adresse IP après 5 échecs (via le module
login_limiter). - Configurer le contrôle de session : durée de vie du cookie maximisée à 12 heures, rafraîchissement à chaque page.
- Séparer les environnements : ne jamais déployer la 2FA en production sans l’avoir testée en pré‑prod avec un compte dédié « test‑2fa‑dev ».
- Loguer chaque événement 2FA : ajoutez une entrée dans la table
log(module='2FA',action='verify',details='code OK'). - Tests unitaires : créez des tests PHPUnit qui simulate un utilisateur authentifié TOTP et assurez‑vous que
verify_2fa()renvoietrue.
public function test_verify_totp_success()
{
$login = 'alice';
$pwd = 'testpwd';
$secret = $this->getTOTPSecret($login);
$this->loginWithPassword($login, $pwd);
$this->post('action=verify_2fa', ['code' => $this->generateTOTP($secret)]);
$this->assertTrue($this->session->has('2fa_verified'));
}
8. Conclusion
L’intégration de l’authentification à deux facteurs dans Dolibarr ne requiert pas de refonte de l’architecture.
Le modèle hook‑based du core (authenticate, session_before) permet d’intercepter les étapes de login, d’injecter le challenge 2FA, puis de valider le facteur supplémentaire avant d’ouvrir l’accès aux modules métiers (CRM, factures, projets).
Parmi les solutions les plus robustes, on retrouve :
- TOTP (Google Authenticator, Authy) – le plus répandu, aucun SMS, aucun coût.
- SMS via Twilio – pratique pour les utilisateurs n’ayant pas d’app authentificatrice.
- U2F / WebAuthn – la solution la plus résistante au phishing.
En suivant les étapes détaillées ci‑dessus – installation du plugin, génération du secret, configuration d’une politique de fallback et mise en place de mesures de sécurité complémentaires – vous pourrez offrir à vos équipes, partenaires et clients une protection conforme aux exigences actuelles (RGPD, ISO 27001) tout en gardant la souplesse d’utilisation qui fait la réputation de Dolibarr.
Prochaine étape ?
- Audit de votre environnement (version Dolibarr, serveur web, base de données).
- Choix du type de token le plus adapté à votre contexte.
- Déploiement pilote sur un groupe restreint d’utilisateurs.
- Étude des logs et ajustement des seuils de verrouillage.
Bonne sécurisation ! 🚀