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 ANSSI Statut gitrust Action administrateur requise
Mot de passe haché avec algorithme fort (bcrypt/Argon2) Implémenté (bcrypt) Aucune — automatique
Longueur minimale de mot de passe configurable Implémenté (password_min_length dans app_settings) Configurer password_min_length ≥ 12 via /admin/settings
Complexité du mot de passe configurable Implémenté (majuscules, minuscules, chiffres, spéciaux) Activer les règles souhaitées via /admin/settings
Expiration des mots de passe Implémenté (password_expiration_enabled) Activer si requis par votre politique SSI
Tokens comparés en temps constant Implémenté (subtle::ConstantTimeEq) Aucune
Durée de vie des sessions limitée Implémenté (SESSION_TIMEOUT_MINUTES, défaut 30 min) Ajuster selon votre politique (recommandé : ≤ 30 min)
Invalidation de session à la déconnexion Implémenté (JWT blacklist + refresh token révoqué) Aucune
Refresh token rotation à chaque usage Implémenté Aucune
Durée « Se souvenir de moi » bornée Implé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 ANSSI Statut gitrust Action administrateur requise
HTTPS obligatoire en production Non 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 gitrust Ajouter Strict-Transport-Security: max-age=63072000; includeSubDomains dans Nginx
TLS ≥ 1.2 uniquement Non géré par gitrust Configurer ssl_protocols TLSv1.2 TLSv1.3 dans Nginx
Cookies Secure sur HTTPS Implémenté (COOKIE_SECURE=true si APP_DEBUG=false) Vérifier APP_DEBUG=false en production
Cookies HttpOnly Implémenté (défaut framework) Aucune
Cookies SameSite=Lax minimum Implé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 sortant Implé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 ANSSI Statut gitrust Action administrateur requise
Validation des entrées utilisateur (formulaires, params) Implémenté (newtypes RepoSlug, Fingerprint, etc.) Aucune
Protection CSRF sur toutes les actions mutantes Implé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 Policy Partiellement implémenté (CSP bloque les CDN externes) Vérifier les en-têtes CSP dans Nginx si souhaité
Pas de ressources CDN externes Implé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 ANSSI Statut gitrust Action administrateur requise
JWT_SECRET minimum 32 bytes Implé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és Implémenté (pas de Display/Debug sur les secrets) Vérifier RUST_LOG=info ou warn en production
Clé SSH hôte avec permissions restrictives Implémenté (600, owner = user systemd) Vérifier après restauration depuis sauvegarde
Rotation de la clé JWT possible Possible (modifier JWT_SECRET + redémarrage) Planifier une rotation annuelle ou en cas de compromission
Zeroize des types sensibles Implémenté (Zeroize/ZeroizeOnDrop) Aucune

5. Journalisation et audit

Critère ANSSI Statut gitrust Action administrateur requise
Journal d'audit des actions significatives Implémenté (table audit_log) Vérifier que audit_log_actions couvre vos besoins via /admin/settings
Horodatage des événements Implémenté (TIMESTAMPTZ avec fuseau) Vérifier le fuseau horaire du serveur (timedatectl)
IP source enregistrée Implé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 mois Non automatique (pas de purge auto actuellement) Planifier une purge manuelle annuelle en conservant les événements de sécurité
Logs système via journald Implémenté (tous les logs gitrust dans journald) Configurer journald.conf avec SystemMaxUse et MaxRetentionSec appropriés
Export des logs d'audit Implémenté (CSV depuis /admin/audit) Archiver régulièrement les exports CSV

6. Gestion des accès et des droits

Critère ANSSI Statut gitrust Action administrateur requise
Principe du moindre privilège Implé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ès Implémenté (désactivation compte = effet immédiat) Désactiver les comptes des personnes ayant quitté l'équipe
Inscription publique désactivée par défaut Implémenté (allow_registration=false par défaut) Garder false pour les instances privées
Validation e-mail obligatoire Implémenté (validation_email_required=true par défaut) Maintenir activé en production
Audit des créations/suppressions de comptes Implé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 ANSSI Action requise
Service lancé sous utilisateur non-root Créer l'utilisateur gitrust (voir tutoriel 02)
Durcissement systemd Utiliser les directives NoNewPrivileges, ProtectSystem=strict, PrivateTmp (incluses dans gitrust.service)
Mises à jour de sécurité OS sudo apt-get update && apt-get upgrade planifié (cron/unattended-upgrades)
Fail2ban contre le brute force SSH/HTTP Voir Durcir avec Fail2ban
Sauvegarde chiffrée hors site Chiffrer 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