Sécurité Dolibarr : Google Sheets Tutoriel pas à pas avec des exemples concrets

(Tout en français, pour les utilisateurs qui souhaitent exploiter les possibilités de Google Sheets afin de renforcer la sécurité et la visibilité de leur système Dolibarr.)


1. Pourquoi coupler Dolibarr à Google Sheets pour la sécurité ?

Bénéfice Impact sur la sécurité
Gestion centralisée des listes d’utilisateurs Accès en temps réel aux comptes actifs/inactifs, évite les doublons et les comptes orphelins.
Traçabilité des actions critiques Historisation automatique des changements (ex. : montant de factures, modifications de contacts).
Contrôle des autorisations Possibilité de créer des rôles Google Sheets qui reflètent les groupes de droits Dolibarr (ex. : “Gestionnaire Factures”, “Responsable Achats”).
Alertes automatisées Envoi d’emails ou de notifications Slack/Teams lorsqu’un seuil de sécurité est franchi (ex. : connexion depuis un pays inattendu).
Sauvegarde & archivage Exportation régulière des logs de sécurité vers un feuille Google Sheets protégée, facilitant les audits.

En résumé : Google Sheets devient votre “tableau de bord de vigilance” qui complémente les fonctions de sécurité déjà intégrées à Dolibarr (rôles, groupes, logs).


2. Prérequis avant de commencer

Élément Version minimale Notes
Dolibarr 23.x ou plus Les fonctions d’API et de web‑hooks sont pleinement stables.
Google Workspace (ou compte Gmail) Actif Nécessaire pour créer le classeur et les scripts Apps Script.
Accès administrateur sur Dolibarr Oui Pour configurer les hooks et les modèles de notification.
Permissions sur Google Sheets Éditeur + Possesseur Le script doit pouvoir écrire dans le classeur.

Astuce : Si votre société utilise Google Workspace, créez un compte de service dédié à la sécurité afin de séparer les droits de production des droits d’administration du classeur.


3. Étape 1 : Configurer le classeur Google Sheets

3.1 Créer le classeur

  1. Ouvrez Google Sheets → Nouveau → Classeur vide.
  2. Renommez-le “Dolibarr‑Security‑Dashboard”.
  3. Partagez-le avec le compte de service ou l’adresse email qui exécutera le script (ex. : dolibarr-scripts@monsite.com).

3.2 Créer les feuilles (onglets) nécessaires

Feuille Objectif Colonnes recommandées
Utilisateurs Liste des comptes Dolibarr avec statut Nom, Login, email, Statut (Actif/Inactif), Date de dernière connexion, Dernière IP
Log_Actions Historique des actions sensibles Timestamp, Utilisateur, Action, Objet (ex. : Facture #123), Résultat (Succès/Échec), IP source
Alertes Règles d’alerte + statut ID, Condition, Message, Triggered (Oui/Non), Date déclenchement, Responsable
Paramètres Configuration globale du tableau Seuil_déconnexion_failed, Pays_autorisé, Email_admin

Exemple de mise en forme : Sélectionnez la ligne d’en-tête → Format → Texte en grasCouleur de fond pour différencier les types de données.

3.3 Protéger les feuilles critiques

  • Feuille “Log_Actions” : Protection → Définir les plages protégées → autorisez uniquement le script à écrire.
  • Feuille “Paramètres” : Verrouillez toutes les cellules sauf les champs que vous souhaitez modifier dynamiquement (ex. : seuils).


4. Étape 2 : Connecter Dolibarr à Google Sheets

4.1 Activer l’API Webhook dans Dolibarr

  1. Connectez‑vous à Dolibarr en tant qu’administrateur.
  2. Administration → Configuration → Webhooks.
  3. Ajouter un webhook :

    • Nom : GoogleSheets_LogAction
    • URL : https://script.google.com/macros/s/XXXXX/exec (voir §5 pour créer le script).
    • Méthode : POST
    • En‑tête : Content-Type: application/json
    • Événement déclencheur : After an action → sélectionnez Facture → Création, Contact → Modification, Utilisateur → Désactivation etc.
    • Payload JSON (exemple pour une création de facture) :
      {
      "event": "facture_created",
      "user": "{$user}", //login Dolibarr de l’auteur
      "object_id": "{$object->id}",
      "object_type": "invoice",
      "amount": "{$object->total}",
      "date": "{$object->date}",
      "client": "{$object->client}"
      }

  4. Enregistrer le webhook.

Note : Le même processus peut être répété pour d’autres événements (modification de contact, désactivation d’utilisateur, etc.).

4.2 Créer le script Google Apps Script

  1. Dans le classeur Dolibarr‑Security‑Dashboard, cliquez sur Extensions → Apps Script.
  2. Supprimez le fichier Code.gs par défaut et collez le code suivant :

/**
* Webhook reçu par Dolibarr et traité par Google Apps Script.
* Le scriptène les différents événements et les écrit dans la feuille Log_Actions.
*
* @param {Object} e Objet contenant le payload JSON envoyé par Dolibarr.
*/
function doPost(e) {
const ss = SpreadsheetApp.openById('ID_DU_CLASSEUR'); // <-- remplacez par l'ID du classeur
const logSheet = ss.getSheetByName('Log_Actions');
const paramSheet = ss.getSheetByName('Paramètres');
// Récupérer le payload JSON
const payload = JSON.parse(e.postData.contents);
// ----------- Gestion des différents événements -----------------
switch (payload.event) {
case 'facture_created':
logSheet.appendRow([
new Date(),
payload.user,
`Création facture #${payload.object_id}`,
`Montant : ${payload.amount} €`,
payload.client,
payload.ip || 'unknown'
]);
break;
case 'contact_modified':
logSheet.appendRow([
new Date(),
payload.user,
`Modification contact ${payload.object_id}`,
`Champ modifié : ${payload.field || 'generique'}`,
payload.new_value,
payload.ip || 'unknown'
]);
break;
case 'user_deactivated':
// Mettre à jour la feuille "Utilisateurs"
const userSheet = ss.getSheetByName('Utilisateurs');
const lastRow = userSheet.getLastRow();
const header = userSheet.getRange(1,1,1,userSheet.getLastColumn()).getValues()[0];
const colIdx = header.indexOf('Statut (Actif/Inactif)') + 1; // colonne statut
// Chercher le login payload.user
for (let i = 2; i <= lastRow; i++) {
if (userSheet.getRange(i, 2).getValue() === payload.user) {
userSheet.getRange(i, colIdx).setValue('Inactif');
break;
}
}
// Log de désactivation
logSheet.appendRow([new Date(), payload.user, 'Désactivation utilisateur', '', '', payload.ip || 'unknown']);
break;
default:
Logger.log('Événement inconnu : ' + payload.event);
}
// Retourner une réponse HTTP 200 pour indiquer le succès
return ContentService.createTextOutput(JSON.stringify({status: 'ok'}))
.setMimeType(ContentService.MimeType.JSON);
}

  1. Remplacer ID_DU_CLASSEUR par l’identifiant du classeur (visible dans l’URL de l’onglet Feuille de calcul).
  2. Enregistrer → donnez un nom (ex. : Dolibarr‑Webhook‑Handler).
  3. Deploy → Nouvelle version → choisissez “Numéro de version”.
  4. Web app settings :

    • Execute the app as : Moi (propriétaire du projet)
    • Who has access : Toute personne disposant du lien (ou Utilisateurs de votre domaine si vous êtes en Workspace).
  5. Déployer → vous obtenez une URL du type https://script.google.com/macros/s/XXXXX/exec.
  6. Copier cette URL et la coller dans le webhook Dolibarr créé à l’étape 4.1.

4.3 Test rapide

  1. Dans Dolibarr, créez une facture ou désactivez un utilisateur.
  2. Retournez dans le script (dans ExécutionsRecent executions), vérifiez que les lignes ont bien été ajoutées dans Log_Actions.
  3. Ouvrez la feuille pour constater l’ajout d’une ligne :

    • Date/heure
    • Utilisateur
    • Description de l’action
    • Détails complémentaires
    • Résultat


5. Étape 3 : Mettre en place des règles d’alerte sécuritaires

5.1 Exemple de règle d’alerte dans la feuille “Alertes”

ID Condition Message Triggered Date déclenchement Responsable
A01 =AND(C2="facture_created", D2>5000) “Création d’une facture > 5 000 € sans validation” =IF(ESTVIDE(G2), "Non", "Oui") =AUJOURDHUI() =Paramètres!B2

Comment créer la condition : Utilisez les fonctions Google Sheets (=REGEXMATCH, =COUNTIF, =IMPORTRANGE) pour analyser le contenu de Log_Actions.
Automatisation : Vous pouvez ajouter un script qui, lorsqu’une cellule dans Alertes!Triggered passe à “Oui”, envoie un email à l’adresse définie dans Alertes!Responsable.

5.2 Script d’envoi d’emails d’alerte (Ajoutez ce code dans le même projet Apps Script)

function sendAlerts() {
const ss = SpreadsheetApp.openById('ID_DU_CLASSEUR');
const alertSheet = ss.getSheetByName('Alertes');
const paramSheet = ss.getSheetByName('Paramètres');
const data = alertSheet.getDataRange().getValues();
const emailTo = paramSheet.getRange('B2').getValue(); // email admin
for (let i = 1; i < data.length; i++) { // saut de l'en-tête
const [id, condition, msg, triggered, date, resp] = data[i];
if (triggered === 'Oui') {
MailApp.sendEmail({
to: emailTo,
subject: `[ALERTE SÉCURITÉ] ${msg}`,
htmlBody: `<p>Condition ID : ${id}</p><p>${msg}</p><p>Déclenchée le : ${date}</p>`
});
// Marquer comme traité
alertSheet.getRange(i+1, 4).setValue('Oui - Traité');
}
}
}

  • Déclencheur : Créez un déclencheur temporel → toutes les heures ou chaque jour selon votre besoin.

Résultat : L’administrateur reçoit automatiquement un email dès qu’une alerte est activée, avec le contexte complet et le nom du responsable à contacter.


6. Étape 4 : Exploiter les fonctions de sécurité avancées de Google Sheets

Fonction Utilisation concrète pour Dolibarr Exemple d’application
ImportRange Regrouper les logs de plusieurs sites ou environnements (production, pré‑production) =IMPORTRANGE("URL_classeur_prod","Log_Actions!A:F")
Version historique Conserver chaque version d’un enregistrement sensible =QUERY(Log_Actions!A:F, "select * where B='john.doe' order by A desc")
Protection par mot de passe Empêcher la modification directe d’une feuille de rapports Données → Feuille de calcul protégée → définir un mot de passe fort
Conditional Formatting Visualiser instantanément les déconnexions suspectes Colorez en rouge les lignes où IP source n’est pas dans la liste des pays autorisés (=NOT(REGEXMATCH(C2;listePays)))
Google Charts Créer des graphiques de suivi d’activités =SPARKLINE(Log_Actions!A:A, {"charttype","column"}) pour un tableau de suivi des actions par jour
App Script → Zapier / IFTTT Envoyer les événements vers d’autres outils (Slack, Teams, PagerDuty) UrlFetchApp.fetch('https://hooks.slack.com/services/...', {method: 'post', payload: {...}})

Bon à savoir : Les fonctions ImportRange et QUERY permettent de créer un dashboard consolidé affichant les logs de tous vos déploiements Dolibarr depuis un même tableau de bord partagé.


7. Exemple complet : Scénario “Contrôle d’accès depuis un pays non autorisé”

7.1 Objectif

  • Alerte lorsqu’un utilisateur Dolibarr se connecte depuis un pays qui n’est pas whitelisté (ex : uniquement FR, BE, CH).
  • Enregistrement de l’IP source dans la feuille Log_Actions.
  • Notification immédiate à l’administrateur via email et Slack.

7.2 Étapes détaillées

  1. Créer la feuille “Paramètres” avec la liste des pays autorisés (cellule B2 : FR,BE,CH).
  2. Modifier le script Webhook (dans doPost) afin d’enregistrer l’IP et de vérifier la whitelist :

// ... après le traitement de l'événement
if (payload.event === 'login') {
const ip = payload.ip;
const list = paramSheet.getRange('B2').getValue().split(',');
const isAllowed = list.some(country => ip.startsWith(country));
if (!isAllowed) {
// Ajout d'une ligne d'alerte spécifique
logSheet.appendRow([new Date(), payload.user, 'Connexion depuis IP non autorisée',
`IP=${ip}`, 'UE', payload.ip]);
// Envoi d''alerte immédiate
MailApp.sendEmail({
to: paramSheet.getRange('B3').getValue(), // email admin
subject: `[ALERTE] Connexion suspecte`,
htmlBody: `<p>Utilisateur ${payload.user} s'est connecté depuis ${ip}</p>`
});
}
}

  1. Créer un déclencheur temporel qui lance sendAlerts() toutes les 15 minutes.
  2. Mettre à jour la feuille “Alertes” avec une règle :

Condition Message Triggered
=REGEXMATCH(Log_Actions!E2, "Connexion depuis IP non autorisée") “Connexion suspecte depuis pays non whitelisté” Auto‑mise à jour via le script

  1. Résultat : Dès qu’un login suspect est détecté, une ligne apparaît dans Log_Actions, un email (et éventuellement un message Slack via le même script) est envoyé à l’administrateur, et la cellule “Triggered” passe à “Oui”.


8. Bonnes pratiques à retenir

Principe Mise en œuvre pratique
Principe du moindre privilège Ne donnez aux scripts que les droits nécessaires (ex. : accès uniquement en écriture sur Log_Actions).
Séparer les environnements Créez un classeur distinct pour Production et Tests afin d’éviter les interférences lors du développement de nouvelles règles d’alerte.
Rotation régulière des clés d’API Si vous utilisez des API externes (ex. : Slack), renouvelez les tokens tous les 90 jours.
Audit mensuel Exportez le classeur en PDF ou en CSV pour conserver un historique immuable et réviser les règles d’alerte.
Gestion des erreurs Encapsulez chaque appel API dans try…catch et logguez les erreurs dans une feuille “Erreurs” pour faciliter le dépannage.
Documentation vivante Documentez chaque feuille et chaque script avec des commentaires dans le code et des notes dans une feuille “Readme”.


9. Conclusion

En combinant Dolibarr (gestion ERP robuste) avec Google Sheets (flexibilité des tableaux, alertes instantanées et visualisation collaborative), vous obtenez :

  1. Une visibilité en temps réel sur chaque action sensible (création de facture, modification de contact, désactivation d’utilisateur).
  2. Un contrôle d’accès dynamique grâce à des règles d’alerte automatisées.
  3. Une traçabilité complète pour les audits internes ou externes, sans devoir développer un tableau de bord propriétaire coûteux.
  4. Une extensibilité infinie : vous pouvez ajouter d’autres sources de données (ex. : CRM, outils de ticketing) et les répercuter dans votre tableau de bord de sécurité.

À vous de jouer !

  • Créez le classeur dès aujourd’hui.
  • Configurez les webhooks dans Dolibarr.
  • Déployez le script Apps Script et testez les premières alertes.
  • Puis, itérez en fonction de vos besoins métier et des retours de votre équipe de sécurité.


Ressources complémentaires

Bon renforcement de votre sécurité ! 🚀

Publications similaires