Skip to content

🔒 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 sudo sans 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.
  • sshd durci : pas d’authentification par mot de passe, pas de connexion root, 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 .env du 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.