← Retour à l'accueil
Vos identifiants, protégés

Comment nous protégeons vos identifiants Odoo.

Nous nous connectons à votre Odoo pour synchroniser les factures. Cela signifie que nous détenons un mot de passe. Cette page explique — en français clair d'abord, en détail technique ensuite — exactement comment nous le stockons, qui peut le lire, et pourquoi un dump de notre base serait inutile à un attaquant. Revue à chaque release.

🔐

Chiffré au repos

Mots de passe stockés en chiffré AES-128 + HMAC. La base ne voit jamais de clair.

🗝

Clé conservée à part

La clé maître vit dans un magasin de secrets managé. Jamais dans la base, jamais dans git.

👁

Usage en lecture seule

On lit uniquement les factures et données de ventes. On n'écrit jamais dans votre Odoo. Jamais.

🧭

Isolé par compte

Chaque appel API scope les requêtes par user_id, côté serveur. Pas d'accès cross-tenant.

4
Colonnes en base
URL, base, identifiant, mot de passe chiffré. Rien d'autre.
0
Octets en clair
Votre mot de passe est chiffré avant même de toucher notre disque.
2
Chemins de code
Endpoint de test de connexion et worker de sync. Les deux auditables.
Temps de brute-force
AES-128 avec HMAC. Réalistement, non.
01

Ce que nous stockons réellement

L'inventaire complet

Quand vous connectez une instance Odoo, seuls ces champs sont persistés dans notre base. Rien d'autre — pas de cookies, pas de tokens de session, pas de clés admin Odoo, aucune donnée d'analytics au-delà de ce qui sert à synchroniser vos factures.

  • URL Odoo — par ex. https://acme.odoo.com — pour atteindre votre instance.
  • Nom de la base — l'identifiant de la base Odoo — requis par le protocole RPC d'Odoo.
  • Identifiant — le login de l'utilisateur Odoo dédié que vous nous provisionnez.
  • Mot de passe chiffré — un blob de chiffré. Le clair quitte votre navigateur, est chiffré sur notre serveur, et n'est jamais écrit sur disque sous une forme lisible.
Recommandation
Créez un utilisateur Odoo dédié à Vizualizer avec un accès lecture seule à Ventes et Comptabilité. Utilisez une clé API plutôt qu'un mot de passe quand c'est possible. En cas de soupçon de fuite, faites tourner ce seul identifiant — votre vrai compte admin reste intact.
02

À quoi ressemble vraiment la ligne en base

Schéma, pas prose

Voici la forme réelle de la table qui contient votre connexion. Notez ce qui en est absent : aucune colonne plaintext_password, aucun password_hint, aucun champ de récupération.

# forme simplifiée de ce qui se trouve en base
odoo_connections (
  id                  SERIAL PRIMARY KEY,
  user_id             INTEGER,
  url                 TEXT,          -- ex. https://acme.odoo.com
  database            TEXT,          -- ex. acme-prod
  username            TEXT,          -- ex. bot@acme.com
  encrypted_password  TEXT,          -- chiffré uniquement — jamais de clair
  ...
)

Trois éléments rendent cette ligne sûre à conserver :

  • La colonne password ne stocke que du chiffré — le clair n'existe jamais sur notre infrastructure après chiffrement.
  • Du chiffré sans la clé maître est cryptographiquement inutile — pas de dictionnaire, pas de brute force dans un horizon faisable.
  • Chaque ligne est liée à un user_id. Notre API refuse de retourner une connexion qui n'appartient pas à l'appelant.
03

Le chiffrement, en détail technique

Chiffrement authentifié symétrique

Nous utilisons Fernet, le schéma de chiffrement de la bibliothèque Python cryptography bien auditée. Fernet n'est pas un protocole maison — c'est une spécification bâtie sur des primitives revues depuis des décennies.

Cipher
AES-128-CBC
Intégrité
HMAC-SHA256
Bibliothèque
cryptography.Fernet
Nonce / IV
Aléatoire à chaque chiffrement

Chaque mot de passe que vous enregistrez passe par les deux mêmes fonctions. C'est littéralement tout le code — pas de crypto custom, pas de raccourcis :

# backend/app/core/security.py (extrait)
from cryptography.fernet import Fernet

def encrypt(value: str) -> str:
    return get_fernet().encrypt(value.encode()).decode()

def decrypt(value: str) -> str:
    return get_fernet().decrypt(value.encode()).decode()
Pourquoi ça compte
AES-128-CBC fournit la confidentialité ; le tag HMAC-SHA256 détecte la falsification. Modifiez un seul octet d'un chiffré stocké et le déchiffrement échoue bruyamment au lieu de produire silencieusement de la donnée corrompue. C'est du chiffrement authentifié — le standard moderne.
04

Où vit la clé maître

Séparation du secret et des données

Le chiffrement ne vaut que ce que vaut la gestion de clé. La clé maître — celle qui peut transformer un chiffré en votre mot de passe — est délibérément tenue loin des données qu'elle protège.

  • Injectée dans le processus serveur au démarrage depuis un magasin de secrets managé. Elle ne touche jamais la base applicative.
  • Jamais commitée dans git, jamais écrite dans les logs applicatifs, jamais retournée par un endpoint API.
  • Seuls le serveur FastAPI et le worker Celery la détiennent en mémoire, et seulement le temps de vie de ce processus.
  • Backups, replicas en lecture, et environnements de staging utilisent des données différentes et ne peuvent pas déchiffrer le chiffré de prod.
Conséquence pratique
Un attaquant qui vole un dump de la base — le scénario de fuite le plus courant — obtient des lignes de chiffré opaque. Il n'obtient pas votre mot de passe. Il n'obtient rien qu'il puisse soumettre à Odoo. Il obtient du bruit.
05

Comment les données circulent sur le réseau

Chiffrement en transit

Votre mot de passe fait exactement deux sauts quand vous enregistrez une connexion, et exactement un à chaque sync. Les deux sauts sont protégés par TLS avec des suites cipher modernes.

votre navigateurnotre API
HTTPS · TLS 1.2+
notre workervotre Odoo
HTTPS · TLS 1.2+

Nous n'acceptons jamais d'identifiants sur une connexion non chiffrée. Le mot de passe n'est déchiffré en mémoire que pour la durée d'un seul appel RPC à votre Odoo, puis effacé.

06

Qui peut lire vos identifiants

Frontières d'accès

L'ensemble des processus et des personnes qui peuvent déchiffrer un mot de passe stocké est délibérément minuscule.

  • Chemins applicatifs : exactement deux — l'endpoint de test de connexion et le worker de sync en arrière-plan. Les deux dans le repo. Les deux auditables.
  • Humains : aucun membre de l'équipe Vizualizer n'a un workflow routinier qui appelle decrypt(). L'accès direct à la base est audité et utilisé pour les migrations, pas pour inspecter les lignes.
  • Autres tenants : impossible. Chaque requête est scopée par user_id, contrôle côté serveur depuis le JWT, pas par le frontend.
Pas de bouton "voir mot de passe"
Nous n'avons intentionnellement pas construit d'UI ni de backdoor qui affiche un mot de passe stocké en clair. Ajouter ça nécessiterait de livrer du code — et vous le verriez dans l'historique de changements.
07

Lecture seule par conception

On regarde, jamais on n'écrit

Même avec des identifiants valides, notre code ne peut pas modifier votre Odoo. Le worker de sync n'appelle que des méthodes en lecture — search_read, read — sur les modèles facture, partenaire et produit.

  • Aucun appel write, unlink, ou create n'est jamais émis vers votre Odoo.
  • Pas d'automatisation, pas de déclencheurs de workflow, aucun effet de bord sur vos données métier.
  • Vous pouvez restreindre encore davantage en donnant à l'utilisateur Odoo de Vizualizer des groupes en lecture seule — ainsi même un bug ou une compromission de notre côté ne pourrait pas altérer vos données.
08

Modèle de menace — quand ça tourne mal

Scénarios réalistes, énoncés simplement

Les promesses de sécurité ne sont significatives que mesurées contre des menaces précises. Voici comment chaque scénario courant se déroule :

Scénario
Issue
Fuite de la base
L'attaquant n'obtient que du chiffré. La clé maître n'est pas dans la base. Les mots de passe ne peuvent pas être récupérés.
Fuite de logs ou APM
Les mots de passe ne sont jamais loggés, en clair ou autrement. Les requêtes contenant des identifiants sont filtrées avant d'atteindre les systèmes d'observabilité.
Employé malveillant
L'accès au magasin de secrets de prod est limité et audité. Aucune UI admin ne révèle le clair — y accéder demande de livrer du nouveau code, qui est revuable.
Man-in-the-middle
Tout le trafic utilise TLS 1.2+ avec des suites cipher modernes. La validation des certificats est stricte ; les connexions dégradées sont refusées.
Compromission de backup
Les backups contiennent le même chiffré. La clé maître est stockée séparément et n'est pas incluse dans les backups de base.
09

Quand vous supprimez une connexion

Droit à l'effacement

Cliquez sur le × à côté d'une connexion dans la sidebar et la ligne — y compris le mot de passe chiffré — est supprimée immédiatement de notre base.

  • La ligne est supprimée par un DELETE dur, pas un soft-delete.
  • Les sauvegardes quotidiennes expirent dans notre fenêtre de rétention ; après ça, aucune copie du chiffré ne subsiste.
  • Les données de factures synchronisées liées à cette connexion sont supprimées dans la même transaction.
Encore plus fort
Si vous changez le mot de passe dans Odoo après déconnexion, l'ancien chiffré — même s'il survivait par miracle — se déchiffrerait en un mot de passe qui n'ouvre plus aucune porte.
10

Questions, audits, divulgation

Parlez à un humain

Nous accueillons les revues de sécurité. Chercheur en sécurité, CISO en évaluation, ou client souhaitant mener son propre audit : nous travaillerons avec vous.

Signaler une vulnérabilité, demander des détails d'architecture ou solliciter une fenêtre de pentest : security@hazenfield.com