conformite-anssi-pa074.md 9741 octets

Conformité ANSSI PA-074

Checklist de conformité au guide PA-074 de l'ANSSI (Recommandations de sécurité pour les applications web) appliquée à une instance gitrust. Pour chaque point : statut dans gitrust et action requise de l'administrateur.

Base : docs/QA_RULES.md du dépôt gitrust source, enrichi des contrôles applicables à l'administration d'une instance.


1. Authentification et gestion des sessions

Critère ANSSIStatut gitrustAction administrateur requise
Mot de passe haché avec algorithme fort (bcrypt/Argon2)Implémenté (bcrypt)Aucune — automatique
Longueur minimale de mot de passe configurableImplémenté (password_min_length dans app_settings)Configurer password_min_length ≥ 12 via /admin/settings
Complexité du mot de passe configurableImplémenté (majuscules, minuscules, chiffres, spéciaux)Activer les règles souhaitées via /admin/settings
Expiration des mots de passeImplémenté (password_expiration_enabled)Activer si requis par votre politique SSI
Tokens comparés en temps constantImplémenté (subtle::ConstantTimeEq)Aucune
Durée de vie des sessions limitéeImplémenté (SESSION_TIMEOUT_MINUTES, défaut 30 min)Ajuster selon votre politique (recommandé : ≤ 30 min)
Invalidation de session à la déconnexionImplémenté (JWT blacklist + refresh token révoqué)Aucune
Refresh token rotation à chaque usageImplémentéAucune
Durée « Se souvenir de moi » bornéeImplémenté (≤ 90 jours, warning > 60 jours)Vérifier REMEMBER_ME_EXPIRATION_DAYS ≤ 30
Authentification multi-facteurs (2FA TOTP)ImplémentéActiver totp_force_enabled=true via /admin/settings pour forcer le 2FA sur tous les comptes
Protection contre le brute force (rate limiting)Implémenté (RATE_LIMIT_LOGIN_PER_MINUTE)Vérifier RATE_LIMIT_LOGIN_PER_MINUTE ≤ 5 ; ajouter Fail2ban

2. Chiffrement des communications

Critère ANSSIStatut gitrustAction administrateur requise
HTTPS obligatoire en productionNon géré par gitrust (délégué au reverse-proxy)Configurer TLS sur Nginx/Caddy avec certificat valide (Let's Encrypt ou CA interne)
HSTS activéNon géré par gitrustAjouter Strict-Transport-Security: max-age=63072000; includeSubDomains dans Nginx
TLS ≥ 1.2 uniquementNon géré par gitrustConfigurer ssl_protocols TLSv1.2 TLSv1.3 dans Nginx
Cookies Secure sur HTTPSImplémenté (COOKIE_SECURE=true si APP_DEBUG=false)Vérifier APP_DEBUG=false en production
Cookies HttpOnlyImplémenté (défaut framework)Aucune
Cookies SameSite=Lax minimumImplémenté (COOKIE_SAME_SITE=Lax par défaut)Aucune
SSH via Ed25519 (algorithme moderne)Implémenté (Russh, clé hôte Ed25519)Aucune
TLS pour SMTP sortantImplémenté (SMTP_USE_TLS / SMTP_USE_STARTTLS)Vérifier SMTP_USE_STARTTLS=true ou SMTP_USE_TLS=true ; jamais les deux à false

3. Protection contre les injections et les failles web

Critère ANSSIStatut gitrustAction administrateur requise
Validation des entrées utilisateur (formulaires, params)Implémenté (newtypes RepoSlug, Fingerprint, etc.)Aucune
Protection CSRF sur toutes les actions mutantesImplémenté (token CSRF sur POST/PUT/DELETE)Aucune
Pas d'injection SQL (ORM paramétré)Implémenté (SeaORM, requêtes préparées)Aucune
Pas d'accès inter-utilisateurs (anti-IDOR)Implémenté (vérification user_id côté serveur)Aucune
Path traversal bloqué (dépôts Git)Implémenté (RepoSlug validé, pas de .. ou /)Aucune
Content Security PolicyPartiellement implémenté (CSP bloque les CDN externes)Vérifier les en-têtes CSP dans Nginx si souhaité
Pas de ressources CDN externesImplémenté (zéro CDN, tout servi depuis static/)Aucune
unsafe_code interdit (Rust)Implémenté (#![forbid(unsafe_code)] dans core/web/hooks)Aucune

4. Gestion des secrets et des clés

Critère ANSSIStatut gitrustAction administrateur requise
JWT_SECRET minimum 32 bytesImplémenté (refus au démarrage si trop court)Générer avec openssl rand -hex 64
Secrets OAuth chiffrés en base (AES-256-GCM)ImplémentéDéfinir OAUTH_ENCRYPTION_KEY avec openssl rand -hex 32
Personal access tokens hachés (SHA-256)ImplémentéAucune
Secrets jamais logguésImplémenté (pas de Display/Debug sur les secrets)Vérifier RUST_LOG=info ou warn en production
Clé SSH hôte avec permissions restrictivesImplémenté (600, owner = user systemd)Vérifier après restauration depuis sauvegarde
Rotation de la clé JWT possiblePossible (modifier JWT_SECRET + redémarrage)Planifier une rotation annuelle ou en cas de compromission
Zeroize des types sensiblesImplémenté (Zeroize/ZeroizeOnDrop)Aucune

5. Journalisation et audit

Critère ANSSIStatut gitrustAction administrateur requise
Journal d'audit des actions significativesImplémenté (table audit_log)Vérifier que audit_log_actions couvre vos besoins via /admin/settings
Horodatage des événementsImplémenté (TIMESTAMPTZ avec fuseau)Vérifier le fuseau horaire du serveur (timedatectl)
IP source enregistréeImplémenté (ip_address dans audit_log)Si derrière proxy : vérifier que X-Real-IP est transmis par Nginx
Non-répudiation (acteur identifié)Implémenté (actor_idusers.id)Aucune
Conservation des logs ≥ 12 moisNon automatique (pas de purge auto actuellement)Planifier une purge manuelle annuelle en conservant les événements de sécurité
Logs système via journaldImplémenté (tous les logs gitrust dans journald)Configurer journald.conf avec SystemMaxUse et MaxRetentionSec appropriés
Export des logs d'auditImplémenté (CSV depuis /admin/audit)Archiver régulièrement les exports CSV

6. Gestion des accès et des droits

Critère ANSSIStatut gitrustAction administrateur requise
Principe du moindre privilègeImplémenté (4 rôles : Reader/Developer/Maintainer/Owner)Vérifier que les utilisateurs ont le niveau minimal nécessaire
Séparation des rôles (utilisateur / admin)Implémenté (rôle admin global distinct des rôles dépôt)Limiter le nombre de comptes admin
Révocation immédiate des accèsImplémenté (désactivation compte = effet immédiat)Désactiver les comptes des personnes ayant quitté l'équipe
Inscription publique désactivée par défautImplémenté (allow_registration=false par défaut)Garder false pour les instances privées
Validation e-mail obligatoireImplémenté (validation_email_required=true par défaut)Maintenir activé en production
Audit des créations/suppressions de comptesImplémenté (enregistré dans audit_log)Consulter régulièrement /admin/audit

7. Durcissement système (responsabilité de l'administrateur)

Ces points sont hors du périmètre de gitrust mais nécessaires pour la conformité globale.

Critère ANSSIAction requise
Service lancé sous utilisateur non-rootCréer l'utilisateur gitrust (voir tutoriel 02)
Durcissement systemdUtiliser les directives NoNewPrivileges, ProtectSystem=strict, PrivateTmp (incluses dans gitrust.service)
Mises à jour de sécurité OSsudo apt-get update && apt-get upgrade planifié (cron/unattended-upgrades)
Fail2ban contre le brute force SSH/HTTPVoir Durcir avec Fail2ban
Sauvegarde chiffrée hors siteChiffrer les archives de sauvegarde avec GPG ou age ; stocker sur un système distinct
Inventaire des dépendances (SBOM)Activer CI_SBOM_ENABLED=true et CI_DTRACK_ENABLED=true pour le suivi CVE

Résumé des actions prioritaires

Pour une instance conforme PA-074, effectuez ces actions dans l'ordre :

  1. TLS obligatoire — configurer Nginx avec certificat valide, HSTS, TLS 1.2+ uniquement
  2. JWT_SECRET fortopenssl rand -hex 64 dans .env
  3. APP_DEBUG=false — force COOKIE_SECURE=true automatiquement
  4. Forcer le 2FAtotp_force_enabled=true dans /admin/settings
  5. Politique de mots de passepassword_min_length=12 et complexité dans /admin/settings
  6. Inscription ferméeallow_registration=false dans /admin/settings
  7. Rate limitingRATE_LIMIT_LOGIN_PER_MINUTE=3 + Fail2ban
  8. Sauvegarde chiffrée — script backup.sh + chiffrement GPG + stockage hors site
  9. Conservation des logs — configurer journald et archivage CSV trimestriel
  10. SBOMCI_SBOM_ENABLED=true + Dependency-Track pour le suivi CVE

Pour aller plus loin