Lisez d’abord la dernière section si vous évaluez Calcutab. Elle dit ce que nous n’avons pas : la partie qu’un fournisseur vous fait habituellement chercher.
Cette page est écrite pour la personne qui doit nous valider. Elle décrit ce qui est réellement construit, pas ce qui est prévu.
Ce qui compte vraiment : vos données ne peuvent atteindre aucun autre client
Chaque enregistrement porte l’espace de travail auquel il appartient, et chaque requête y est limitée. C’est la réponse ordinaire, et à elle seule elle ne vaut que ce que vaut le développeur qui a écrit la dernière requête.
La base de données l’impose donc également. Les saisies de temps, les taux, les identifiants Jira et les clôtures référencent leur parent par une clé étrangère composite (id, espace de travail). Postgres lui-même rejette une ligne qui pointe vers l’espace d’un autre client : non pas une clause WHERE qu’on peut oublier, mais une contrainte qui rend l’erreur impossible à enregistrer.
Trois des contrôles automatisés ci-dessous existent pour le prouver, en essayant.
Accès, et argent
Quatre niveaux : exploitant de la plateforme, propriétaire de l’espace, responsable, membre. Chaque page et chaque action vérifie côté serveur. Masquer une entrée de menu n’est pas un contrôle d’accès, et nous ne le traitons pas comme tel : les contrôles s’exécutent même quand le lien n’a jamais été affiché.
L’argent est omis, pas masqué. Un membre ne voit aucun coût, pas même son propre taux. Les chiffres ne sont pas envoyés à son navigateur, il n’y a donc rien à trouver dans le source de la page.
Identifiants et secrets
| Quoi | Comment c’est conservé |
|---|---|
| Jetons d’API Jira, jetons Slack | AES-256-GCM, chiffrés avant d’atteindre la base, versionnés pour permettre la rotation des clés. Jamais restitués au-delà des quatre derniers caractères, jamais journalisés, jamais écrits dans une ligne de journal |
| Mots de passe, là où un espace en utilise | scrypt salé, avec le coût conservé à côté de chaque empreinte pour pouvoir l’augmenter. Jamais récupérables, ni par nous ni par quiconque |
| Liens d’invitation et de réinitialisation | Seul le SHA-256 du jeton est conservé. Une base dérobée n’en complète aucun |
| La clé de chiffrement elle-même | Google Secret Manager, jamais dans le dépôt |
La plupart des espaces n’ont aucun mot de passe : la connexion passe par Google ou Atlassian, les règles de double authentification et de départ de leur fournisseur s’appliquent donc, et nous n’avons rien à perdre.
En transit, et dans le navigateur
Tout le trafic est en TLS. Les cookies de session sont Secure, HttpOnly, SameSite=Lax.
Chaque page porte une Content-Security-Policy construite par requête, avec un nonce neuf ; les scripts sont autorisés par nonce plutôt que par unsafe-inline. frame-ancestors vaut none, l’application ne peut donc pas être mise dans un cadre.
Ce qui est enregistré
Un journal en ajout seul : changements de taux, changements d’appartenance, paramètres, clôtures de période, et toute feuille de temps modifiée pour le compte d’autrui, avec qui, quoi, de quoi à quoi, et quand. Exportable en CSV.
Les taux ne sont jamais modifiés. Un changement insère une ligne avec une nouvelle date de début, de sorte qu’un rapport sorti l’an dernier produit toujours le chiffre de l’an dernier.
Abus
Les écritures et les tentatives de connexion sont limitées en débit. Huit échecs consécutifs de mot de passe ferment un compte pendant quinze minutes, pour les mots de passe seulement, car verrouiller les chemins Google et Atlassian permettrait à n’importe qui de priver un collègue d’accès en devinant son adresse.
Où sont vos données
Google Cloud Run en europe-west1 (Belgique) ; PostgreSQL chez Neon sur AWS eu-central-1 (Francfort). Les sauvegardes restent dans l’UE. La liste complète des sous-traitants figure dans le [DPA](/legal/dpa), section 7 : c’est la liste entière, et la modifier modifie ce document.
Vérifié avant chaque mise en production
Quatorze contrôles automatisés s’exécutent contre un déploiement réel, pas une simulation, et couvrent :
- un responsable qui atteint les appartenances, projets, rapports et exports CSV d’un autre espace de travail
- un membre qui atteint la grille de taux, l’export du journal ou la page de l’exploitant
- une session signée avec la mauvaise clé
- l’accès non authentifié à des pages qui en exigent une
- les traces d’exécution, les détails de déploiement et les en-têtes de politique
Le script refuse de s’exécuter tant qu’une session émise n’est pas d’abord acceptée : une version antérieure rapportait onze succès contre ce qui s’est avéré être des réponses de redirection vides, et c’est le genre de résultat qui est pire que pas de résultat du tout.
À côté de cela : 936 tests unitaires, 233 tests de bout en bout contre un vrai navigateur et une vraie base, et 216 tests d’intégration.
Si quelque chose tourne mal
Un processus d’incident écrit précise qui est prévenu, dans quel ordre et dans quel délai. Les alertes de santé et d’erreur atteignent l’exploitant si le service ou sa base devient injoignable depuis deux régions.
Signalez une vulnérabilité à support@calcutab.com. Nous accusons réception sous un jour ouvré. Nous n’offrons pas de prime aujourd’hui.
Ce que nous n’avons pas
Dit ici plutôt que laissé à votre découverte :
- Aucun test d’intrusion indépendant. Les contrôles ci-dessus sont les nôtres. Un test par un tiers sera commandé quand un client aura besoin du rapport ; nous ne prétendrons pas qu’il existe déjà.
- Ni SOC 2 ni ISO 27001. Aucun des deux n’est en cours. Chacun représente une année de travail et un coût à cinq chiffres, et nous préférons le dire plutôt que de laisser entendre autre chose.
- Aucune astreinte. L’alerte atteint une seule personne. En dehors des heures ouvrées, le rétablissement dépend de cette personne.
- Aucun engagement contractuel de disponibilité ni de délai de rétablissement. Les conditions le disent aussi.
- Pas de clés de chiffrement gérées par le client, pas de SAML, pas de SCIM. Un OIDC par espace de travail est faisable et non construit ; SAML demanderait un intermédiaire. Aucun des deux n’existe aujourd’hui.
- Les documents juridiques n’ont pas été revus par un conseil externe. Ils sont publiés en version 1.0 et décrivent ce que le logiciel fait réellement ; leur suffisance juridique dans votre pays n’est pas quelque chose que nous avons fait vérifier.
Si l’un de ces points est rédhibitoire pour vous, dites-le : il vaut mieux le savoir avant l’achat qu’après.