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_id → users.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 :
- TLS obligatoire — configurer Nginx avec certificat valide, HSTS, TLS 1.2+ uniquement
- JWT_SECRET fort —
openssl rand -hex 64 dans .env
- APP_DEBUG=false — force
COOKIE_SECURE=true automatiquement
- Forcer le 2FA —
totp_force_enabled=true dans /admin/settings
- Politique de mots de passe —
password_min_length=12 et complexité dans /admin/settings
- Inscription fermée —
allow_registration=false dans /admin/settings
- Rate limiting —
RATE_LIMIT_LOGIN_PER_MINUTE=3 + Fail2ban
- Sauvegarde chiffrée — script
backup.sh + chiffrement GPG + stockage hors site
- Conservation des logs — configurer journald et archivage CSV trimestriel
- SBOM —
CI_SBOM_ENABLED=true + Dependency-Track pour le suivi CVE
Pour aller plus loin