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_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