4NK_vault/docs/security-model.md
4NK Dev b13c8745e3 feat: Implémentation système sécurisé avec clés par utilisateur et environnement
-  API sécurisée avec authentification par ID utilisateur
-  HTTPS obligatoire avec rejet des connexions HTTP
-  Clés individuelles par utilisateur ET par environnement
-  Rotation automatique des clés avec sauvegarde de l'ancienne
-  Stockage sécurisé dans storage/<env>/_keys/
-  Client SDK mis à jour sans stockage de clés côté client
-  Documentation complète avec avertissements de sécurité
-  Tests complets du système sécurisé
- 🔒 Protection des fichiers sensibles dans .gitignore
2025-09-29 21:27:09 +00:00

408 lines
12 KiB
Markdown

# Modèle de sécurité - 4NK Vault
## Vue d'ensemble
Le modèle de sécurité du projet 4NK Vault repose sur plusieurs couches de protection pour assurer la confidentialité, l'intégrité et la disponibilité des données de configuration.
## Architecture de sécurité
```
┌─────────────────────────────────────────────────────────────┐
│ Couche de sécurité │
├─────────────────────────────────────────────────────────────┤
│ Application Layer │ HTTPS + Certificats SSL │
├─────────────────────────────────────────────────────────────┤
│ Transport Layer │ TLS 1.2+ avec ciphers modernes │
├─────────────────────────────────────────────────────────────┤
│ Encryption Layer │ ChaCha20-Poly1305 (quantique) │
├─────────────────────────────────────────────────────────────┤
│ Access Control │ Validation des chemins + .env │
├─────────────────────────────────────────────────────────────┤
│ Storage Layer │ Fichiers système sécurisés │
└─────────────────────────────────────────────────────────────┘
```
## Chiffrement quantique résistant
### Algorithme : ChaCha20-Poly1305
Le projet utilise ChaCha20-Poly1305, un algorithme de chiffrement authentifié qui est considéré comme résistant aux attaques quantiques à court terme.
#### Caractéristiques
- **ChaCha20** : Chiffrement de flux haute performance
- **Poly1305** : Authentification cryptographique
- **Résistance quantique** : Résistant aux attaques par ordinateur quantique
- **Performance** : Plus rapide qu'AES sur certains processeurs
#### Paramètres
```python
# Configuration du chiffrement
ALGORITHM = "ChaCha20-Poly1305"
KEY_SIZE = 32 # 256 bits
NONCE_SIZE = 12 # 96 bits
TAG_SIZE = 16 # 128 bits (intégré dans Poly1305)
```
### Gestion des clés
#### Génération des clés
```typescript
// Génération d'une clé aléatoire (32 bytes)
const key = VaultCrypto.generateKey();
// Dérivation depuis un mot de passe
const derivedKey = VaultCrypto.hashToKey('mon-mot-de-passe-secret');
// Validation de la clé
const isValid = VaultCrypto.validateKey(key);
```
#### Stockage des clés
- **Développement** : Clé de démonstration intégrée
- **Production** : Clés générées dynamiquement ou via HSM
- **Rotation** : Support de la rotation des clés
- **Validation** : Vérification stricte de la taille (32 bytes)
### Processus de chiffrement
#### Côté serveur (API)
```python
def encrypt_content(content: str, key: bytes) -> bytes:
# Génération d'un nonce aléatoire
nonce = os.urandom(12)
# Création du chiffreur
cipher = ChaCha20Poly1305(key)
# Chiffrement avec authentification
encrypted = cipher.encrypt(nonce, content.encode('utf-8'), None)
# Retour : nonce + données chiffrées
return base64.b64encode(nonce + encrypted)
```
#### Côté client (SDK)
```typescript
private decryptContent(encryptedContent: Buffer): string {
// Décodage base64
const decoded = Buffer.from(encryptedContent.toString(), 'base64');
// Extraction du nonce (12 premiers bytes)
const nonce = decoded.subarray(0, 12);
const ciphertext = decoded.subarray(12);
// Déchiffrement
const decipher = createDecipher('chacha20-poly1305', this.decryptionKey, nonce);
let decrypted = decipher.update(ciphertext, undefined, 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
```
## Sécurité du transport (HTTPS)
### Configuration TLS
```python
# Configuration SSL sécurisée
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.minimum_version = ssl.TLSVersion.TLSv1_2
context.set_ciphers('ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM:DHE+CHACHA20:!aNULL:!MD5:!DSS')
```
#### Suites cryptographiques supportées
- **ECDHE+AESGCM** : Échange de clés elliptique + AES-GCM
- **ECDHE+CHACHA20** : Échange de clés elliptique + ChaCha20
- **DHE+AESGCM** : Échange de clés Diffie-Hellman + AES-GCM
- **DHE+CHACHA20** : Échange de clés Diffie-Hellman + ChaCha20
#### Protocoles interdits
- **TLS 1.0/1.1** : Versions obsolètes
- **SSL** : Protocole obsolète
- **NULL** : Chiffrement nul
- **MD5** : Hash faible
- **DSS** : Algorithme faible
### Certificats
#### Développement
- **Type** : Certificats auto-signés
- **Génération** : Automatique au démarrage
- **Validation** : Désactivée côté client (`verifySsl: false`)
#### Production
- **Type** : Certificats signés par une CA
- **Validation** : Obligatoire côté client
- **Rotation** : Automatique avant expiration
## Contrôle d'accès
### Validation des chemins
```python
def validate_path(env: str, file_path: str) -> bool:
# Construction du chemin complet
full_path = STORAGE_ROOT / env / file_path
# Vérification de sécurité
if not str(full_path.resolve()).startswith(str(STORAGE_ROOT.resolve())):
return False
# Vérification de l'existence
return full_path.exists() and full_path.is_file()
```
#### Protection contre
- **Traversée de répertoires** : `../../../etc/passwd`
- **Chemins absolus** : `/etc/passwd`
- **Accès hors storage** : Toute tentative d'accès en dehors du répertoire `storage/`
### Variables d'environnement
#### Traitement sécurisé
```python
def resolve_variable(var_name: str, visited: set = None) -> str:
# Détection des dépendances circulaires
if visited is None:
visited = set()
if var_name in visited:
logger.warning(f"Dépendance circulaire détectée pour {var_name}")
return f"${{{var_name}}}"
# Résolution récursive sécurisée
visited.add(var_name)
value = self.variables[var_name]
# Traitement des sous-variables
pattern = r'\$\{([^}]+)\}'
matches = re.findall(pattern, value)
for match in matches:
resolved_value = self._resolve_variable(match, visited.copy())
value = value.replace(f"${{{match}}}", resolved_value)
return value
```
#### Sécurité des variables
- **Validation** : Vérification de la syntaxe des variables
- **Circularité** : Détection des dépendances circulaires
- **Injection** : Protection contre l'injection de code
- **Limitation** : Limite de profondeur de résolution
## Audit et monitoring
### Logging sécurisé
```python
# Logs d'accès
logger.info(f"Served file: {env}/{file_path}")
# Logs d'erreur
logger.error(f"Erreur lors du service du fichier {env}/{file_path}: {e}")
# Logs de sécurité
logger.warning(f"Tentative d'accès non autorisé: {file_path}")
```
#### Types de logs
- **Accès** : Tous les accès aux fichiers
- **Erreurs** : Erreurs de traitement et de chiffrement
- **Sécurité** : Tentatives d'accès non autorisé
- **Performance** : Métriques de performance
### Métriques de sécurité
```python
# Métriques collectées
security_metrics = {
'failed_decryptions': 0,
'unauthorized_access_attempts': 0,
'invalid_paths_attempted': 0,
'circular_dependency_detections': 0
}
```
## Gestion des secrets
### Clés de chiffrement
#### Développement
```python
# Clés de session dynamiques générées automatiquement
# Plus de clé fixe exposée dans le code
```
#### Production
```python
# Génération sécurisée des clés
def generate_production_key():
# Utilisation d'un générateur cryptographiquement sécurisé
return os.urandom(32)
# Stockage sécurisé (exemple avec HSM)
def load_key_from_hsm(key_id: str):
# Intégration avec un Hardware Security Module
return hsm_client.get_key(key_id)
```
### Rotation des clés
```python
class KeyRotationManager:
def __init__(self):
self.current_key = self.load_current_key()
self.next_key = self.generate_next_key()
def rotate_keys(self):
# Rotation des clés
old_key = self.current_key
self.current_key = self.next_key
self.next_key = self.generate_next_key()
# Nettoyage de l'ancienne clé
self.secure_delete(old_key)
```
## Bonnes pratiques de sécurité
### Développement
#### Clés dynamiques
```typescript
// ✅ Bon : Pas de clé en dur, clés dynamiques automatiques
const client = new VaultClient({
baseUrl: 'https://vault.4nkweb.com:6666'
});
// ❌ Mauvais : Clé fixe exposée dans le code
const client = new VaultClient({
baseUrl: 'https://vault.4nkweb.com:6666'
}, 'fixed-key-here'); // Déprécié
```
#### Validation des entrées
```typescript
// ✅ Bon : Validation stricte
if (!VaultCrypto.validateKey(key)) {
throw new Error('Clé invalide');
}
// ❌ Mauvais : Pas de validation
const cipher = createDecipher('chacha20-poly1305', key);
```
### Production
#### Configuration sécurisée
```python
# ✅ Bon : Configuration de production
PRODUCTION_CONFIG = {
'verify_ssl': True,
'cert_validation': True,
'key_rotation_interval': 86400, # 24h
'max_file_size': 10 * 1024 * 1024, # 10MB
'rate_limit': 100 # req/min
}
```
#### Monitoring
```python
# ✅ Bon : Monitoring de sécurité
def log_security_event(event_type: str, details: dict):
security_logger.warning({
'event': event_type,
'timestamp': datetime.utcnow(),
'details': details,
'severity': 'HIGH'
})
```
## Conformité et standards
### Standards de chiffrement
- **NIST SP 800-57** : Recommandations pour la gestion des clés
- **FIPS 140-2** : Standards pour les modules cryptographiques
- **Common Criteria** : Évaluation de la sécurité des produits IT
### Algorithmes approuvés
- **ChaCha20** : RFC 8439
- **Poly1305** : RFC 8439
- **SHA-256** : FIPS 180-4
- **TLS 1.2+** : RFC 5246, RFC 8446
### Résistance quantique
Le choix de ChaCha20-Poly1305 offre une résistance quantique à court terme :
- **Attaques classiques** : Résistance prouvée
- **Attaques quantiques** : Résistance estimée jusqu'en 2030
- **Migration** : Plan de migration vers des algorithmes post-quantiques
## Incident Response
### Procédure d'incident
1. **Détection** : Monitoring automatique des anomalies
2. **Analyse** : Investigation des logs et métriques
3. **Containment** : Isolation des systèmes affectés
4. **Éradication** : Correction des vulnérabilités
5. **Récupération** : Remise en service sécurisée
6. **Lessons learned** : Amélioration des procédures
### Contacts de sécurité
- **Équipe sécurité** : security@4nkweb.com
- **Incident response** : incident@4nkweb.com
- **Urgence** : +33 1 XX XX XX XX
## Mise à jour et maintenance
### Gestion des vulnérabilités
```python
# Processus de mise à jour de sécurité
def update_security_patches():
# Vérification des mises à jour
patches = check_security_updates()
for patch in patches:
if patch.severity >= 'HIGH':
apply_patch(patch)
notify_security_team(patch)
```
### Tests de sécurité
```bash
# Tests de sécurité automatisés
npm run test:security
python3 -m pytest tests/security/
# Audit de sécurité
npm audit
pip-audit
```
---
**Dernière révision** : 2025-09-29
**Version** : 1.0.0
**Prochaine révision** : 2025-12-29