Sécurité

Comment nous protégeons les fichiers de vos patients

Résumé en langage clair des contrôles en production.

Chiffrement au repos

Chaque fichier téléversé est chiffré au repos avec AES-256-GCM au moyen du chiffrement côté serveur fourni par AWS Key Management Service (SSE-KMS). La clé de chiffrement est une CMK gérée par le client dans notre compte AWS, pas une clé partagée gérée par AWS. Chaque objet S3 reçoit une clé de chiffrement de données unique dérivée de la CMK par les S3 Bucket Keys, de sorte que la compromission d'une DEK ne touche qu'un seul transfert.

La politique du bucket refuse tout téléversement qui ne présente pas l'en-tête SSE-KMS correct pour notre CMK, et refuse tout appel à l'API S3 effectué en HTTP clair. Le chiffrement n'est pas facultatif et n'est pas appliqué uniquement côté client — trois couches indépendantes empêchent le texte clair d'atterrir.

Chiffrement en transit

Le trafic vers et depuis HUUMEDI est chiffré avec TLS 1.2 ou une version ultérieure; les navigateurs modernes négocient TLS 1.3. La politique Strict Transport Security est appliquée avec un max-age de 2 ans, includeSubDomains et preload. Les navigateurs refusent toute rétrogradation vers HTTP clair pour le domaine.

Vérification du destinataire en deux étapes

La possession du lien de téléchargement du destinataire ne suffit pas pour accéder à un fichier. Lorsqu'un destinataire ouvre le lien, il doit demander un code numérique à usage unique, livré à l'adresse courriel du destinataire et valide pendant dix minutes. La plateforme permet au plus cinq tentatives de vérification par code; ensuite, un nouveau code doit être demandé.

Suppression automatique

L'application supprime l'objet S3 dès que le flux de téléchargement du destinataire est terminé. Si un fichier n'est jamais récupéré, ou si une suppression échoue, un balayage horaire l'élimine peu après l'expiration du lien de 24 heures et consigne la suppression dans la piste de vérification. Sous ces deux mécanismes, une règle de cycle de vie S3 fait expirer chaque objet au niveau du stockage, indépendamment de l'application; Amazon arrondit cette expiration à minuit UTC suivant, de sorte qu'elle prend effet de 24 à 48 heures après le téléversement. La première couche est immédiate, la deuxième est bornée et vérifiable, et la troisième tient même si l'application est complètement hors service.

Piste de vérification

Les événements du cycle de vie des transferts sont consignés dans une piste de vérification : création du transfert, fin du téléversement, envoi du lien de téléchargement, demande de code, vérification du code, échec de code, téléchargement du fichier, suppression du fichier et annulation du transfert. Chaque ligne consigne l'acteur, l'adresse IP, la chaîne d'agent utilisateur et un horodatage. Les tentatives d'accès rejetées avant l'authentification — lien expiré, transfert annulé — ne sont pas consignées actuellement. Les événements d'authentification sont enregistrés séparément et ne font pas partie de cette piste. Conservée 7 ans conformément au principe de responsabilité de la LPRPDE, en mode ajout seul appliqué au niveau de la base de données.

Résidence des données

Le contenu des fichiers est stocké dans AWS ca-central-1 (Montréal). Les renseignements de compte, les dossiers de transfert et les journaux de vérification sont stockés dans Supabase, également dans ca-central-1. Le calcul applicatif s'exécute à Montréal. Nous ne stockons ni ne répliquons de renseignements personnels hors du Canada. Nos fournisseurs de courriel et de paiement traitent des renseignements personnels limités à l'étranger; voir la liste des sous-traitants.

Six sous-traitants, avec le pays d'établissement de l'entreprise et l'endroit où résident les données qu'elle traite — ce n'est pas toujours le même :

  • Amazon Web Services Canada, Inc. (stockage + gestion des clés) — contenu chiffré des fichiers et clé de chiffrement gérée par le client. Société canadienne; données dans ca-central-1
  • Supabase (base de données) — renseignements de compte, dossiers de transfert incluant les noms de patients, et piste de vérification. Pays d'établissement ambigu : ses conditions nomment une entité singapourienne, sa politique de confidentialité une entité américaine; données dans ca-central-1
  • Vercel (calcul applicatif) — en transit, tout ce que traite l'application, y compris les noms de patients et le contenu des fichiers pendant la diffusion d'un téléchargement. Société américaine; calcul à Montréal
  • Upstash (limitation du débit) — adresses IP, et adresses courriel lors des demandes de réinitialisation de mot de passe. Société américaine; données au Canada
  • Resend (courriel transactionnel) — adresses courriel de l'expéditeur et du destinataire, nom du compte, codes à usage unique et liens à jeton unique. Jamais le contenu des fichiers, les noms de fichiers, la taille des fichiers ni les noms de patients. Société américaine; données à l'étranger
  • Stripe (facturation) — détails de paiement et courriel du compte. Société américaine; données à l'étranger

Identité et accès

Les mots de passe sont hachés avec argon2id (mémoire 19 Mio, deux itérations, un seul fil — référence OWASP 2024). La vérification du courriel est requise avant que le tableau de bord ne soit débloqué. La réinitialisation du mot de passe utilise des jetons à usage unique avec une expiration d'une heure.

L'accès AWS du backend se fait au moyen d'un principal IAM à privilèges minimaux limité à un seul bucket et à une seule clé KMS. La politique IAM n'accorde aucun joker, aucune ressource « * », aucune action d'administration. La feuille de route prévoit la migration vers une assumption de rôle basée sur OIDC depuis Vercel afin qu'aucune clé d'accès à long terme n'existe.

Durcissement de l'application

  • Une politique de sécurité du contenu (CSP) restreint les origines de scripts, les soumissions de formulaires en ligne et les cibles de connexion (les connexions sortantes sont limitées à notre propre origine et à *.s3.ca-central-1.amazonaws.com)
  • frame-ancestors « none » + X-Frame-Options DENY — HUUMEDI n'est jamais intégrable
  • Anti-énumération sur les points d'entrée d'authentification (mot de passe oublié retourne la même réponse pour les courriels connus et inconnus; la connexion exécute une vérification de hachage factice pour les comptes inexistants afin d'égaliser le temps)
  • Limites de débit par transfert sur les demandes de codes de téléchargement (5 par transfert par heure)
  • Toutes les entrées validées côté serveur, y compris la liste blanche de types MIME (DICOM, PDF, JPEG, PNG, ZIP, STL, PLY) et le plafond de 5 Go par fichier

Posture de conformité

HUUMEDI est conçu spécifiquement pour l'environnement réglementaire canadien.

  • LPRPDE — référence fédérale pour la gestion des renseignements personnels
  • Loi 25 du Québec — exigences supplémentaires en matière de consentement, d'avis d'atteinte à la confidentialité et de responsable de la protection des renseignements personnels pour les transferts impliquant des résidents du Québec
  • Lois provinciales sur les renseignements en matière de santé (PHIPA en Ontario, HIA en Alberta, etc.) — applicables à la clinique dentaire en tant que dépositaire; HUUMEDI fournit les mesures de protection techniques nécessaires pour soutenir la conformité de la clinique

Nous ne sommes pas réglementés par HIPAA (nous exerçons au Canada, pas aux États-Unis) et n'offrons pas d'entente d'associé commercial (BAA).

Divulgation responsable

Si vous croyez avoir trouvé une vulnérabilité de sécurité, écrivez à security@huumedi.com avec les détails et les étapes de reproduction. Nous nous engageons à accuser réception des rapports dans les 48 heures et à travailler de bonne foi avec les chercheurs agissant de bonne foi — nous n'engagerons pas de poursuites contre des recherches qui :

  • N'accèdent pas, ne modifient pas et ne détruisent pas les données d'autres utilisateurs
  • Ne dégradent pas le service pour les autres utilisateurs
  • Ne divulguent pas publiquement le problème avant que nous ayons eu une occasion raisonnable d'y remédier

Réponse aux incidents

En cas d'incident de confidentialité touchant des renseignements personnels, nous allons :

  1. Contenir l'incident et préserver les preuves
  2. Aviser les personnes concernées et l'autorité de surveillance applicable (CPVP en vertu de la LPRPDE; CAI en vertu de la Loi 25) aussitôt que possible après avoir déterminé un risque réel de préjudice sérieux
  3. Effectuer un examen post-incident et publier un résumé caviardé