đ SĂ©curitĂ© â
La sĂ©curitĂ© repose sur plusieurs couches indĂ©pendantes : une requĂȘte doit franchir chacune dâelles avant dâatteindre un service, et aucune ne suffit seule. Cette page dĂ©crit leur conception ; les travaux en cours sont listĂ©s dans la feuille de route.
âïž Proxy Cloudflare â
Les sites minitrainstore.fr et guenola-sahut.fr passent par le proxy de Cloudflare, qui absorbe une partie du trafic indĂ©sirable avant quâil nâatteigne Bruxelles. Pour que ce filtre ne puisse pas ĂȘtre contournĂ©, Traefik refuse sur ces sites toute connexion qui ne vient pas des plages dâadresses publiĂ©es par Cloudflare. Les autres domaines pointent directement vers les serveurs.
đȘ Points dâentrĂ©e Traefik â
Chaque hĂŽte a un seul point dâentrĂ©e web, Traefik. Les protections communes sont attachĂ©es au point dâentrĂ©e HTTPS lui-mĂȘme, et non route par route : un nouveau service les reçoit sans configuration, quâil soit dĂ©clarĂ© par Ă©tiquettes Docker ou dans les fichiers de routes.
- HTTPS partout : HTTP redirige vers HTTPS. TLS 1.2 au minimum, avec uniquement des suites à échange de clés éphémÚre (ECDHE) et chiffrement authentifié (AES-GCM, ChaCha20). Un nom inconnu ne reçoit aucun certificat par défaut.
- En-tĂȘtes de sĂ©curitĂ© : HSTS sur chaque site HTTPS, et interdiction de deviner le type des contenus (
nosniff). HSTS nâest pas Ă©tendu aux sous-domaines : il forcerait HTTPS sur des appareils du rĂ©seau local qui ne parlent que HTTP. - En-tĂȘtes falsifiĂ©s : les variantes dâen-tĂȘtes de transfert Ă©crites avec des tirets bas sont supprimĂ©es, pour quâun client ne puisse pas se faire passer pour une autre adresse.
đ§± CrowdSec â
CrowdSec lit le journal dâaccĂšs de Traefik, dĂ©tecte les comportements hostiles (balayages, tentatives de connexion en force, recherche de vulnĂ©rabilitĂ©s connues) et bannit les adresses en cause. Il reçoit aussi la liste de blocage communautaire de CrowdSec. Un module de Traefik (bouncer) consulte ces dĂ©cisions et refuse les adresses bannies avant toute autre Ă©tape, sur toutes les routes, privĂ©es comprises.
- Le réseau local et le VPN ne sont jamais bannis : ils sont exclus des décisions de CrowdSec, et le module les laisse toujours passer.
- DerriĂšre Cloudflare, câest lâadresse rĂ©elle du visiteur qui est vĂ©rifiĂ©e, pas celle de Cloudflare.
- LâAPI de CrowdSec nâest joignable que par Traefik, sur un rĂ©seau Docker rĂ©servĂ© ; CrowdSec lit les journaux par une vue en lecture seule de lâAPI Docker, limitĂ©e Ă la liste des conteneurs et Ă leurs journaux.
CrowdSec est fusionné dans le dépÎt pour Luxembourg, à déployer ; Bruxelles suivra (voir la feuille de route).
đ Services privĂ©s â
Les services privĂ©s nâacceptent que les connexions venant du rĂ©seau local ou du VPN NetBird, grĂące Ă une liste dâaccĂšs appliquĂ©e par Traefik. Elle vĂ©rifie lâadresse de la connexion elle-mĂȘme, et non les en-tĂȘtes transmis : faire confiance aux en-tĂȘtes de Cloudflare, pour transmettre lâadresse du visiteur aux applications, ne lâĂ©largit pas. Leur nom DNS pointe en plus vers une adresse du rĂ©seau local. Les outils dâadministration en font partie : consoles des serveurs et des conteneurs, tableau de bord de Traefik, supervision, dĂ©ploiement, coffre de signature de Xila.
â±ïž Limitation des connexions â
Sur les services publics, les formulaires de connexion sont limitĂ©s par adresse cliente : au-delĂ dâun certain nombre de tentatives, Traefik rĂ©pond 429 Too Many Requests. Seuls les envois de formulaires de connexion sont comptĂ©s, si bien que la synchronisation des applications (Nextcloud, Jellyfin, Home Assistant, BitwardenâŠ) nâest pas ralentie ; les limites propres Ă chaque application sâajoutent Ă celle-ci. Sont concernĂ©s : Zitadel, Vaultwarden, Nextcloud, Jellyfin, Home Assistant, Tolgee et NetBird. Cette limitation est fusionnĂ©e dans le dĂ©pĂŽt, Ă dĂ©ployer.
đȘȘ Authentification unique â
Zitadel centralise lâidentitĂ© des utilisateurs. Les services raccordĂ©s dĂ©lĂšguent la connexion Ă Zitadel en OpenID Connect, avec PKCE par dĂ©faut, et les droits dans chaque service dĂ©coulent des rĂŽles attribuĂ©s dans Zitadel. Les applications OIDC sont dĂ©clarĂ©es dans le dĂ©pĂŽt et créées par OpenTofu (voir Architecture).
đ AccĂšs SSH â
- Compte dâautomatisation dĂ©diĂ© : Ansible se connecte avec un compte rĂ©servĂ©, distinct des comptes personnels, par clĂ© SSH uniquement. Son mot de passe est verrouillĂ© ; il dispose de
sudosans mot de passe pour les dĂ©ploiements. - ClĂ©s restreintes : chaque clĂ© autorisĂ©e sur ce compte nâest acceptĂ©e que depuis les rĂ©seaux privĂ©s de lâinfrastructure, et aucune autre clĂ© nâest conservĂ©e. Le playbook qui le configure refuse de sâexĂ©cuter depuis une connexion qui ne viendrait pas de ces rĂ©seaux, pour ne jamais se couper lâaccĂšs.
sshddurci : pas dâauthentification par mot de passe, pas de connexionroot, et seuls le compte dâautomatisation et une courte liste de comptes nommĂ©s peuvent se connecter.- Un compte par usage : les machines qui doivent se joindre ont leur propre compte et leur propre clĂ©, jamais le compte dâautomatisation. Par exemple, pour la rĂ©plication, chaque client ne peut lancer, par une commande forcĂ©e, que sa propre tĂąche de rĂ©plication sur Bruxelles ; la clĂ© dâAPI de TrueNAS ne quitte jamais Bruxelles.
- TrueNAS : ses utilisateurs et son serveur SSH se rĂšglent dans son interface. Ansible nây change rien mais vĂ©rifie les rĂ©glages (clĂ©s et restrictions, connexion par mot de passe dĂ©sactivĂ©e) et indique les corrections Ă faire.
đïž Secrets â
- Hors du dĂ©pĂŽt public : mots de passe, jetons et clĂ©s dâAPI sont dans un sous-module Git privĂ©, chiffrĂ©s avec Ansible Vault.
- Mot de passe du coffre : il reste dans le trousseau du systÚme (Secret Service, Keychain ou Credential Locker). Il est demandé une fois par machine, puis lu par Ansible au besoin.
- Sur les serveurs : chaque secret nâest Ă©crit que dans le fichier
.envdu service qui lâutilise, lisible par son seul propriĂ©taire, et les tĂąches qui les manipulent nâaffichent rien dans les journaux de dĂ©ploiement. - Ătat dâOpenTofu : il contient les identifiants des applications Zitadel ; il est chiffrĂ©, et OpenTofu refuse de lâĂ©crire en clair.
- IntĂ©gration continue : elle nâa aucun secret et analyse les playbooks avec des fichiers de coffre vides.
- Modification : un secret change dâabord dans le dĂ©pĂŽt privĂ©, puis le dĂ©pĂŽt public met Ă jour la rĂ©fĂ©rence du sous-module.
đ§© Cloisonnement des rĂ©seaux â
- Bases de donnĂ©es : les bases des services dĂ©ployĂ©s par Ansible sont sur des rĂ©seaux Docker internes, sans route vers Internet ; celles que lâoutil de sauvegarde des bases doit joindre partagent en plus un rĂ©seau avec lui. Un rĂ©seau par base de donnĂ©es, pour que les bases ne se voient plus entre elles, est prĂ©vu.
- RĂ©seaux rĂ©servĂ©s : CrowdSec et Traefik partagent un rĂ©seau qui leur est propre ; la supervision lit les mĂ©triques de Traefik sur un point dâentrĂ©e qui nâest jamais publiĂ©.
- Ports publiĂ©s : Docker publie les ports en contournant le pare-feu de lâhĂŽte. Seul Traefik publie les ports web ; tout autre service passe par lui, et le dĂ©ploiement de Traefik le vĂ©rifie.
- RĂ©seaux proxy par application (prĂ©vu) : chaque application aura son propre petit rĂ©seau partagĂ© uniquement avec Traefik, pour quâune application compromise ne puisse pas joindre les autres. La cible et son plan dâadressage sont dĂ©crits dans la page RĂ©seau.
- Conteneurs : Traefik et CrowdSec tournent sans possibilitĂ© dâĂ©lĂ©vation de privilĂšges (
no-new-privileges), et les journaux de tous les conteneurs sont plafonnés pour ne pas remplir les disques.
đ Mises Ă jour â
Toutes les images sont figĂ©es sur une version exacte et mises Ă jour chaque semaine par Dependabot, aprĂšs vĂ©rification par lâintĂ©gration continue (voir DĂ©ploiement). Les paquets de Luxembourg et de Pristina sont mis Ă jour par des playbooks dĂ©diĂ©s.