Normas de control de calidad y cumplimiento de ANSSI

Este documento define las normas de calidad y seguridad aplicables a todo el proyecto gitrust. Cada lote debe cumplir estas reglas antes de fusionarse.


1. Puertas de compilación obligatorias

Cualquier modificación debe pasar estas 4 puertas sin error:

Gate Commande Critère
Formatage cargo fmt --all -- --check Zéro diff
Linting cargo clippy --workspace -- -D warnings Zéro warning
Tests unitaires cargo test --workspace 100% pass
Build CSS npx tailwindcss -i static/css/input.css -o static/css/style.css --minify Si templates modifiés

Puertas adicionales (por instalar)

Gate Outil Rôle
Audit dépendances cargo audit Détection CVE dans les deps
Licences & bans cargo deny check Licences compatibles, pas de crate bannie
Secrets dans le code Recherche de patterns sensibles Pas de token/mot de passe en dur

2. Normas de seguridad (ANSSI PA-074)

2.1 Pelusas de óxido obligatorias (ya implementadas)

#![forbid(unsafe_code)]                    // core, web, hooks
#![deny(unsafe_code)]                      // git, ssh (FFI nécessaire)
#![deny(clippy::unwrap_used)]
#![deny(clippy::expect_used)]
#![deny(clippy::panic)]
#![deny(clippy::indexing_slicing)]
#![deny(clippy::mem_forget)]

2.2 Lista de verificación de seguridad por característica

Antes de cualquier implementación que afecte la autenticación, los secretos o los permisos, verifique:

  • [ ] Secrets jamais en clair en base — hash SHA-256 ou bcrypt
  • [ ] Secrets jamais loggés — vérifier tracing::info/debug/warn, Display et Debug impls ne révèlent pas le secret
  • [ ] Comparaison constant-timesubtle::ConstantTimeEq pour toute validation de secret (pas de == sur des hash)
  • [ ] Rate-limiting — endpoint d'authentification protégé
  • [ ] CSRF — token valide sur toute action mutante (POST/PUT/DELETE)
  • [ ] Ownership vérifiée (anti-IDOR) — le user ne peut agir que sur ses propres ressources (vérifier user_id côté serveur)
  • [ ] Expiration obligatoire — tout token/session a une durée de vie max
  • [ ] Audit log — création, révocation, utilisation suspecte tracées
  • [ ] Zeroize — types sensibles implémentent Zeroize/ZeroizeOnDrop
  • [ ] Path traversal — validation des chemins disque (pas de .., /, \)

2.3 Marcadores SEC

El código utiliza comentarios //SEC-XX para rastrear las decisiones de seguridad. Todo nuevo control deberá estar marcado con el siguiente número disponible en su categoría:

Préfixe Catégorie Exemples
SEC-C Cryptographie Timing attack, CSRF, PKCE
SEC-H HTTP/Headers X-Forwarded-For, cookies, nonce
SEC-L Logique métier Hashing, validation, defaults
SEC-M Mémoire/sessions Rate-limit DoS, refresh tokens

3. Pruebas requeridas por categoría

3.1 Matriz de cobertura

Catégorie Quand appliquer Exemples
Unitaire Logique pure (validation, parsing, conversion) RepoSlug::new("../evil") → erreur
Intégration Service avec DB (CRUD, contraintes, transactions) PatService::validate token expiré → None
Handler Endpoint HTTP (status, redirect, CSRF, auth) POST sans CSRF → 403
E2E Playwright Flow utilisateur complet Créer token → copier → cloner un dépôt
Sécurité négatif Tout bypass imaginable Token user A sur ressource user B → 401

3.2 Reglas de prueba

  1. Pruebas de integración en bases de datos reales: no hay simulaciones para la capa de persistencia (las simulaciones ocultan errores de migración)
  2. Se requieren pruebas negativas: para cada camino feliz, pruebe al menos: entrada no válida, no autenticada, no autorizada, caducada, revocada
  3. Pruebas E2E en francés: coherentes con la interfaz de usuario (configuración regional fr-FR)
  4. No hay sleep() en las pruebas: use reintento/encuesta con tiempo de espera
  5. Datos de prueba aislados: cada prueba crea sus propios datos (no depende del orden de ejecución)

4. Reglas del código

4.1 Límite del marco

  • Nunca modificar crates/rustwarden-core/
  • Reutilizar los servicios del marco antes de implementarlos (autenticación, usuarios, sesiones, ResourceService, i18n, middleware)
  • Si falta un servicio, extiéndalo en el lado de gitrust (envoltorios, función impls)

4.2 Activos

  • Cero CDN: todo CSS/JS servido desde static/
  • Framework CSP bloquea dominios externos

4.3 Manejo de errores

  • GitrustError con IntoResponse para mapeo HTTP
  • Sin .unwrap()/.expect()/panic!()/[índice]
  • Errores de usuario: mensajes genéricos (sin filtración de información interna)

4.4 Validación de fronteras

  • Validar las entradas del usuario (formularios, parámetros de consulta, encabezados)
  • No volver a validar entre servicios internos
  • Nuevos tipos con validación de construcción (RepoSlug, TeamSlug, Fingerprint, TokenHash)

5. Lista de verificación previa a la fusión

Antes de cada fusión de lotes:

  • [ ] cargo fmt --all -- --check passe
  • [ ] cargo clippy --workspace -- -D warnings passe
  • [ ] cargo test --workspace — tous les tests passent
  • [ ] Tests E2E Playwright passent (npm run test:e2e)
  • [ ] CSS rebuild si templates modifiés
  • [ ] Aucun secret en clair dans le code ou les logs
  • [ ] Checklist sécurité §2.2 validée (si applicable)
  • [ ] Pas de modification dans crates/rustwarden-core/