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,DisplayetDebugimpls ne révèlent pas le secret - [ ] Comparaison constant-time —
subtle::ConstantTimeEqpour 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_idcô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¶
- Pruebas de integración en bases de datos reales: no hay simulaciones para la capa de persistencia (las simulaciones ocultan errores de migración)
- Se requieren pruebas negativas: para cada camino feliz, pruebe al menos: entrada no válida, no autenticada, no autorizada, caducada, revocada
- Pruebas E2E en francés: coherentes con la interfaz de usuario (configuración regional
fr-FR) - No hay
sleep()en las pruebas: use reintento/encuesta con tiempo de espera - 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¶
GitrustErrorconIntoResponsepara 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 -- --checkpasse - [ ]
cargo clippy --workspace -- -D warningspasse - [ ]
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/