Cette page indique ce que font l'agent et le service, ce qu'ils ne font pas, où vivent les données et combien de temps elles sont conservées. Elle indique aussi ce qui n'est pas revendiqué. Lorsqu'un élément est conçu mais pas encore en service, elle le dit.
Ce que fait l'agent
L'agent est le petit programme installé sur chaque ordinateur relié à des imprimantes. C'est la seule partie de SpoolStream qui s'exécute dans votre réseau.
- L'agent ne fait que des connexions sortantes, en HTTPS sur le port 443. Un site n'ouvre aucun port entrant et ne modifie aucune règle entrante de son pare-feu.
- L'agent n'ouvre aucun port d'écoute. Il interroge le service en attente prolongée, réclame une tâche et en rend compte.
- L'agent de chaque ordinateur possède sa propre clé d'identité, générée à l'inscription de l'ordinateur. La clé privée ne quitte jamais l'ordinateur, et un justificatif d'identité volé ne permet à lui seul aucun renouvellement.
- Sous Windows, le justificatif et la clé de l'agent sont stockés chiffrés avec DPAPI, dans un dossier réservé aux administrateurs et au service.
- Un document de plus de 5 Mo va directement de votre système au stockage des documents par un lien signé de courte durée, un document plus petit voyage dans la requête à l'API, et l'agent ne reçoit un nouveau lien valide cinq minutes qu'au moment d'imprimer.
- Un PDF est traité comme une entrée non fiable : il est rendu dans un processus enfant à usage unique, avec des limites de taille, de pages et de durée, de sorte qu'un fichier malveillant met fin au processus enfant et non à l'agent.
- L'agent tient un registre local durable et une file de statuts sortants, de sorte que les tâches acceptées s'impriment malgré une coupure du réseau et sont déclarées ensuite.
- L'agent communique au service le nom de l'ordinateur, son système d'exploitation et son architecture, la version de l'agent, et les imprimantes qu'il peut atteindre (nom de la file, serveur d'impression et pilote).
- L'agent Windows se met à jour de lui-même : une tâche planifiée prend la version, son empreinte et sa taille auprès du service, installe une version finale strictement plus récente quand l'agent est inactif, et remet la version précédente si la nouvelle ne démarre pas. L'installateur peut le désactiver, et le service peut refuser un agent plus ancien qu'une version minimale.
Ce que l'agent ne fait pas
- Il n'accepte aucune connexion venant d'Internet : L'agent n'ouvre aucun port d'écoute. Il interroge le service en attente prolongée, réclame une tâche et en rend compte.
- Il n'imprime pas vers un chemin réseau reçu dans une tâche. L'agent n'imprime que sur les files qu'il a lui-même déclarées : une tâche est dirigée vers l'une de ces imprimantes, jamais vers un chemin réseau libre.
- Il ne décide pas de lui-même de réimprimer une tâche incertaine. Lorsque personne ne peut savoir si une page a été imprimée, la tâche est marquée incertaine et le système ne l'imprime jamais de nouveau de lui-même. Une personne vérifie l'imprimante et décide.
Séparation entre les clients
Chaque table qui contient les données d'un client porte l'identifiant de l'organisation, un filtre dans l'application et la sécurité au niveau des lignes (row-level security) de PostgreSQL. Nos tests d'intégration prouvent que l'organisation B ne peut ni lire ni modifier les données de l'organisation A, et reçoit 404, non 403.
Une clé d'API appartient à une seule organisation. Une clé de test ne voit et n'agit que sur les tâches de test et sur l'imprimante virtuelle.
Aucun test indépendant de cette séparation n'a été publié. Aucun audit de sécurité indépendant n'a été publié. Un audit est prévu pour le lancement en production du service hébergé.
Connexion, clés et piste d'audit
- Le tableau de bord authentifie les personnes par courriel et mot de passe avec un code à usage unique, par Google ou par Microsoft Entra ID, et une organisation peut exiger sa propre authentification unique. Les rôles sont propriétaire (owner), administrateur (admin), opérateur (operator) et lecteur (viewer).
- Après 5 tentatives de connexion échouées, un compte est verrouillé pendant 15 minutes, et les codes à usage unique comptent dans la même limite. Une organisation ne peut pas encore exiger de ses membres un second facteur.
- Une session du tableau de bord prend fin après 8 heures sans activité, et après 7 jours au plus.
- Les clés d'API et les justificatifs des agents ne sont stockés que sous forme de hachage à clé (HMAC-SHA256 sous un « poivre » secret). Une clé perdue est remplacée, jamais récupérée.
- Les secrets de second facteur, les codes de récupération et les secrets de signature des webhooks sont stockés chiffrés (AES-256-GCM) sous une clé conservée dans le magasin de secrets, et non dans la base de données. Les mots de passe ne sont stockés que sous forme de hachage produit par ASP.NET Core Identity.
- Les actions d'administration et les connexions sont inscrites dans une piste d'audit en ajout seulement, que la base de données refuse de modifier ou de supprimer, sauf pour le retrait planifié des lignes plus anciennes que la durée de conservation.
- Chaque entrée d'audit indique qui a agi (une personne, une clé d'API ou un agent), ce qui a été fait, quand, ainsi que l'adresse réseau et le nom du navigateur ou du client de l'appelant; elle n'enregistre jamais un mot de passe, un jeton ni un document.
- Les webhooks ne sont envoyés qu'à des adresses HTTPS publiques, par un client qui refuse les adresses de réseaux internes et privés.
- Notre règle veut que le contenu des documents, les noms de fichiers et les références externes n'apparaissent jamais dans les journaux, les traces, les exceptions, les diagnostics, les journaux de livraison des webhooks ni la piste d'audit.
Accès de notre personnel
- Le service n'a ni console d'exploitation, ni écran d'administrateur de la plateforme, ni moyen pour son personnel de se connecter à la place d'un client.
- Les tâches d'exploitation (attribuer un forfait, relier un client de facturation) sont des commandes ponctuelles exécutées avec l'identifiant du propriétaire de la base de données, que la sécurité au niveau des lignes ne restreint pas; chaque modification qu'elles apportent est inscrite dans la piste d'audit de l'organisation.
Où vivent les données
Le service hébergé fonctionne à Toronto chez DigitalOcean (App Platform pour l'application, PostgreSQL géré pour la base de données), avec Cloudflare pour son nom de domaine et Cloudflare R2 pour les documents. Les paiements par Stripe et la surveillance sur Grafana Cloud sont prévus et ne sont pas activés.
L'application et la base de données fonctionnent à Toronto, au Canada. La région du stockage des documents n'est pas choisie : le stockage (Cloudflare R2) ne garantit pas que les documents restent au Canada.
Dans l'hébergement conçu, Cloudflare achemine tout le trafic vers le service et met fin au chiffrement TLS; il peut donc lire le trafic de l'API, les témoins et les liens signés vers les documents; les documents eux-mêmes sont stockés dans Cloudflare R2.
Dans l'hébergement conçu, Cloudflare joint l'application en TLS strict, l'application joint la base de données en TLS en vérifiant le certificat et le nom du serveur, et le courriel part par SMTP avec TLS.
Les fournisseurs, ce que chacun reçoit et où, figurent à la page des sous-traitants.
Ce qui est stocké, et pour combien de temps
- Documents. Par défaut, un document est supprimé du stockage 24 heures après la fin de sa tâche, et 168 heures (7 jours) après l'échec d'une tâche, et jamais tant que la tâche est en cours ou incertaine. Ces deux durées sont fixées pour chaque organisation par l'exploitant du service, jusqu'à un an (8760 heures); une organisation ne peut pas encore les modifier elle-même.
- L'historique d'une tâche. La fiche d'une tâche et son historique survivent au document et sont conservés tant que l'organisation existe; aucune durée de conservation distincte ne s'y applique encore.
- Rapports de preuve. Les rapports de preuve ne sont pas stockés : chacun est calculé à partir de l'historique enregistré de la tâche au moment où il est demandé, et il existe donc aussi longtemps que cet historique.
- La piste d'audit. La piste d'audit d'une organisation est conservée 7 ans par défaut (son propriétaire peut choisir de 1 à 25 ans). Les événements de sécurité qui n'appartiennent à aucune organisation sont conservés un an.
- Enregistrements de livraison des webhooks. Les enregistrements de livraison des webhooks sont supprimés 30 jours après la fin de la livraison.
- Statistiques quotidiennes et registre d'utilisation. Les statistiques quotidiennes des tâches de chaque organisation (nombres par état et par imprimante, aucun document) sont conservées 25 mois; le registre d'utilisation est conservé jusqu'à l'effacement de l'organisation.
- Une inscription jamais vérifiée. Une inscription jamais vérifiée est supprimée après 24 heures.
- Un membre retiré. Le retrait d'un membre supprime le compte de cette personne, ses méthodes de connexion et son second facteur; les tâches qu'elle a envoyées restent à l'organisation et la piste d'audit conserve l'identifiant du compte.
- Une organisation. La suppression d'une organisation efface tout, y compris les tâches et leur historique, 30 jours après la demande du propriétaire; le propriétaire peut la restaurer pendant ces 30 jours. Une seule chose est conservée : si l'organisation était facturée par Stripe, son numéro de client Stripe, avec la date de l'effacement et rien d'autre du client dans notre base de données, afin qu'un message tardif de Stripe soit reconnu et ignoré. Lorsque l'effacement est effectué, les abonnements de l'organisation chez Stripe sont résiliés, de sorte que Stripe cesse de la facturer; ce numéro n'est plus jamais relié à une organisation. Seul un propriétaire peut supprimer une organisation, après s'être authentifié de nouveau et avoir saisi le nom de l'organisation; les autres membres sont déconnectés immédiatement, les propriétaires reçoivent un rappel 7 jours et 1 jour avant l'effacement, et une exportation de la piste d'audit (CSV et JSON, avec un manifeste et des empreintes SHA-256) est préparée pour qu'ils la téléchargent d'ici là.
- Après un effacement. Après un effacement, SpoolStream conserve pendant un an un événement de sécurité qui nomme l'organisation effacée. Le lien vers la fiche client de l'organisation chez Stripe est supprimé avec l'organisation; seul le numéro de client Stripe est conservé, avec la date de l'effacement, tandis que Stripe conserve sa propre fiche.
Sauvegardes et incidents
Les sauvegardes sont conçues et leurs chiffres sont des propositions pas encore acceptées : la base de données peut être restaurée à un moment donné et est copiée dans une sauvegarde chiffrée conservée 35 jours dans un autre compte et une autre région; les documents ne sont volontairement pas sauvegardés. La procédure de restauration est conçue pour effacer de nouveau, avant la réouverture du service, chaque organisation effacée après la prise de la sauvegarde.
Surveillance
La surveillance du service (métriques, traces et journaux) est prévue sur Grafana Cloud et n'est pas encore en place. Ses métriques ne portent jamais sur une personne ou une organisation, et ses journaux sont expurgés.
Ce qui n'est pas revendiqué
- SpoolStream ne détient aucune certification de sécurité ou de conformité, et ce site n'en revendique aucune.
- « imprimé » (printed) signifie que le système d'exploitation a déclaré l'impression terminée. Ce n'est pas la preuve qu'une feuille est sortie.
- Chaque tâche conserve un historique en ajout seulement, et un rapport de preuve scellé peut être téléchargé pour elle. Le sceau révèle toute altération; ce n'est pas une signature électronique qualifiée.
Signaler un problème
Écrivez à [email protected] en indiquant ce que vous avez trouvé et comment le reproduire. Veuillez ne pas faire de tests sur une organisation qui n'est pas la vôtre; les règles figurent dans la politique d'utilisation acceptable. Ce site ne promet aucun délai de réponse.