Commit 96e8f3f6 authored by Kourser's avatar Kourser
Browse files

Déploiement : exposer au conteneur les variables du durcissement

Les réglages introduits par l'audit de sécurité existaient dans le code mais
n'atteignaient pas le conteneur : `docker-compose.yml` ne les listait pas sous
« environment: », et les définir dans le `.env` restait donc sans effet.
`install.sh` le disait d'ailleurs explicitement, en les rangeant sous « non
transmis au conteneur en l'état ».

Ajoutées au service « app » :

  SECRETS_KEY             clef distincte pour les secrets chiffrés en base.
                          Absente, elle reste dérivée de JWT_SECRET — la définir
                          à part permet de faire tourner JWT_SECRET sans rendre
                          illisibles les secrets déjà stockés.
  TRUSTED_PROXIES         nombre de proxys devant l'application. Sans elle, le
                          plafonnement des routes publiques compte tous les
                          visiteurs sur une seule adresse, celle du proxy.
  AUDIT_RETENTION_DAYS    rétention RGPD des données d'instance.
  SIGNUP_RETENTION_DAYS
  SMTP_*, MAIL_FROM       amorçage sans interface.

Une distinction qui compte, et qui est écrite dans les deux fichiers : le code
applique ses défauts sur une variable ABSENTE, pas sur une variable vide. Une
valeur vide vaut 0 pour un nombre — soit, pour AUDIT_RETENTION_DAYS, la purge du
journal désactivée. D'où les lignes commentées dans le `.env` généré plutôt que
des lignes vides, et l'avertissement qui les précède.

Les défauts du compose (730 et 90 jours) doublent ceux du code
(`apps/api/src/maintenance/retention.ts`) et doivent le rester.

Le mot de passe SMTP reste préférable en console d'instance, qui le chiffre avant
stockage : renseigné ici, il est lisible par quiconque peut faire un
`docker inspect`. Les deux fichiers le disent.

Vérifications

`bash -n install.sh` valide. TRUSTED_PROXIES est bien demandé à l'utilisateur
(borné 0-10) avant d'être écrit, donc la ligne non commentée du `.env` porte
toujours une valeur — elle ne tombe pas dans le piège que le commentaire voisin
décrit. Aucune valeur sensible en dur dans le compose : `JWT_SECRET` échoue même
au démarrage s'il manque (`:?`), les autres sont des substitutions vides.

364 tests / 34 suites, typecheck, eslint et build : verts. Ces deux fichiers ne
sont couverts par aucun test — le déploiement lui-même reste à éprouver.

Co-Authored-By: Claude (Enkadenn)
parent 9e71531d
Loading
Loading
Loading
Loading
+25 −0
Changes for docker-compose.yml: 25 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -41,6 +41,31 @@ services:
      # Pour traverser des reseaux, fournissez votre propre TURN, par exemple :
      # WEBRTC_ICE_SERVERS='[{"urls":"turn:turn.exemple.fr:3478","username":"u","credential":"p"}]'
      WEBRTC_ICE_SERVERS: ${WEBRTC_ICE_SERVERS:-}
      # Clef de chiffrement des secrets stockes en base (mot de passe SMTP saisi
      # dans la console d'instance). Vide = derivee de JWT_SECRET. La definir
      # separement permet de faire tourner JWT_SECRET sans rendre ces secrets
      # illisibles. 32 caracteres minimum, sinon elle est ignoree.
      SECRETS_KEY: ${SECRETS_KEY:-}
      # Nombre de proxys de confiance devant l'application, pour savoir combien
      # d'entrees de X-Forwarded-For sont dignes de foi. 0 = aucun proxy.
      TRUSTED_PROXIES: ${TRUSTED_PROXIES:-0}
      # Retention RGPD des donnees d'instance, en jours. Ces deux defauts
      # doublent DEFAULT_AUDIT_RETENTION_DAYS et DEFAULT_SIGNUP_RETENTION_DAYS
      # (apps/api/src/maintenance/retention.ts) et doivent le rester : le code
      # applique son defaut sur une variable ABSENTE, pas sur une variable vide,
      # qui vaudrait 0 — soit, pour l'audit, la purge desactivee.
      AUDIT_RETENTION_DAYS: ${AUDIT_RETENTION_DAYS:-730}
      SIGNUP_RETENTION_DAYS: ${SIGNUP_RETENTION_DAYS:-90}
      # Envoi de courriel. Preferez la console d'instance, qui chiffre le mot de
      # passe avant de le stocker : renseigne ici, il est lisible par quiconque
      # peut faire un `docker inspect`. Ces variables servent a un amorcage sans
      # interface, et ne sont lues que si aucun reglage n'existe en base.
      SMTP_HOST: ${SMTP_HOST:-}
      SMTP_PORT: ${SMTP_PORT:-587}
      SMTP_SECURE: ${SMTP_SECURE:-false}
      SMTP_USER: ${SMTP_USER:-}
      SMTP_PASSWORD: ${SMTP_PASSWORD:-}
      MAIL_FROM: ${MAIL_FROM:-}
      # Repertoire des fichiers televerses (persistant via volume).
      UPLOADS_DIR: /app/data/uploads
      DATABASE_URL: postgresql://${POSTGRES_USER:-enkadenn}:${POSTGRES_PASSWORD:-change-me-in-production}@db:5432/${POSTGRES_DB:-enkadenn}?schema=public
+26 −9
Changes for install.sh: 26 added lines, 9 removed lines.
Original line number Diff line number Diff line
@@ -248,6 +248,8 @@ JWT_SECRET=$JWT_SECRET
PORT=$PORT
APP_URL=$APP_URL
DOCS_URL=$DOCS_URL
# Nombre de proxys de confiance devant l'application. 0 = aucun.
TRUSTED_PROXIES=$TRUSTED_PROXIES

# --- Conservation des donnees (RGPD) ---------------------------------------
# Purge des exercices archives apres N jours. 0 = purge desactivee.
@@ -256,15 +258,30 @@ RETENTION_DAYS=$RETENTION_DAYS
# --- Appels vocaux ---------------------------------------------------------
$ICE_LIGNE

# --- Non transmis au conteneur en l'etat -----------------------------------
# docker-compose.yml n'expose pas les variables ci-dessous au service « app ».
# Les definir ici resterait sans effet : ajoutez-les d'abord au bloc
# « environment: » du compose si vous en avez besoin.
#   TRUSTED_PROXIES=$TRUSTED_PROXIES
#   SMTP_HOST= SMTP_PORT= SMTP_SECURE= SMTP_USER= SMTP_PASSWORD= MAIL_FROM=
#   SECRETS_KEY= AUDIT_RETENTION_DAYS= SIGNUP_RETENTION_DAYS=
# L'envoi de courriel se configure depuis la console d'instance, dans
# l'application : le mot de passe SMTP y est chiffre avant stockage.
# --- Optionnel : a decommenter pour s'en servir ----------------------------
# NE LAISSEZ PAS CES LIGNES VIDES ET DECOMMENTEES : le code applique son
# defaut sur une variable absente, pas sur une variable vide. Une valeur vide
# vaut 0 pour un nombre, ce qui desactiverait la purge du journal d'audit.
#
# Clef de chiffrement distincte pour les secrets stockes (32 caracteres
# minimum). Absente, elle est derivee de JWT_SECRET.
#SECRETS_KEY=
#
# Retention des donnees d'instance. Defauts du code si absentes : 730 jours
# pour le journal d'audit, 90 pour les demandes d'inscription traitees.
#AUDIT_RETENTION_DAYS=730
#SIGNUP_RETENTION_DAYS=90
#
# Envoi de courriel. La console d'instance est preferable : elle chiffre le
# mot de passe avant stockage, alors qu'ici il est lisible par quiconque peut
# faire un « docker inspect ». Ces variables ne sont lues qu'en l'absence de
# reglage en base.
#SMTP_HOST=
#SMTP_PORT=587
#SMTP_SECURE=false
#SMTP_USER=
#SMTP_PASSWORD=
#MAIL_FROM=
ENV

chmod 600 "$FICHIER_ENV"