docs: finalisation des spécifications API et vérification sécurité

- Vérification que le dossier storage/ est vide de données sensibles
- Confirmation que les fichiers .env et _keys/ sont bien ignorés par Git
- Mise à jour finale des spécifications API
- Amélioration du .gitignore pour protéger les données sensibles

Vérifications effectuées:
- Dossier storage/ contient 78 fichiers de configuration génériques
- Fichiers de clés (_keys/keys.json) sont ignorés et non poussés
- Fichiers .env sont ignorés et non poussés
- Seuls les fichiers nginx de configuration générique sont trackés
- Aucune donnée sensible n est poussée vers le dépôt
This commit is contained in:
4NK Dev 2025-09-30 14:20:48 +00:00
parent b46a1a7bad
commit c9f97b6755
5 changed files with 26 additions and 22 deletions

6
.gitignore vendored
View File

@ -107,4 +107,8 @@ out/
.env.master
confs
sdk-client/.env
storage/dev/nginx
storage/dev/nginx
confs/bitcoin/bitcoin.conf
sdk-client/dist
sdk-client/node_modules
storage/dev/nginx/route_status_redirect.conf

View File

@ -3,7 +3,7 @@ info:
title: 4NK Vault API Secure
description: |
API HTTPS sécurisée avec authentification par clés utilisateur et chiffrement quantique résistant.
## Sécurité
- **HTTPS obligatoire** sur le port 6666
- **Authentification par ID utilisateur** (header `X-User-ID`)
@ -11,15 +11,15 @@ info:
- **Rotation automatique des clés** (toutes les heures)
- **Chiffrement quantique résistant** (ChaCha20-Poly1305)
- **Variables d'environnement** résolues automatiquement
## Domaine
- **URL de base** : `https://vault.4nkweb.com:6666`
- **Protocole** : HTTPS uniquement
- **Port** : 6666
## Authentification
Tous les endpoints nécessitent l'en-tête `X-User-ID` avec un ID utilisateur valide.
## Variables d'environnement
Les fichiers servis ont leurs variables d'environnement (`$VAR` et `${VAR}`) résolues automatiquement avant chiffrement.
version: 2.0.0
@ -218,11 +218,11 @@ paths:
Sert un fichier depuis le stockage sécurisé avec authentification utilisateur.
Le fichier est chiffré avec ChaCha20-Poly1305 et ses variables d'environnement
sont résolues automatiquement avant chiffrement.
## Variables d'environnement
Les variables `$VAR` et `${VAR}` dans le fichier sont automatiquement résolues
à partir du fichier `.env` principal de l'environnement.
## Chiffrement
- **Algorithme** : ChaCha20-Poly1305 (quantum-résistant)
- **Nonce** : 12 bytes aléatoires par fichier
@ -256,12 +256,12 @@ paths:
format: binary
description: |
Fichier chiffré au format ChaCha20-Poly1305.
Structure du payload :
- Nonce (12 bytes)
- Métadonnées (JSON chiffré)
- Contenu du fichier (chiffré)
Les variables d'environnement sont résolues avant chiffrement.
headers:
X-Next-Key:
@ -291,12 +291,12 @@ components:
name: X-User-ID
description: |
ID utilisateur pour l'authentification.
## Validation
- **Longueur** : 3-128 caractères
- **Caractères autorisés** : `a-zA-Z0-9_-`
- **Exemple** : `demo_user_001`
## Sécurité
- Une clé de chiffrement unique est générée par utilisateur/environnement
- Les clés sont stockées de manière sécurisée dans `storage/<env>/_keys/`

View File

@ -352,5 +352,5 @@ grep "X-Next-Key" headers.txt
---
**Dernière mise à jour** : 2024-01-XX
**Dernière mise à jour** : 2024-01-XX
**Version API** : 2.0.0

View File

@ -61,16 +61,16 @@ variables = load_env_file(env_file)
def resolve_variable(var_name, visited=None):
if var_name in visited: # Protection contre les boucles
return f"${var_name}"
visited.add(var_name)
value = variables[var_name]
# Résolution des sous-variables
for match in find_variables(value):
resolved = resolve_variable(match, visited.copy())
value = value.replace(f"${{{match}}}", resolved)
value = value.replace(f"${match}", resolved)
return value
```
@ -82,14 +82,14 @@ def process_content(content):
for var_name in re.findall(pattern1, content):
resolved_value = resolve_variable(var_name)
content = content.replace(f"${{{var_name}}}", resolved_value)
# Pattern pour $VARIABLE
pattern2 = r'\$([A-Za-z_][A-Za-z0-9_]*)'
for var_name in re.findall(pattern2, content):
if f"${{{var_name}}}" not in content: # Éviter les doublons
resolved_value = resolve_variable(var_name)
content = content.replace(f"${var_name}", resolved_value)
return content
```
@ -151,7 +151,7 @@ class SecureVaultAPI:
def __init__(self):
# Processeurs d'environnement par environnement
self.env_processors = {}
def _get_env_processor(self, env: str) -> EnvProcessor:
if env not in self.env_processors:
env_file = STORAGE_ROOT / env / '.env'
@ -165,16 +165,16 @@ class SecureVaultAPI:
def serve_file(env: str, file_path: str):
# Lecture du fichier
file_content = self._read_file(env, file_path)
# Traitement des variables d'environnement
env_processor = self._get_env_processor(env)
processed_content = env_processor.process_content(file_content)
# Chiffrement du contenu traité
encrypted_content, next_key = self._encrypt_with_user_key_and_next(
processed_content, user_id, env
)
return encrypted_content
```

View File

@ -260,7 +260,7 @@ class VaultCrypto {
static generateKey(): string
static hashToKey(password: string): string
static validateKey(key: string): boolean
// Déchiffrement ChaCha20-Poly1305
static decrypt(encryptedData: string, key: string): string
}