docs: mise à jour complète de la documentation

- Ajout du guide des variables d environnement
- Mise à jour du README principal avec nouvelles fonctionnalités
- Mise à jour de la documentation SDK avec SecureVaultClient
- Ajout du CHANGELOG détaillé
- Documentation des nouvelles fonctionnalités:
  * Traitement automatique des variables VAR et VAR
  * Résolution récursive des dépendances
  * Protection contre les boucles infinies
  * Synchronisation locale des fichiers déchiffrés
  * Déchiffrement réel avec noble/ciphers
  * Configuration automatique via .env
  * Rotation automatique des clés

Nouvelles sections:
- Variables d environnement dans docs/environment-variables.md
- Exemples concrets de résolution de variables
- Guide de debugging et logs
- Intégration SDK avec variables résolues
- Protection sécurité et bonnes pratiques
This commit is contained in:
4NK Dev 2025-09-30 14:15:49 +00:00
parent aa67784fe2
commit 86ffa1f315
5 changed files with 547 additions and 77 deletions

114
CHANGELOG.md Normal file
View File

@ -0,0 +1,114 @@
# Changelog 4NK Vault
Toutes les modifications notables de ce projet seront documentées dans ce fichier.
Le format est basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/),
et ce projet adhère au [Semantic Versioning](https://semver.org/lang/fr/).
## [1.2.0] - 2024-01-XX
### 🚀 Ajouté
#### API Server
- **Traitement des variables d'environnement** : Résolution automatique des variables `$VAR` et `${VAR}`
- **Résolution récursive** : Les variables peuvent référencer d'autres variables
- **Protection contre les boucles infinies** : Détection automatique des dépendances circulaires
- **Endpoint `/routes`** : Liste dynamique de toutes les routes disponibles
- **Scan dynamique** : Découverte automatique des environnements et fichiers
- **Protection renforcée** : Validation stricte des chemins contre les attaques de traversée
- **Compatibilité cryptographique** : Harmonisation avec `@noble/ciphers` pour le SDK
#### SDK Client
- **Configuration automatique** : Chargement automatique via fichier `.env`
- **Déchiffrement réel** : Implémentation ChaCha20-Poly1305 avec `@noble/ciphers`
- **Synchronisation locale** : Miroir automatique des fichiers déchiffrés vers `../confs/`
- **Rotation automatique des clés** : Mise à jour transparente des clés de déchiffrement
- **Variables d'environnement** : Récupération automatique des fichiers avec variables résolues
- **Gestion d'erreurs améliorée** : Classes d'erreurs spécialisées pour chaque type de problème
#### Documentation
- **Guide des variables d'environnement** : Documentation complète du système de résolution
- **Exemples mis à jour** : Scénarios complets avec 5 étapes
- **API Reference** : Documentation complète des nouvelles fonctionnalités
- **Changelog** : Historique détaillé des modifications
### 🔧 Modifié
#### API Server
- **Validation des IDs utilisateur** : Extension de 50 à 128 caractères pour supporter les clés longues
- **Gestion des clés** : Amélioration de la logique de rotation pour éviter les conflits
- **Structure des réponses** : Ajout de métadonnées sur les variables résolues
- **Logs** : Amélioration du système de logging pour le debugging
#### SDK Client
- **Architecture** : Refactoring complet vers `SecureVaultClient`
- **Types TypeScript** : Mise à jour des interfaces pour les nouvelles fonctionnalités
- **Configuration** : Simplification de la configuration via `.env`
- **Synchronisation** : Écrasement automatique des fichiers existants
### 🐛 Corrigé
#### API Server
- **Dépendances circulaires** : Correction du problème `HOST``DOMAIN`
- **Chargement des variables** : Priorité correcte du fichier `.env` principal
- **Validation des chemins** : Protection contre les attaques de traversée
- **Compatibilité cryptographique** : Synchronisation avec le SDK Node.js
#### SDK Client
- **Déchiffrement** : Correction de l'incompatibilité Python `cryptography` ↔ Node.js `crypto`
- **Gestion des clés** : Correction de la logique de rotation et de mise à jour
- **SSL** : Correction de la gestion des certificats auto-signés
- **Types** : Correction des erreurs TypeScript strict
### 🔒 Sécurité
#### API Server
- **Validation renforcée** : Protection contre les chemins relatifs malveillants
- **Isolation** : Traitement des variables en mémoire uniquement
- **Audit** : Logs détaillés des accès et modifications
#### SDK Client
- **Chiffrement** : Migration vers `@noble/ciphers` pour une meilleure sécurité
- **Gestion des clés** : Rotation automatique et sécurisée
- **Validation** : Vérification stricte des clés et certificats
## [1.1.0] - 2024-01-XX
### 🚀 Ajouté
- **Authentification par clés utilisateur** : Système d'authentification basé sur des IDs utilisateur
- **Rotation automatique des clés** : Rotation des clés de chiffrement toutes les heures
- **Chiffrement quantique résistant** : Implémentation ChaCha20-Poly1305
- **SDK TypeScript** : Client TypeScript pour l'interaction avec l'API
- **Endpoints de monitoring** : `/health`, `/info` pour la surveillance
### 🔧 Modifié
- **Architecture sécurisée** : Refactoring complet pour la sécurité
- **HTTPS obligatoire** : Toutes les communications en HTTPS
- **Stockage sécurisé** : Isolation des clés par environnement
### 🔒 Sécurité
- **Clés individuelles** : Une clé par utilisateur et par environnement
- **Métadonnées sécurisées** : Timestamps et versions de clés
- **Protection des fichiers** : Exclusion des clés du versioning Git
## [1.0.0] - 2024-01-XX
### 🚀 Ajouté
- **API REST de base** : Endpoints de base pour la gestion des fichiers
- **Stockage local** : Système de stockage dans `storage/`
- **Documentation** : Documentation initiale du projet
- **Tests** : Tests de base pour l'API
---
## 📋 Format des versions
- **MAJOR** : Changements incompatibles avec l'API
- **MINOR** : Nouvelles fonctionnalités compatibles
- **PATCH** : Corrections de bugs compatibles
## 🔗 Liens
- [Repository](https://git.4nkweb.com:4nk/4NK_vault.git)
- [Documentation](docs/)
- [Issues](https://git.4nkweb.com:4nk/4NK_vault/issues)

View File

@ -10,13 +10,16 @@ API HTTPS sécurisée avec authentification par clés utilisateur et chiffrement
- **Rotation automatique des clés** (toutes les heures) - **Rotation automatique des clés** (toutes les heures)
- **Chiffrement quantique résistant** (ChaCha20-Poly1305) - **Chiffrement quantique résistant** (ChaCha20-Poly1305)
- **Stockage sécurisé** dans `storage/<env>/_keys/` - **Stockage sécurisé** dans `storage/<env>/_keys/`
- **Traitement des variables d'environnement** en mémoire
- **Protection contre les attaques de traversée de chemins**
## 🚀 Fonctionnalités ## 🚀 Fonctionnalités
### Authentification ### Authentification
- **ID utilisateur requis** pour tous les accès - **ID utilisateur requis** pour tous les accès
- **Validation stricte** : 3-50 caractères alphanumériques + `_` et `-` - **Validation stricte** : 3-128 caractères alphanumériques + `_` et `-`
- **Clés uniques** par combinaison utilisateur/environnement - **Clés uniques** par combinaison utilisateur/environnement
- **Support des clés longues** (hash SHA256 des IDs utilisateur)
### Gestion des clés ### Gestion des clés
- **Génération automatique** de clés de 32 bytes - **Génération automatique** de clés de 32 bytes
@ -24,6 +27,13 @@ API HTTPS sécurisée avec authentification par clés utilisateur et chiffrement
- **Sauvegarde de l'ancienne clé** pour compatibilité - **Sauvegarde de l'ancienne clé** pour compatibilité
- **Isolation par environnement** (dev, prod, etc.) - **Isolation par environnement** (dev, prod, etc.)
### Variables d'environnement
- **Résolution automatique** des variables `$VAR` et `${VAR}`
- **Résolution récursive** des dépendances entre variables
- **Chargement du fichier `.env` principal** uniquement
- **Traitement en mémoire** (fichiers originaux non modifiés)
- **Protection contre les dépendances circulaires**
## 📋 Endpoints ## 📋 Endpoints
### `GET /health` ### `GET /health`
@ -51,8 +61,11 @@ X-User-ID: your_user_id
### `GET /info` ### `GET /info`
Informations sur l'API avec authentification. Informations sur l'API avec authentification.
### `GET /routes`
Liste toutes les routes disponibles avec exemples de fichiers.
### `GET /<env>/<file>` ### `GET /<env>/<file>`
Sert un fichier chiffré avec authentification utilisateur. Sert un fichier chiffré avec authentification utilisateur et variables d'environnement résolues.
**Headers requis :** **Headers requis :**
``` ```
@ -112,6 +125,13 @@ python3 test_api.py
- **ChaCha20-Poly1305** (quantum-résistant) - **ChaCha20-Poly1305** (quantum-résistant)
- **Rotation automatique** des clés - **Rotation automatique** des clés
- **Métadonnées sécurisées** dans le payload - **Métadonnées sécurisées** dans le payload
- **Compatibilité API/SDK** avec `@noble/ciphers`
### Variables d'environnement
- **Résolution automatique** avant chiffrement
- **Support des syntaxes** `$VAR` et `${VAR}`
- **Dépendances récursives** résolues automatiquement
- **Protection contre les boucles** infinies
### Stockage ### Stockage
- **Isolation par environnement** : `storage/<env>/_keys/` - **Isolation par environnement** : `storage/<env>/_keys/`
@ -122,24 +142,32 @@ python3 test_api.py
``` ```
4NK_vault/ 4NK_vault/
├── api_server.py # Serveur sécurisé principal ├── api_server.py # Serveur sécurisé principal avec EnvProcessor
├── start_api.sh # Script de démarrage sécurisé ├── start_api.sh # Script de démarrage sécurisé
├── test_api.py # Tests de l'API sécurisée ├── test_api.py # Tests de l'API sécurisée
├── requirements.txt # Dépendances Python ├── requirements.txt # Dépendances Python
├── SECURITY_NOTICE.md # Avertissements de sécurité ├── SECURITY_NOTICE.md # Avertissements de sécurité
├── storage/ # Fichiers de configuration (lecture seule) ├── storage/ # Fichiers de configuration (lecture seule)
│ ├── dev/ │ ├── dev/
│ │ ├── .env # Variables d'environnement │ │ ├── .env # Variables d'environnement principales
│ │ ├── _keys/ # Clés utilisateur (auto-créé) │ │ ├── _keys/ # Clés utilisateur (auto-créé)
│ │ └── bitcoin/ │ │ ├── bitcoin/ # Configurations avec variables résolues
│ │ ├── tor/ # Configurations avec variables résolues
│ │ └── [autres services]/
│ └── prod/ │ └── prod/
│ ├── _keys/ # Clés utilisateur (auto-créé) │ ├── _keys/ # Clés utilisateur (auto-créé)
│ └── bitcoin/ │ └── [configurations]/
├── sdk-client/ # Client TypeScript ├── confs/ # Fichiers déchiffrés synchronisés (auto-créé)
│ ├── bitcoin/ # Configurations avec variables résolues
│ ├── tor/ # Configurations avec variables résolues
│ └── [autres services]/
├── sdk-client/ # Client TypeScript avec chiffrement
│ ├── src/ │ ├── src/
│ │ ├── index.ts # Client original (déprécié) │ │ └── index.ts # Client sécurisé avec @noble/ciphers
│ │ └── secure-client.ts # Client sécurisé │ ├── examples/
│ └── examples/ │ │ └── usage.ts # Scénario complet 5 étapes
│ ├── .env # Configuration SDK (VAULT_USER, VAULT_KEY, VAULT_ENV)
│ └── dist/ # Code compilé TypeScript
└── docs/ # Documentation complète └── docs/ # Documentation complète
``` ```

View File

@ -0,0 +1,282 @@
# Traitement des Variables d'Environnement
## 🔧 Vue d'ensemble
L'API Vault 4NK intègre un système avancé de traitement des variables d'environnement qui résout automatiquement les références de variables dans les fichiers de configuration avant leur chiffrement et transmission.
## 🚀 Fonctionnalités
### Résolution automatique des variables
- **Syntaxes supportées** : `$VAR` et `${VAR}`
- **Résolution récursive** : Les variables peuvent référencer d'autres variables
- **Protection contre les boucles infinies** : Détection automatique des dépendances circulaires
- **Traitement en mémoire** : Les fichiers originaux ne sont jamais modifiés
### Sources de variables
- **Fichier `.env` principal** : `storage/<env>/.env`
- **Variables système** : Non utilisées (isolation complète)
- **Fichiers de sous-répertoires** : Non chargés (configurations spécifiques aux services)
## 📋 Syntaxes supportées
### Syntaxe simple : `$VAR`
```bash
# Variables de base
DOMAIN=4nkweb.com
HOST=dev4.$DOMAIN
ROOT_HOST=$HOST
ROOT_URL=https://$ROOT_HOST
# Résolution automatique
DOMAIN → 4nkweb.com
HOST → dev4.4nkweb.com
ROOT_HOST → dev4.4nkweb.com
ROOT_URL → https://dev4.4nkweb.com
```
### Syntaxe avec accolades : `${VAR}`
```bash
# Variables complexes
LOG_DIR=/home/debian/4NK_env/logs
BITCOIN_LOG_DIR=${LOG_DIR}/bitcoin
TOR_LOG_DIR=${LOG_DIR}/tor
# Résolution automatique
LOG_DIR → /home/debian/4NK_env/logs
BITCOIN_LOG_DIR → /home/debian/4NK_env/logs/bitcoin
TOR_LOG_DIR → /home/debian/4NK_env/logs/tor
```
## 🔄 Processus de résolution
### 1. Chargement des variables
```python
# Seul le fichier .env principal est chargé
env_file = STORAGE_ROOT / env / '.env'
variables = load_env_file(env_file)
```
### 2. Résolution récursive
```python
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
```
### 3. Traitement du contenu
```python
def process_content(content):
# Pattern pour ${VARIABLE}
pattern1 = r'\$\{([^}]+)\}'
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
```
## 🛡️ Sécurité et protection
### Protection contre les attaques
- **Dépendances circulaires** : Détection et prévention automatiques
- **Variables non définies** : Conservation de la syntaxe originale
- **Isolation** : Seul le fichier `.env` principal est utilisé
### Exemples de protection
```bash
# Dépendance circulaire détectée
HOST=dev4.$DOMAIN
DOMAIN=$HOST
# Résultat : Conservation de la syntaxe
HOST → dev4.$DOMAIN # Variable non résolue
DOMAIN → $HOST # Variable non résolue
```
## 📁 Structure des fichiers
### Fichier `.env` principal
```bash
# storage/dev/.env
DOMAIN=4nkweb.com
HOST=dev4.$DOMAIN
ROOT_HOST=$HOST
ROOT_URL=https://$ROOT_HOST
ROOT_DIR_LOGS=/home/debian/4NK_env/logs
TOR_LOGS_DIR=$ROOT_DIR_LOGS/tor
SDK_TOR_DATA_DIR=$ROOT_DIR_LOGS/sdk_tor
```
### Fichiers de configuration
```bash
# storage/dev/bitcoin/bitcoin.conf
datadir=$ROOT_DIR_LOGS/bitcoin
logdir=$ROOT_DIR_LOGS/bitcoin
rpcbind=$HOST
rpcport=8332
```
### Résolution automatique
```bash
# Contenu après résolution (en mémoire)
datadir=/home/debian/4NK_env/logs/bitcoin
logdir=/home/debian/4NK_env/logs/bitcoin
rpcbind=dev4.4nkweb.com
rpcport=8332
```
## 🔧 Configuration de l'API
### Initialisation
```python
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'
self.env_processors[env] = EnvProcessor(env_file)
return self.env_processors[env]
```
### Utilisation dans les endpoints
```python
@self.app.route('/<env>/<path:file_path>', methods=['GET'])
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
```
## 🧪 Tests et validation
### Test de résolution
```python
# Test des variables d'environnement
env_processor = EnvProcessor(Path("storage/dev/.env"))
# Test de résolution simple
result = env_processor.process_content("Host: $HOST")
assert result == "Host: dev4.4nkweb.com"
# Test de résolution complexe
result = env_processor.process_content("URL: $ROOT_URL/api")
assert result == "URL: https://dev4.4nkweb.com/api"
```
### Validation des dépendances
```python
# Test de protection contre les boucles
env_processor.process_content("$CIRCULAR_VAR")
# Résultat : $CIRCULAR_VAR (conservé tel quel)
```
## 📊 Exemples concrets
### Configuration Bitcoin
```bash
# Avant résolution
datadir=$ROOT_DIR_LOGS/bitcoin
logdir=$ROOT_DIR_LOGS/bitcoin
rpcbind=$HOST
rpcport=8332
# Après résolution (automatique)
datadir=/home/debian/4NK_env/logs/bitcoin
logdir=/home/debian/4NK_env/logs/bitcoin
rpcbind=dev4.4nkweb.com
rpcport=8332
```
### Configuration Tor
```bash
# Avant résolution
DataDirectory $SDK_TOR_DATA_DIR
Log notice file $TOR_LOGS_DIR/tor.log
SocksPort $HOST:9050
# Après résolution (automatique)
DataDirectory /home/debian/4NK_env/logs/sdk_tor
Log notice file /home/debian/4NK_env/logs/tor/tor.log
SocksPort dev4.4nkweb.com:9050
```
## 🔍 Debugging et logs
### Activation des logs
```python
import logging
logging.basicConfig(level=logging.INFO)
# Logs automatiques
logger.info(f"Variables chargées depuis {env_file}: {len(variables)} variables")
logger.info(f"Variable résolue: {var_name} = {resolved_value}")
logger.warning(f"Dépendance circulaire détectée pour {var_name}")
```
### Messages de debug
```
INFO: Variables chargées depuis storage/dev/.env: 15 variables
INFO: Variable résolue: HOST = dev4.4nkweb.com
INFO: Variable résolue: ROOT_URL = https://dev4.4nkweb.com
WARNING: Variable non trouvée: UNDEFINED_VAR
```
## 🌐 Intégration SDK
### Récupération des fichiers traités
```typescript
// Le SDK reçoit automatiquement les fichiers avec variables résolues
const file = await client.getFile('dev', 'bitcoin/bitcoin.conf');
console.log(file.content); // Variables déjà résolues
// Vérification des variables résolues
const hasVariables = file.content.includes('$');
console.log(`Variables résolues: ${!hasVariables}`);
```
### Synchronisation locale
```typescript
// Synchronisation avec variables résolues
const syncResult = await client.syncLocalFiles({
environment: 'dev',
localDir: '../confs'
});
// Les fichiers dans confs/ contiennent les variables résolues
console.log(`Fichiers synchronisés: ${syncResult.synced}`);
```
---
**Note** : Le traitement des variables d'environnement est entièrement transparent pour l'utilisateur final. Les fichiers originaux dans `storage/` ne sont jamais modifiés, et toutes les résolutions se font en mémoire lors de la récupération des fichiers.

View File

@ -22,6 +22,9 @@ Instructions complètes pour déployer le système sécurisé en développement
### 💻 [Documentation SDK](sdk-documentation.md) ### 💻 [Documentation SDK](sdk-documentation.md)
Documentation complète du SDK TypeScript sécurisé avec exemples et API reference. Documentation complète du SDK TypeScript sécurisé avec exemples et API reference.
### 🔧 [Variables d'environnement](environment-variables.md)
Traitement automatique des variables d'environnement avec résolution récursive et protection contre les boucles infinies.
## 🔐 Sécurité Avancée ## 🔐 Sécurité Avancée
### Authentification par clés utilisateur ### Authentification par clés utilisateur
@ -34,6 +37,12 @@ Documentation complète du SDK TypeScript sécurisé avec exemples et API refere
- **ChaCha20-Poly1305** pour le chiffrement - **ChaCha20-Poly1305** pour le chiffrement
- **HTTPS obligatoire** pour toutes les communications - **HTTPS obligatoire** pour toutes les communications
- **Métadonnées sécurisées** avec timestamps et versions de clés - **Métadonnées sécurisées** avec timestamps et versions de clés
- **Compatibilité API/SDK** avec `@noble/ciphers`
### Variables d'environnement
- **Résolution automatique** des variables `$VAR` et `${VAR}`
- **Traitement en mémoire** (fichiers originaux non modifiés)
- **Protection contre les boucles** infinies
## 🎯 Démarrage rapide ## 🎯 Démarrage rapide
@ -56,17 +65,20 @@ curl -k -H "X-User-ID: demo_user_001" https://127.0.0.1:6666/health
### Utilisation avec le SDK TypeScript ### Utilisation avec le SDK TypeScript
```typescript ```typescript
import { createSecureVaultClient } from '@4nk/vault-sdk'; import { SecureVaultClient } from '@4nk/vault-sdk';
// Création du client avec authentification // Création du client (charge automatiquement le .env)
const client = createSecureVaultClient( const client = new SecureVaultClient();
'https://vault.4nkweb.com:6666',
'your_user_id' // ID utilisateur obligatoire
);
// Récupération d'un fichier chiffré // Récupération d'un fichier avec variables résolues
const file = await client.getFile('dev', 'bitcoin/bitcoin.conf'); const file = await client.getFile('dev', 'bitcoin/bitcoin.conf');
console.log(file.content); // Contenu déchiffré avec la clé utilisateur console.log(file.content); // Contenu déchiffré avec variables résolues
// Synchronisation locale
const syncResult = await client.syncLocalFiles({
environment: 'dev',
localDir: '../confs'
});
``` ```
## 🔑 Gestion des clés ## 🔑 Gestion des clés
@ -100,6 +112,7 @@ Voir [SECURITY_NOTICE.md](../SECURITY_NOTICE.md) pour les détails sur :
- **[Comprendre la sécurité](security-model.md)** → Modèle de sécurité complet - **[Comprendre la sécurité](security-model.md)** → Modèle de sécurité complet
- **[Utiliser l'API](api-reference.md)** → Référence des endpoints sécurisés - **[Utiliser l'API](api-reference.md)** → Référence des endpoints sécurisés
- **[Développer avec le SDK](sdk-documentation.md)** → SDK TypeScript sécurisé - **[Développer avec le SDK](sdk-documentation.md)** → SDK TypeScript sécurisé
- **[Comprendre les variables d'environnement](environment-variables.md)** → Traitement automatique des variables
- **[Déployer en production](deployment-guide.md)** → Guide de déploiement sécurisé - **[Déployer en production](deployment-guide.md)** → Guide de déploiement sécurisé
- **[Tester le système](api-specification.md)** → Spécifications techniques - **[Tester le système](api-specification.md)** → Spécifications techniques

View File

@ -5,12 +5,14 @@ Un SDK TypeScript moderne et type-safe pour interagir avec l'API Vault 4NK, perm
## 🚀 Caractéristiques ## 🚀 Caractéristiques
- **Type-safe** : Entièrement écrit en TypeScript avec types stricts - **Type-safe** : Entièrement écrit en TypeScript avec types stricts
- **Chiffrement quantique résistant** : Support de ChaCha20-Poly1305 - **Chiffrement quantique résistant** : Support de ChaCha20-Poly1305 avec @noble/ciphers
- **Gestion d'erreurs avancée** : Classes d'erreurs spécialisées - **Gestion d'erreurs avancée** : Classes d'erreurs spécialisées
- **Requêtes parallèles** : Récupération de plusieurs fichiers simultanément - **Requêtes parallèles** : Récupération de plusieurs fichiers simultanément
- **Configuration flexible** : Timeouts, SSL, etc. - **Configuration flexible** : Timeouts, SSL, etc.
- **Utilitaires crypto** : Génération et validation de clés - **Synchronisation locale** : Miroir automatique des fichiers déchiffrés
- **Variables d'environnement** : Résolution automatique des variables $VAR
- **Monitoring** : Endpoints de santé et d'information - **Monitoring** : Endpoints de santé et d'information
- **Rotation automatique des clés** : Mise à jour transparente des clés
## 📦 Installation ## 📦 Installation
@ -20,21 +22,30 @@ npm install @4nk/vault-sdk
## 🔧 Configuration ## 🔧 Configuration
### Clé de déchiffrement ### Configuration automatique via .env
Le SDK nécessite une clé de déchiffrement de 32 bytes pour déchiffrer les fichiers : Le SDK peut être configuré automatiquement via un fichier `.env` :
```bash
# .env
VAULT_USER=demo_user_001
VAULT_KEY=JYyybYFXe9hghRI9d1mpoQ1uYYxpt/6lzYPOWrxruG0=
VAULT_ENV=dev
```
### Configuration manuelle
```typescript ```typescript
import { VaultCrypto } from '@4nk/vault-sdk'; import { SecureVaultClient } from '@4nk/vault-sdk';
// Génération d'une clé aléatoire // Configuration manuelle
const randomKey = VaultCrypto.generateKey(); const client = new SecureVaultClient({
baseUrl: 'https://vault.4nkweb.com:6666',
// Ou dérivation depuis un mot de passe userId: 'demo_user_001',
const derivedKey = VaultCrypto.hashToKey('mon-mot-de-passe-secret'); vaultKey: 'base64-encoded-key',
environment: 'dev',
// Validation d'une clé verifySsl: false // Pour les certificats auto-signés
const isValid = VaultCrypto.validateKey(myKey); });
``` ```
## 📖 Utilisation ## 📖 Utilisation
@ -42,20 +53,17 @@ const isValid = VaultCrypto.validateKey(myKey);
### Exemple basique ### Exemple basique
```typescript ```typescript
import { createVaultClient } from '@4nk/vault-sdk'; import { SecureVaultClient } from '@4nk/vault-sdk';
// Création du client // Création du client (charge automatiquement le .env)
const client = createVaultClient( const client = new SecureVaultClient();
'https://vault.4nkweb.com:6666',
// Plus de clé nécessaire - clés dynamiques automatiques
);
// Récupération d'un fichier // Récupération d'un fichier avec variables d'environnement résolues
try { try {
const file = await client.getFile('dev', 'bitcoin/bitcoin.conf'); const file = await client.getFile('dev', 'bitcoin/bitcoin.conf');
console.log(`Contenu: ${file.content}`); console.log(`Contenu: ${file.content}`);
console.log(`Taille: ${file.size} caractères`); console.log(`Taille: ${file.size} caractères`);
console.log(`Chiffré: ${file.encrypted ? 'Oui' : 'Non'}`); console.log(`Variables résolues: ${file.content.includes('/home/debian/4NK_env/logs/bitcoin')}`);
} catch (error) { } catch (error) {
console.error('Erreur:', error.message); console.error('Erreur:', error.message);
} }
@ -64,30 +72,32 @@ try {
### Configuration avancée ### Configuration avancée
```typescript ```typescript
import { VaultClient } from '@4nk/vault-sdk'; import { SecureVaultClient } from '@4nk/vault-sdk';
const client = new VaultClient( const client = new SecureVaultClient({
{ baseUrl: 'https://vault.4nkweb.com:6666',
baseUrl: 'https://vault.4nkweb.com:6666', userId: 'demo_user_001',
verifySsl: false, // Pour les certificats auto-signés vaultKey: 'your-base64-key',
timeout: 10000, // 10 secondes environment: 'dev',
}, verifySsl: false, // Pour les certificats auto-signés
// Plus de clé nécessaire - clés dynamiques automatiques timeout: 10000 // 10 secondes
); });
``` ```
### Récupération de plusieurs fichiers ### Récupération de plusieurs fichiers
```typescript ```typescript
// Récupération parallèle // Récupération parallèle avec variables d'environnement résolues
const files = await client.getFiles([ const files = await client.getFiles([
{ env: 'dev', filePath: 'bitcoin/bitcoin.conf' }, { env: 'dev', filePath: 'bitcoin/bitcoin.conf' },
{ env: 'dev', filePath: 'tor/torrc' }, { env: 'dev', filePath: 'tor/torrc' },
{ env: 'dev', filePath: 'sdk_relay/sdk_relay.conf' } { env: 'dev', filePath: 'grafana/grafana.ini' }
]); ]);
files.forEach(file => { files.forEach(file => {
console.log(`${file.filename}: ${file.size} caractères`); console.log(`${file.filename}: ${file.size} caractères`);
// Variables d'environnement automatiquement résolues
console.log(`Variables résolues: ${!file.content.includes('$')}`);
}); });
``` ```
@ -114,11 +124,10 @@ console.log(`Statut: ${health.status}`);
const routes = await client.getRoutes(); const routes = await client.getRoutes();
console.log(`Routes disponibles: ${routes.total_routes}`); console.log(`Routes disponibles: ${routes.total_routes}`);
// Synchronisation des fichiers déchiffrés localement // Synchronisation des fichiers déchiffrés localement avec variables résolues
const syncResult = await client.syncLocalFiles({ const syncResult = await client.syncLocalFiles({
environment: 'dev', environment: 'dev',
localDir: '../confs', localDir: '../confs',
force: false,
verbose: true verbose: true
}); });
@ -131,6 +140,7 @@ console.log(`Erreurs: ${syncResult.errors}`);
- Route vault : `/<env>/<project>/<file_name>` - Route vault : `/<env>/<project>/<file_name>`
- Dossier local : `../confs/<project>/<file_name>` - Dossier local : `../confs/<project>/<file_name>`
- Exemple : `/dev/bitcoin/bitcoin.conf``../confs/bitcoin/bitcoin.conf` - Exemple : `/dev/bitcoin/bitcoin.conf``../confs/bitcoin/bitcoin.conf`
- **Variables d'environnement** automatiquement résolues dans les fichiers synchronisés
## 🛡️ Gestion d'erreurs ## 🛡️ Gestion d'erreurs
@ -168,21 +178,18 @@ try {
### Chiffrement ### Chiffrement
- **Algorithme** : ChaCha20-Poly1305 - **Algorithme** : ChaCha20-Poly1305 avec @noble/ciphers
- **Nonce** : 12 bytes aléatoires par fichier - **Nonce** : 12 bytes aléatoires par fichier
- **Clé** : 32 bytes (256 bits) - **Clé** : 32 bytes (256 bits) en base64
- **Authentification** : Intégrée via Poly1305 - **Authentification** : Intégrée via Poly1305
- **Rotation automatique** : Mise à jour transparente des clés
- **Variables d'environnement** : Résolues avant chiffrement
### Bonnes pratiques ### Bonnes pratiques
```typescript ```typescript
// ✅ Utiliser des clés générées aléatoirement // ✅ Configuration automatique via .env
const key = VaultCrypto.generateKey(); const client = new SecureVaultClient(); // Charge automatiquement .env
// ✅ Valider les clés avant utilisation
if (!VaultCrypto.validateKey(key)) {
throw new Error('Clé invalide');
}
// ✅ Gérer les erreurs de déchiffrement // ✅ Gérer les erreurs de déchiffrement
try { try {
@ -195,29 +202,38 @@ try {
} }
// ✅ Utiliser HTTPS en production // ✅ Utiliser HTTPS en production
const client = new VaultClient( const client = new SecureVaultClient({
{ baseUrl: 'https://vault.4nkweb.com:6666',
baseUrl: 'https://vault.4nkweb.com:6666', verifySsl: true, // Activer la validation SSL
verifySsl: true // Activer la validation SSL userId: 'your-user-id',
}, vaultKey: 'your-base64-key',
key environment: 'prod'
); });
// ✅ Synchronisation locale pour les déploiements
const syncResult = await client.syncLocalFiles({
environment: 'dev',
localDir: '../confs'
});
``` ```
## 📚 API Reference ## 📚 API Reference
### Classes principales ### Classes principales
#### `VaultClient` #### `SecureVaultClient`
```typescript ```typescript
class VaultClient { class SecureVaultClient {
constructor(config: VaultConfig, decryptionKey: string) constructor(config?: SecureVaultConfig)
// Récupération de fichiers // Récupération de fichiers avec déchiffrement automatique
getFile(env: string, filePath: string): Promise<VaultFile> getFile(env: string, filePath: string): Promise<VaultFile>
getFiles(requests: FileRequest[]): Promise<VaultFile[]> getFiles(requests: FileRequest[]): Promise<VaultFile[]>
// Déchiffrement de contenu
decryptContent(encryptedData: string, nextKey?: string): Promise<string>
// Monitoring // Monitoring
health(): Promise<VaultHealth> health(): Promise<VaultHealth>
info(): Promise<VaultInfo> info(): Promise<VaultInfo>
@ -227,6 +243,10 @@ class VaultClient {
getRoutes(): Promise<VaultRoutes> getRoutes(): Promise<VaultRoutes>
syncLocalFiles(options: SyncOptions): Promise<SyncResult> syncLocalFiles(options: SyncOptions): Promise<SyncResult>
// Gestion des clés
updateNextKey(nextKey: string): void
updateEnvFile(newKey: string): void
// Utilitaires // Utilitaires
searchFiles(env: string, pattern?: RegExp): Promise<string[]> searchFiles(env: string, pattern?: RegExp): Promise<string[]>
} }
@ -240,6 +260,9 @@ class VaultCrypto {
static generateKey(): string static generateKey(): string
static hashToKey(password: string): string static hashToKey(password: string): string
static validateKey(key: string): boolean static validateKey(key: string): boolean
// Déchiffrement ChaCha20-Poly1305
static decrypt(encryptedData: string, key: string): string
} }
``` ```
@ -247,11 +270,12 @@ class VaultCrypto {
```typescript ```typescript
interface VaultFile { interface VaultFile {
content: string; content: string; // Contenu déchiffré avec variables résolues
filename: string; filename: string;
size: number; size: number;
encrypted: boolean; encrypted: boolean;
algorithm?: string; algorithm?: string;
variablesResolved?: boolean; // Indique si les variables d'environnement ont été résolues
} }
interface VaultHealth { interface VaultHealth {
@ -275,9 +299,8 @@ interface VaultRoutes {
interface SyncOptions { interface SyncOptions {
environment: string; environment: string;
localDir?: string; localDir?: string; // Par défaut: '../confs'
force?: boolean; verbose?: boolean; // force option removed - always overwrites
verbose?: boolean;
} }
interface SyncResult { interface SyncResult {
@ -291,8 +314,11 @@ interface SyncResult {
}>; }>;
} }
interface VaultConfig { interface SecureVaultConfig {
baseUrl: string; baseUrl: string;
userId: string;
vaultKey: string; // Clé de déchiffrement en base64
environment: string;
verifySsl?: boolean; verifySsl?: boolean;
timeout?: number; timeout?: number;
} }
@ -309,6 +335,13 @@ interface VaultConfig {
4. Synchronisation locale + Gestion des erreurs 4. Synchronisation locale + Gestion des erreurs
5. Déchiffrement des contenus + Gestion des erreurs 5. Déchiffrement des contenus + Gestion des erreurs
**Fonctionnalités démontrées :**
- Configuration automatique via `.env`
- Déchiffrement réel avec `@noble/ciphers`
- Variables d'environnement résolues automatiquement
- Synchronisation locale avec écrasement des fichiers
- Rotation automatique des clés
### Exécution des exemples ### Exécution des exemples
```bash ```bash