Architecture Dolibarr : 2FA avec des exemples concrets

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 authenticate du core).
  • Les secrets 2FA sont stockés dans la table user (colonne totp_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

  1. 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/
  2. Activation du plugin

    • Connectez‑vous à l’interface web en tant qu’administrateur.
    • Menu Extensions → Modules → Gestion des modules → cliquez sur « Activer » à côté de Two‑Factor Authenticator (OTP‑TOTP).
  3. Configuration du secret

    • Accédez à Paramètres → Sécurité → 2FA.
    • Cochez « Activer 2FA pour tous les utilisateurs ».
    • Sous 'Méthode par défaut', choisissez TOTP.
  4. 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 dans user.totp_secret.

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

  1. Utiliser HTTPS exclusivement : la session doit être sécurisée (cookie Secure, HttpOnly).
  2. Limiter le nombre de tentatives 2FA : bloquer l’adresse IP après 5 échecs (via le module login_limiter).
  3. Configurer le contrôle de session : durée de vie du cookie maximisée à 12 heures, rafraîchissement à chaque page.
  4. 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 ».
  5. Loguer chaque événement 2FA : ajoutez une entrée dans la table log (module='2FA', action='verify', details='code OK').
  6. Tests unitaires : créez des tests PHPUnit qui simulate un utilisateur authentifié TOTP et assurez‑vous que verify_2fa() renvoie true.

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 ?

  1. Audit de votre environnement (version Dolibarr, serveur web, base de données).
  2. Choix du type de token le plus adapté à votre contexte.
  3. Déploiement pilote sur un groupe restreint d’utilisateurs.
  4. Étude des logs et ajustement des seuils de verrouillage.

Bonne sécurisation ! 🚀

Publications similaires