feat: Semaine 8
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
# SecuVault
|
||||
|
||||
Coffre-fort de mots de passe partagés - FastAPI + Jinja2 + SQLite.
|
||||
|
||||
---
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
uv init --python 3.12
|
||||
uv run ./main.py
|
||||
|
||||
.venv\Scripts\activate
|
||||
|
||||
uv add uvicorn jinja2 bcrypt cryptography fastapi itsdangerous python-multipart
|
||||
|
||||
uvicorn main:app --reload --host localhost --port 8080
|
||||
```
|
||||
|
||||
La base de données (`secuvault.db`) et la clé de chiffrement (`secret.key`) sont créées automatiquement au premier démarrage.
|
||||
|
||||
## Comptes de test
|
||||
|
||||
| Utilisateur | Équipes |
|
||||
|-------------|---------------------|
|
||||
| alice | devops |
|
||||
| bob | devops + marketing |
|
||||
| charlie | marketing |
|
||||
|
||||
## Architecture (3 couches strictes)
|
||||
|
||||
```
|
||||
domain/ # RÈGLES MÉTIER UNIQUEMENT
|
||||
models/ # Entités : User, Team, Secret (dataclasses)
|
||||
exceptions.py # Erreurs métier (AccessDeniedError, ConflictError…)
|
||||
services.py # Cas d'usage & contrôle d'accès (AUCUNE règle en dehors d'ici)
|
||||
|
||||
infra/ # ACCÈS AUX DONNÉES
|
||||
crypto.py # Hachage bcrypt + chiffrement Fernet
|
||||
database.py # Connexion SQLite, schéma, provisioning
|
||||
repositories.py # CRUD : UserRepository, TeamRepository, SecretRepository
|
||||
|
||||
presentation/ # INTERFACE UTILISATEUR (contrôleurs minces)
|
||||
schemas.py # Validation Pydantic des formulaires
|
||||
routes/
|
||||
auth.py # GET/POST /login, GET /logout
|
||||
secrets.py # GET/POST /secrets (liste, détail, création, rotation)
|
||||
templates/ # Jinja2 - affichage uniquement, aucune règle métier
|
||||
```
|
||||
|
||||
## Fonctionnalités de sécurité
|
||||
|
||||
- **Chiffrement** : secrets chiffrés en AES-128-CBC + HMAC.
|
||||
- **Hachage** : mots de passe hachés avec bcrypt.
|
||||
- **Contrôle d'accès** : toutes les règles d'accès sont dans `domain/services.py` ; aucune vérification dans les routes ni les templates.
|
||||
- **Verrouillage optimiste** : colonne `version` sur chaque secret ; une rotation concurrente est détectée et signalée à l'utilisateur (voir `ATTACKS.md`).
|
||||
- **Session** : cookies signés (HMAC via `itsdangerous` / Starlette `SessionMiddleware`).
|
||||
|
||||
## Variable d'environnement
|
||||
|
||||
| Variable | Défaut (dev uniquement) | Usage |
|
||||
|------------------|--------------------------------------------------|---------------------|
|
||||
| `SESSION_SECRET` | `secuvault-dev-secret-please-change-in-production` | Clé de signature des cookies de session |
|
||||
|
||||
> **Production** : définir `SESSION_SECRET` avec une valeur aléatoire longue et garder `secret.key` hors du dépôt.
|
||||
Reference in New Issue
Block a user