Aller au contenu

Journal des modifications

Toutes les modifications notables apportées à Repod sont documentées ici.

Le format suit Keep a Changelog. Repod utilise le Semantic Versioning.


[1.0.1] — 2026-05-16

Corrigé

  • ClamAV : remplacement de clamscan (tué par OOM à la limite de 1 Go) par le démon clamd — les signatures sont chargées une seule fois en mémoire. Limite mémoire du conteneur portée à 2,5 Go. gpg-agent ajouté aux Dockerfiles Enterprise et Community.
  • Génération de clé GPG : correction des erreurs NameError: Path is not defined et gpg-agent not installed. Ajout de --pinentry-mode loopback et de _ensure_gnupg_permissions(). La génération de clé fonctionne désormais de manière fiable via l'interface web.
  • Mise à jour manuelle ClamAV : freshclam est désormais appelé avec --log=/dev/null pour éviter un Permission denied sur /var/log/clamav/freshclam.log (le backend s'exécute en tant qu'appuser, pas clamav).
  • reprepro Community : correction de l'erreur packages database contains unused en exécutant reprepro clearvanished après régénération de conf/distributions. conf/distributions est désormais auto-généré avec les 4 distributions (jammy, noble, focal, bookworm), y compris le SignWith GPG.
  • Édition Community : suppression de 8 fichiers de service Enterprise (cve_enrichment, security_decisions, sla_alerts, sbom, ldap_auth, email_notifications, security_sync, retention) du code source Community — modifier la variable d'environnement REPOD_EDITION ne débloque plus les fonctionnalités Enterprise.

Ajouté

  • Initialisation automatique des distributions : les backends Enterprise et Community initialisent désormais automatiquement conf/distributions et exécutent reprepro export au premier démarrage — plus besoin du bouton manuel « Init distributions ».
  • Démon clamd : entrypoint.sh démarre désormais le démon clamd au démarrage du conteneur. appuser est ajouté au groupe clamav afin que freshclam puisse écrire dans le répertoire de base de données.

[1.0.0] — 2026-05-12

Première version stable en production, incluant l'édition Community (MIT).

Architecture à double édition

  • Édition Community — open source (licence MIT). Inclut le pipeline d'upload complet (scan antivirus, analyse CVE, signature GPG, vérification des dépendances), la gestion des paquets, l'authentification JWT + tokens API, le RBAC à 5 rôles, l'intégration LDAP/AD, la journalisation d'audit et l'interface web.
  • Édition Enterprise — ajoute la file de revue CVE avec workflow d'approbation RSSI, l'export SBOM (CycloneDX 1.5 + SPDX 2.3), une politique CVE configurable, le suivi des SLA, la synchronisation de sécurité planifiée, la rétention des paquets et les paramètres avancés.
  • Les endpoints Enterprise sont présents dans l'ensemble de routes Community et renvoient un 402 Payment Required HTTP avec un message de mise à niveau structuré. La surface d'API est identique entre les deux éditions.

Durcissement de la sécurité

  • Suppression du socket Docker — le backend ne monte plus /var/run/docker.sock. Les opérations de signature GPG utilisent désormais un volume partagé (/repos/gnupg), ce qui élimine un vecteur d'évasion de conteneur.
  • Secret JWT validé au démarrage — l'application refuse de démarrer en mode production si JWT_SECRET_KEY est absent ou réglé sur la valeur par défaut.
  • Swagger UI désactivée en production/docs, /redoc et /openapi.json renvoient 404 quand ENV=production.
  • Tokens de réinitialisation hachés — les tokens de réinitialisation de mot de passe sont stockés uniquement sous forme de hachages SHA-256. Le token en clair n'est jamais persisté. Les liens de réinitialisation expirent après 30 minutes.
  • Vérification du certificat TLS LDAP — activée par défaut (verify_cert: true). Un avertissement est journalisé dans la console si elle est désactivée.
  • Secrets masqués dans l'API des paramètressmtp_password et bind_password sont renvoyés sous forme de •••••••• dans GET /settings/.
  • Politique de mot de passe appliquée — minimum 8 caractères, au moins une majuscule, au moins un chiffre ou un caractère spécial. Appliquée à la création de compte, au changement de mot de passe et à la réinitialisation.
  • Limites de ressources — le conteneur backend est limité à 1 Go de RAM et 1,5 CPU dans docker-compose.yaml.

Pipeline d'upload

  • Upload en streaming SSE complet via POST /upload/stream — progression étape par étape en temps réel.
  • Upload JSON standard via POST /upload/ (legacy, conservé pour la rétrocompatibilité).
  • Pipeline de validation en six étapes : format, provenance SHA-256, scan antivirus, analyse CVE (avec enrichissement EPSS/KEV), signature GPG, vérification des dépendances.
  • Moteur de politique CVE avec actions par sévérité (block, review, warn, allow).
  • Notification webhook sur pending_review — notifie immédiatement l'équipe RSSI dès qu'un paquet entre dans la file de revue.

Limitation de débit

Limites de débit appliquées aux endpoints à fort impact :

Endpoint Limite
POST /upload/ 20 / minute
POST /upload/stream 20 / minute
POST /import/fetch 10 / minute
POST /import/batch 5 / minute
POST /import/sync 3 / minute
POST /auth/token Limité en débit
POST /auth/forgot-password Limité en débit
POST /auth/reset-password Limité en débit

Piste d'audit

Journal d'audit JSONL en ajout seul (/repos/audit/YYYY-MM-DD.jsonl), un fichier par jour. Actions journalisées :

  • Authentification : LOGIN (avec IP source et résultat)
  • Gestion des utilisateurs : USER_CREATE, USER_UPDATE, USER_DELETE
  • Mots de passe : PASSWORD_CHANGE, PASSWORD_RESET
  • Paquets : UPLOAD, DELETE, IMPORT, SYNC
  • Sécurité : SECURITY_DECISION, QUARANTINE, RESCAN, CLAMAV_UPDATE
  • Configuration : SETTINGS_CHANGE, GPG_GENERATE
  • Système : INIT_DISTS, IMPORT_GROUP_DELETE

LDAP / Active Directory

  • Compatible avec OpenLDAP (uid) et Active Directory (sAMAccountName).
  • Cinq mappages de groupes : un par rôle (group_admin, group_maintainer, group_uploader, group_auditor, group_reader).
  • Auto-provisioning : crée un enregistrement utilisateur local lors de la première connexion LDAP réussie.
  • Synchronisation des rôles : si le groupe LDAP d'un utilisateur change, le rôle est mis à jour à la connexion suivante.
  • POST /settings/test-ldap — teste la connexion et le bind LDAP sans enregistrer.
  • Options TLS : simple, STARTTLS, LDAPS, avec bundle CA personnalisé optionnel (ca_bundle_path).

Infrastructure

  • Fichier compose de production (community/docker-compose.yaml) séparé du développement.
  • docker-compose.dev.yml pour le développement local avec hot-reload.
  • Variable d'environnement TRUSTED_PROXIES pour la liste blanche d'IP du reverse proxy.
  • Paramètre app_url dans settings.json pour construire des liens de réinitialisation corrects.
  • Le planificateur (Enterprise) exécute trois tâches cron : synchronisation de sécurité (03:00), vérification SLA (08:00), rétention (02:00). Toutes configurables. Reconfigurables à chaud via PATCH /settings/.

Documentation

  • Documentation bilingue (anglais + français) couvrant l'installation, l'administration, la référence API, le dossier de sécurité, le reverse proxy et la conformité.
  • Cartographie de conformité NIS2 et ANSSI SecNumCloud.
  • Guides pratiques : LDAP, sauvegarde/restauration, rotation de clé GPG, migration depuis Artifactory/Nexus.

[0.9.0] — 2026-03-01

Version bêta — tests internes.

Ajouté

  • Export SBOM (CycloneDX 1.5, SPDX 2.3)
  • Score EPSS et enrichissement CISA KEV
  • File de revue RSSI pour les paquets signalés par CVE
  • Authentification LDAP / Active Directory avec mappage groupe → rôle
  • Tokens API pour les pipelines CI/CD
  • Import de paquets depuis les sources APT amont (Ubuntu, Debian)
  • Import par lot avec progression en streaming SSE
  • Intégration du scanner CVE Grype
  • Intégration antivirus ClamAV
  • Statistiques et analyse des téléchargements

[0.5.0] — 2025-12-15

Version alpha.

Ajouté

  • Dépôt APT servi par Nginx
  • Upload de paquets avec validation du format et SHA-256
  • Signature GPG
  • Authentification JWT
  • RBAC de base (admin, uploader, reader)
  • Frontend web (React)
  • Backend FastAPI
  • Déploiement Docker Compose