Sécurité

Ce qu'il advient de votre code.

Langage clair. Aucun flou marketing. Voici toute la chaîne, du dépôt à l'exécution.

Téléversement et compilation

Votre projet est empaqueté et inspecté dans le navigateur avant tout téléversement. Vous voyez le nombre de fichiers et le cadre détecté avant de cliquer sur Publier. Les déploiements anonymes sont plafonnés à 50 Mo; les déploiements connectés au plafond de votre forfait (Démarrage 50 Mo, De base 200 Mo, Pro 500 Mo).

Le téléversement transite par HTTPS vers api.canner.ca, où le ouvrier de compilation l'extrait dans un répertoire temporaire propre au déploiement. Les compilations s'exécutent sous l'utilisateur Linux du projet (canner-<slug>) dans une unité systemd transitoire avec ProtectSystem=strict, PrivateTmp=yes, RestrictNamespaces=yes et un plafond mémoire cgroup correspondant à votre forfait. La phase de recompilation (qui exécute les scripts postinstall des modules natifs autorisés) tourne avec PrivateNetwork=yes — espace de noms réseau neuf, uniquement l'interface de bouclage — afin que les scripts de cycle de vie ne puissent atteindre ni Internet, ni Postgres, ni Redis, ni l'API plateforme.

À la fin de la compilation, l'archive source et le répertoire temporaire sont supprimés. Seul le bundle compilé reste sur disque.

Isolation à l'exécution

Chaque projet tourne sous son propre utilisateur Linux et sa propre unité systemd (tenant@<slug>.service). Aucun locataire ne partage d'arbre de processus, d'UID, de répertoire personnel ou de chemin de système de fichiers inscriptible avec un autre. Un locataire qui se comporte mal ne peut pas lire les fichiers, l'environnement ou la base d'un autre — les règles iptables au niveau de l'hôte bloquent tout mouvement latéral vers l'API plateforme (4001), Postgres (5432) et Redis (6379) pour tout UID non-plateforme.

L'exécution démarre depuis un bundle immuable à /opt/canner/apps/<slug>/<deployment_id>. Les mises à jour échangent atomiquement un nouveau bundle; les retours en arrière relient en dur un bundle précédent. L'exécution n'écrit jamais dans son propre répertoire de bundle.

Sécurité de la base de données

Chaque projet qui a besoin de Postgres reçoit sa propre base avec ses propres identifiants. Les connexions transitent par PgBouncer; le rôle du locataire n'a aucun accès aux bases des autres locataires, aux catalogues système, ni aux fonctions de superutilisateur.

La chaîne de connexion est injectée au moment de la compilation via la variable d'environnement DATABASE_URL. Elle n'est jamais journalisée dans la sortie de compilation, jamais renvoyée aux clients, et stockée uniquement dans le fichier d'environnement du locataire (mode 0640, propriété root:canner-<slug>).

Variables d'environnement

Les variables que vous définissez dans le tableau de bord sont chiffrées au repos dans la base plateforme via pgcrypto. Elles sont déchiffrées uniquement au moment de la compilation et de l'exécution, injectées dans le bac à sable de compilation et le processus d'exécution, et ne sont jamais renvoyées en clair par l'API après leur écriture (le tableau de bord affiche des aperçus masqués).

Les variables marquées comme sensibles à la création sont en plus retirées des journaux de compilation — leurs valeurs sont recherchées et remplacées par [CACHÉ] avant l'écriture de toute ligne dans la colonne build_log. Le diffuseur de journaux du tableau de bord lit depuis build_log; le masquage est donc appliqué à l'écriture, pas à l'affichage.

Infrastructure

Canner s'exécute sur des VPS d'Hébergement Web Canada à Montréal, au Québec. Le pare-feu de l'hôte est iptables + fail2ban; seuls les ports 22 (SSH), 80 et 443 sont accessibles depuis l'internet public. SSH est par clé uniquement — l'authentification par mot de passe est désactivée — et la connexion racine est désactivée hormis un canal de récupération restreint par IP, conservé pour la reprise après sinistre.

Les mises à jour de sécurité automatiques s'exécutent chaque nuit via unattended-upgrades pour le dépôt sécurité de Debian. Les certificats TLS pour canner.ca, *.app.canner.ca et les domaines personnalisés des clients sont émis et renouvelés automatiquement par Caddy via Let's Encrypt — aucune rotation manuelle, aucune fenêtre de certificat expiré.

Les sauvegardes quotidiennes Postgres s'exécutent à 03h30 locales et sont répliquées hors-hôte via un script de récupération. Redis est authentifié; BullMQ est configuré noeviction pour que l'état de la file de compilation ne soit jamais perdu sous pression mémoire.

Divulgation responsable

Si vous trouvez un problème de sécurité, écrivez à security@canner.ca avec une description et les étapes de reproduction. Nous accusons réception dans les deux jours ouvrables et vous tenons informé jusqu'à la résolution.

Nous ne maintenons pas de programme de prime aux bogues rémunéré pour l'instant, mais le crédit (avec permission) est donné dans le journal des changements pour toute divulgation menant à un correctif.

En savoir plus sur la structure de Canner.

La sécurité couvre le quotidien. La souveraineté couvre la juridiction sous laquelle vos données reposent.