QA-Regeln und ANSSI-Konformität¶
Dieses Dokument definiert die Qualitäts- und Sicherheitsregeln, die für das gesamte Gitrust-Projekt gelten. Jeder Stapel muss diese Regeln vor dem Zusammenführen erfüllen.
1. Obligatorische Kompilierungsgates¶
Jede Änderung muss diese 4 Tore ohne Fehler passieren:
| 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 |
Zusätzliche Tore (zu installieren)¶
| 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. Sicherheitsregeln (ANSSI PA-074)¶
2.1 Obligatorische Rost-Lints (bereits vorhanden)¶
#![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 Sicherheitscheckliste nach Funktion¶
Überprüfen Sie vor jeder Implementierung, die sich auf Authentifizierung, Geheimnisse oder Berechtigungen auswirkt:
- [ ] 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 SEC-Marker¶
Der Code verwendet „//SEC-XX“-Kommentare, um Sicherheitsentscheidungen zu verfolgen. Jedes neue Steuerelement muss mit der nächsten verfügbaren Nummer in seiner Kategorie gekennzeichnet werden:
| 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. Erforderliche Tests nach Kategorie¶
3.1 Abdeckungsmatrix¶
| 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 Testregeln¶
- Integrationstests auf echter Datenbank – keine Mocks für die Persistenzschicht (Mocks verbergen Migrationsfehler)
- Negative Tests erforderlich – testen Sie für jeden glücklichen Pfad mindestens: Eingabe ungültig, nicht authentifiziert, nicht autorisiert, abgelaufen, widerrufen
- E2E-Tests auf Französisch – im Einklang mit der Benutzeroberfläche (Gebietsschema „fr-FR“)
- Kein „sleep()“ in Tests – verwenden Sie Wiederholung/Abfrage mit Zeitüberschreitung
- Isolierte Testdaten – jeder Test erstellt seine eigenen Daten (keine Abhängigkeit von der Ausführungsreihenfolge)
4. Kodexregeln¶
4.1 Rahmengrenze¶
- Niemals ändern
crates/rustwarden-core/ - Framework-Dienste vor der Implementierung wiederverwenden (Authentifizierung, Benutzer, Sitzungen, ResourceService, i18n, Middleware)
- Wenn ein Dienst fehlt, erweitern Sie ihn auf der Gitrust-Seite (Wrapper, Impls-Funktion).
4.2 Vermögenswerte¶
- Kein CDN – alle CSS/JS werden von „static/“ bereitgestellt
- Framework CSP blockiert externe Domänen
4.3 Fehlerbehandlung¶
- „GitrustError“ mit „IntoResponse“ für HTTP-Mapping
- Kein
.unwrap()/.expect()/panic!()/[index] - Benutzerfehler: allgemeine Nachrichten (kein internes Informationsleck)
4.4 Grenzvalidierung¶
- Benutzereingaben validieren (Formulare, Abfrageparameter, Header)
- Führen Sie keine erneute Validierung zwischen internen Diensten durch
- Neue Typen mit Konstruktionsvalidierung („RepoSlug“, „TeamSlug“, „Fingerprint“, „TokenHash“)
5. Checkliste vor dem Zusammenschluss¶
Vor jeder Stapelzusammenführung:
- [ ]
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/