Aller au contenu

Durcissement du déploiement

Les exemples Compose exigent FORWARDED_ALLOW_IPS : renseigner l’adresse de Traefik sur le réseau Docker (ou un sous-réseau réservé aux proxies de confiance), jamais *. Ne pas publier directement le port de l’application. Une valeur loopback ne convient pas à un Traefik situé dans un autre conteneur. Vérifier l’adresse effectivement vue par Uvicorn après chaque changement de réseau.

Dans la configuration statique de Traefik, sur l’entrypoint HTTPS :

entryPoints:
  https:
    address: ':443'
    forwardedHeaders:
      insecure: false
      # Seulement si un CDN / proxy précède Traefik : ses plages IP réelles.
      trustedIPs: []

Sans proxy amont, laisser cette liste vide. Avec un CDN, maintenir les plages du fournisseur et empêcher l’accès direct à l’origine si nécessaire. Tester avec un X-Forwarded-For fourni par un client non approuvé : il ne doit pas choisir l’IP utilisée par le limiteur. Un test ASGI seul ne valide pas la chaîne réelle.

L’override Traefik active HSTS pour un an sur l’hôte de l’application et une Permissions-Policy. Il n’impose ni includeSubDomains ni preload aux autres services. L’application ajoute une CSP interdisant les scripts inline et l’évaluation dynamique. Les styles inline restent autorisés pour les cartes et les mises en page. Cette politique limite les origines, objets, formulaires et cadres. Tous les scripts exécutables et gestionnaires HTML ont été déplacés vers des fichiers locaux. Leaflet 1.9.4 est embarqué dans static/vendor/leaflet-1.9.4 avec sa licence et ses images ; ses empreintes SRI sont vérifiées à partir de la publication officielle : https://leafletjs.com/download.html. Aucun code tiers n’est téléchargé pour la carte.

La connexion limite les échecs par IP (30/minute) et identifiant normalisé (10/minute), persistés en PostgreSQL. Les connexions réussies ne sont pas ajoutées. Les fenêtres sont fixes ; les tentatives déjà en cours peuvent dépasser légèrement le seuil. Les limites de récupération (10/minute/IP), initialisation et CalDAV restent distinctes.

Le pool psycopg est limité à 10 connexions par processus (variable DATABASE_POOL_SIZE). Multiplier ce plafond par le nombre de workers pour prévoir la capacité PostgreSQL. Attente du pool et connexion : 5 secondes ; verrou : 5 secondes ; requête : 30 secondes. Les migrations volumineuses doivent être vérifiées sur une copie avant mise à jour. Chaque emprunt fixe un search_path transactionnel au seul schéma concerné.

L’instantané hors connexion est migré dans IndexedDB après validation de l’écriture, puis son ancienne clé localStorage est supprimée. Les noms des clients restent nécessaires aux ventes ; courriels, téléphones et adresses en sont exclus. Les brouillons et opérations en attente sont également migrés dans IndexedDB avant suppression des anciennes clés, dont les noms techniques sont conservés. IndexedDB n’apporte aucun chiffrement applicatif ; activer le chiffrement et le verrouillage de l’appareil. Le stockage local implique que les scripts de même origine et le profil navigateur ont accès aux données. Les pages préparées dans Cache Storage peuvent également contenir des données personnelles. Le bouton d’effacement supprime les copies et les opérations non synchronisées du compte courant. La déconnexion ajoute Clear-Site-Data pour les navigateurs compatibles. L’expiration connue est contrôlée à l’ouverture et toutes les 30 secondes tant que la page fonctionne ; une révocation distante ne peut être découverte hors réseau. Prévenir les usagers que les opérations non synchronisées sont supprimées lors d’une expiration.

La page Confidentialité de l’application (/privacy) décrit OpenStreetMap et Open-Meteo ainsi que le stockage local. Ces changements sont publiés dans la version stable v0.2.9 « gilbert ».