Contexte
Les fichiers uploadés (avis CSE, évaluation conjointe) sont stockés sur S3 en {siren}/{year}/{uuid}.{ext}. Actuellement, aucune politique de bucket n'est configurée (ACL, CORS, lifecycle, chiffrement).
Besoin
- Isolation par SIREN : un utilisateur ne doit accéder qu'aux fichiers de son entreprise
- CORS : restreindre les origines autorisées au domaine de l'app
- Lifecycle rules : suppression automatique des fichiers orphelins (multipart uploads avortés, fichiers non référencés en base)
- Chiffrement : S3 server-side encryption (SSE-S3 ou SSE-KMS)
- Accès : les fichiers ne doivent jamais être publics — téléchargement via une route API authentifiée (pre-signed URL ou proxy)
Pistes
- Bucket policy pour bloquer l'accès public
- Lifecycle rule :
AbortIncompleteMultipartUpload après 1 jour
- Route API
GET /api/download?key=... avec vérification session + SIREN ownership
- Ou pre-signed URLs avec expiration courte (5 min)
Fichiers concernés
packages/app/src/server/services/s3.ts (ajout getSignedUrl ou route proxy)
.kontinuous/ (config bucket policy par environnement)
docker-compose.yml (minio policy pour le dev local)
Contexte
Les fichiers uploadés (avis CSE, évaluation conjointe) sont stockés sur S3 en
{siren}/{year}/{uuid}.{ext}. Actuellement, aucune politique de bucket n'est configurée (ACL, CORS, lifecycle, chiffrement).Besoin
Pistes
AbortIncompleteMultipartUploadaprès 1 jourGET /api/download?key=...avec vérification session + SIREN ownershipFichiers concernés
packages/app/src/server/services/s3.ts(ajoutgetSignedUrlou route proxy).kontinuous/(config bucket policy par environnement)docker-compose.yml(minio policy pour le dev local)