(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
- Ouvrez Google Sheets → Nouveau → Classeur vide.
- Renommez-le “Dolibarr‑Security‑Dashboard”.
- 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 gras → Couleur 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
- Connectez‑vous à Dolibarr en tant qu’administrateur.
- Administration → Configuration → Webhooks.
-
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}"
}
- Nom :
- 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
- Dans le classeur Dolibarr‑Security‑Dashboard, cliquez sur Extensions → Apps Script.
- Supprimez le fichier
Code.gspar 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);
}
- Remplacer
ID_DU_CLASSEURpar l’identifiant du classeur (visible dans l’URL de l’onglet Feuille de calcul). - Enregistrer → donnez un nom (ex. : Dolibarr‑Webhook‑Handler).
- Deploy → Nouvelle version → choisissez “Numéro de version”.
- 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).
- Déployer → vous obtenez une URL du type
https://script.google.com/macros/s/XXXXX/exec. - Copier cette URL et la coller dans le webhook Dolibarr créé à l’étape 4.1.
4.3 Test rapide
- Dans Dolibarr, créez une facture ou désactivez un utilisateur.
- Retournez dans le script (dans Exécutions → Recent executions), vérifiez que les lignes ont bien été ajoutées dans Log_Actions.
- 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
- Créer la feuille “Paramètres” avec la liste des pays autorisés (cellule
B2:FR,BE,CH). - 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>`
});
}
}
- Créer un déclencheur temporel qui lance
sendAlerts()toutes les 15 minutes. - 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 | … |
- 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 :
- Une visibilité en temps réel sur chaque action sensible (création de facture, modification de contact, désactivation d’utilisateur).
- Un contrôle d’accès dynamique grâce à des règles d’alerte automatisées.
- Une traçabilité complète pour les audits internes ou externes, sans devoir développer un tableau de bord propriétaire coûteux.
- 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
- Documentation officielle Dolibarr : https://www.dolibarr.org/documentation.html
- Google Apps Script – Guide des Web Apps : https://developers.google.com/apps-script/guides/web
- Modèle de tableau de suivi de sécurité (exemple téléchargeable) – disponible sur le repo GitHub de la communauté Dolibarr.
Bon renforcement de votre sécurité ! 🚀