66 lines
2.5 KiB
Markdown
66 lines
2.5 KiB
Markdown
# 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.
|