
Séparation des scripts de génération et amélioration de l'architecture - Séparé generate_grafana_dashboards.sh en 3 scripts distincts : * generate_grafana_dashboards.sh (dashboards uniquement) * generate_promtail_config.sh (configuration Promtail) * generate_logrotate_configs.sh (configurations Logrotate) - Supprimé generate_docker_compose.sh et generate_docker_variables.sh - Centralisé la génération des variables dans generate_variables.sh - Mis à jour generate.sh pour une architecture en 5 étapes - Corrigé les chemins de sortie et les références de variables - Ajouté la gestion d'erreurs pour les fichiers .env problématiques - Généré toutes les configurations Nginx, Grafana, Promtail et Logrotate - Amélioré la modularité et la maintenabilité du code
407 lines
12 KiB
Markdown
407 lines
12 KiB
Markdown
# 4NK Vault API - Système Sécurisé
|
|
|
|
API HTTPS sécurisée avec authentification par clés utilisateur et chiffrement quantique résistant.
|
|
|
|
## 🔐 Sécurité Avancée
|
|
|
|
- **HTTPS obligatoire** sur le port 6666
|
|
- **Authentification par ID utilisateur** (header `X-User-ID`)
|
|
- **Clés individuelles par utilisateur ET par environnement**
|
|
- **Rotation automatique des clés** (toutes les heures)
|
|
- **Chiffrement quantique résistant** (ChaCha20-Poly1305)
|
|
- **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
|
|
|
|
### Authentification
|
|
- **ID utilisateur requis** pour tous les accès
|
|
- **Validation stricte** : 3-128 caractères alphanumériques + `_` et `-`
|
|
- **Clés uniques** par combinaison utilisateur/environnement
|
|
- **Support des clés longues** (hash SHA256 des IDs utilisateur)
|
|
|
|
### Gestion des clés
|
|
- **Génération automatique** de clés de 32 bytes
|
|
- **Rotation automatique** toutes les heures
|
|
- **Sauvegarde de l'ancienne clé** pour compatibilité
|
|
- **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
|
|
|
|
### `GET /health`
|
|
Contrôle de santé avec authentification.
|
|
|
|
**Headers requis :**
|
|
```
|
|
X-User-ID: your_user_id
|
|
```
|
|
|
|
**Réponse :**
|
|
```json
|
|
{
|
|
"status": "healthy",
|
|
"service": "vault-api-secure",
|
|
"encryption": "quantum-resistant",
|
|
"algorithm": "X25519-ChaCha20-Poly1305",
|
|
"authentication": "user-key-based",
|
|
"key_rotation": "automatic",
|
|
"user_id": "your_user_id",
|
|
"timestamp": "2024-01-01T00:00:00"
|
|
}
|
|
```
|
|
|
|
### `GET /info`
|
|
Informations sur l'API avec authentification.
|
|
|
|
### `GET /routes`
|
|
Liste toutes les routes disponibles avec exemples de fichiers.
|
|
|
|
### `GET /<env>/<file>`
|
|
Sert un fichier chiffré avec authentification utilisateur et variables d'environnement résolues.
|
|
|
|
**Headers requis :**
|
|
```
|
|
X-User-ID: your_user_id
|
|
```
|
|
|
|
**Exemple :**
|
|
```bash
|
|
curl -k -H "X-User-ID: <VAULT_USER_ID>" "$VAULT_URL"/dev/bitcoin/bitcoin.conf
|
|
```
|
|
|
|
## 🔧 Installation et utilisation
|
|
|
|
### Prérequis
|
|
- Python 3.8+
|
|
- pip
|
|
|
|
### Installation
|
|
```bash
|
|
# Cloner le repository
|
|
git clone https://git.4nkweb.com:4nk/4NK_vault.git
|
|
cd 4NK_vault
|
|
|
|
# Créer l'environnement virtuel
|
|
python3 -m venv venv_api
|
|
source venv_api/bin/activate
|
|
|
|
# Installer les dépendances
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
### Démarrage
|
|
```bash
|
|
# Démarrer l'API sécurisée
|
|
./start_api.sh
|
|
|
|
# Ou manuellement
|
|
source venv_api/bin/activate
|
|
python3 api_server.py
|
|
```
|
|
|
|
### Test
|
|
```bash
|
|
# Tester l'API sécurisée
|
|
python3 test_api.py
|
|
```
|
|
|
|
## 🔐 Sécurité
|
|
|
|
### Authentification
|
|
- **ID utilisateur obligatoire** pour tous les accès
|
|
- **Validation stricte** des caractères autorisés
|
|
- **Rejet automatique** des requêtes non authentifiées
|
|
|
|
### Chiffrement
|
|
- **Clés individuelles** par utilisateur et environnement
|
|
- **ChaCha20-Poly1305** (quantum-résistant)
|
|
- **Rotation automatique** des clés
|
|
- **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
|
|
- **Isolation par environnement** : `storage/<env>/_keys/`
|
|
- **Fichiers protégés** dans `.gitignore`
|
|
- **Aucune clé côté client**
|
|
|
|
## 📁 Structure
|
|
|
|
```
|
|
4NK_vault/
|
|
├── api_server.py # Serveur sécurisé principal avec EnvProcessor
|
|
├── start_api.sh # Script de démarrage sécurisé
|
|
├── test_api.py # Tests de l'API sécurisée
|
|
├── requirements.txt # Dépendances Python
|
|
├── SECURITY_NOTICE.md # Avertissements de sécurité
|
|
├── storage/ # Fichiers de configuration (lecture seule)
|
|
│ ├── dev/
|
|
│ │ ├── .env # Variables d'environnement principales
|
|
│ │ ├── _keys/ # Clés utilisateur (auto-créé)
|
|
│ │ ├── bitcoin/ # Configurations avec variables résolues
|
|
│ │ ├── tor/ # Configurations avec variables résolues
|
|
│ │ └── [autres services]/
|
|
│ └── prod/
|
|
│ ├── _keys/ # Clés utilisateur (auto-créé)
|
|
│ └── [configurations]/
|
|
├── 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/
|
|
│ │ └── index.ts # Client sécurisé avec @noble/ciphers
|
|
│ ├── 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
|
|
```
|
|
|
|
## 🌐 Intégration dans l'environnement 4NK
|
|
|
|
Ce module s'intègre au déploiement global 4NK via une URL de base configurable (variable `VAULT_URL`).
|
|
Consultez les documents centraux pour le contexte et l'orchestration:
|
|
- `docs/DEEP_ARCHITECTURE_ANALYSIS.md`
|
|
- `docs/TECHNICAL_REFERENCE.md`
|
|
- `docs/DEPLOYMENT_GUIDE.md`
|
|
|
|
## ⚠️ Avertissements
|
|
|
|
Voir `SECURITY_NOTICE.md` pour les détails sur les limitations de sécurité en mode démonstration.
|
|
## 📋 Fichiers centralisés
|
|
|
|
Les fichiers suivants sont centralisés dans le dépôt principal `4NK_env` :
|
|
- `CODE_OF_CONDUCT.md` - Code de conduite
|
|
- `CODEOWNERS` - Propriétaires du code
|
|
- `CONTRIBUTING.md` - Guide de contribution
|
|
- `LICENSE` - Licence du projet
|
|
|
|
## 🚀 Politique NGINX
|
|
|
|
### Introduction
|
|
|
|
La configuration retenue met en place un reverse-proxy Nginx conteneurisé qui sert de point d'entrée unique. Elle distingue clairement les flux externes (terminaison TLS en 443) et les flux internes intra-Docker (routés par ports Nginx 8081/8082, non publiés sur l'hôte). Les applications tournent dans des conteneurs dédiés app1 (8081) et app2 (8082). Les en-têtes de traçabilité sont normalisés et les redirections sont maîtrisées pour éviter toute boucle.
|
|
|
|
### 🏗️ Architecture Générale
|
|
|
|
#### Configuration Fonctionnelle
|
|
- **Nginx conteneurisé** : Partage le réseau Docker `app_net` avec app1 et app2
|
|
- **Ports externes** : 80 et 443 publiés vers l'hôte pour l'accès externe
|
|
- **Ports internes** : 8081 et 8082 non publiés (accessibles uniquement depuis les conteneurs)
|
|
|
|
#### Flux de Trafic
|
|
|
|
**Flux Externes :**
|
|
- **Port 80** → Redirection 301 vers port 443
|
|
- **Port 443** → Terminaison TLS + proxy vers upstream HTTP (app1:8081 ou app2:8082)
|
|
|
|
**Flux Internes Intra-Docker :**
|
|
- `http://nginx:8081/` → Nginx (port 8081) → app1:8081
|
|
- `http://nginx:8082/` → Nginx (port 8082) → app2:8082
|
|
|
|
### 🔧 Configuration Technique
|
|
|
|
#### Docker Compose
|
|
```yaml
|
|
nginx:
|
|
ports:
|
|
- "80:80"
|
|
- "443:443"
|
|
volumes:
|
|
- ./nginx/conf.d:/etc/nginx/conf.d
|
|
- ./nginx/snippets:/etc/nginx/snippets
|
|
- ./certs:/etc/nginx/certs
|
|
- ./logs:/var/log/nginx
|
|
depends_on:
|
|
- app1
|
|
- app2
|
|
networks:
|
|
- app_net
|
|
|
|
app1:
|
|
expose:
|
|
- "8081"
|
|
networks:
|
|
- app_net
|
|
|
|
app2:
|
|
expose:
|
|
- "8082"
|
|
networks:
|
|
- app_net
|
|
```
|
|
|
|
#### Upstreams (`nginx/conf.d/upstreams.conf`)
|
|
```nginx
|
|
upstream app1_docker {
|
|
server app1:8081;
|
|
keepalive 32;
|
|
}
|
|
|
|
upstream app2_docker {
|
|
server app2:8082;
|
|
keepalive 32;
|
|
}
|
|
|
|
# Format de logs JSON pour l'observabilité
|
|
log_format app_json escape=json
|
|
'{ "time":"$time_iso8601",'
|
|
' "client":"$remote_addr",'
|
|
' "xff":"$http_x_forwarded_for",'
|
|
' "method":"$request_method",'
|
|
' "host":"$host",'
|
|
' "uri":"$request_uri",'
|
|
' "status":$status,'
|
|
' "bytes":$body_bytes_sent,'
|
|
' "ua":"$http_user_agent",'
|
|
' "upstream":"$upstream_addr",'
|
|
' "rt":$request_time,'
|
|
' "urt":$upstream_response_time }';
|
|
```
|
|
|
|
#### Headers Proxy (`nginx/snippets/proxy_headers.conf`)
|
|
```nginx
|
|
proxy_http_version 1.1;
|
|
|
|
# Headers de base
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Forwarded-Host $host;
|
|
proxy_set_header X-Forwarded-Port $server_port;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
proxy_set_header X-Forwarded-For $remote_addr;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header Connection "";
|
|
|
|
# Directives anti-boucle et debug
|
|
proxy_redirect off;
|
|
add_header X-Debug-Scheme $scheme always;
|
|
add_header X-Debug-XFP $http_x_forwarded_proto always;
|
|
|
|
# Timeouts et buffers
|
|
proxy_connect_timeout 5s;
|
|
proxy_send_timeout 60s;
|
|
proxy_read_timeout 60s;
|
|
proxy_buffering on;
|
|
proxy_buffers 32 16k;
|
|
client_max_body_size 50m;
|
|
```
|
|
|
|
### 🌐 Configuration des VHosts
|
|
|
|
#### VHosts Externes (Ports 80/443)
|
|
|
|
**Redirection HTTP → HTTPS :**
|
|
```nginx
|
|
server {
|
|
listen 80;
|
|
server_name app1.exemple.tld app2.exemple.tld;
|
|
return 301 https://$host$request_uri;
|
|
}
|
|
```
|
|
|
|
**Terminaison HTTPS :**
|
|
```nginx
|
|
server {
|
|
listen 443 ssl http2;
|
|
server_name app1.exemple.tld;
|
|
|
|
ssl_certificate /etc/nginx/certs/fullchain.pem;
|
|
ssl_certificate_key /etc/nginx/certs/privkey.pem;
|
|
|
|
location / {
|
|
include snippets/proxy_headers.conf;
|
|
proxy_pass http://app1_docker;
|
|
|
|
# Support WebSocket
|
|
proxy_http_version 1.1;
|
|
proxy_set_header Upgrade $http_upgrade;
|
|
proxy_set_header Connection "upgrade";
|
|
proxy_read_timeout 3600s;
|
|
}
|
|
}
|
|
```
|
|
|
|
#### VHosts Internes (Ports 8081/8082)
|
|
|
|
```nginx
|
|
server {
|
|
listen 8081 default_server;
|
|
server_name _;
|
|
|
|
location / {
|
|
include snippets/proxy_headers.conf;
|
|
proxy_pass http://app1_docker;
|
|
}
|
|
}
|
|
|
|
server {
|
|
listen 8082 default_server;
|
|
server_name _;
|
|
|
|
location / {
|
|
include snippets/proxy_headers.conf;
|
|
proxy_pass http://app2_docker;
|
|
}
|
|
}
|
|
```
|
|
|
|
### ⚠️ Points d'Attention Opérationnels
|
|
|
|
#### Configuration des Applications
|
|
- **Confiance Proxy** : Activer l'interprétation des headers `X-Forwarded-Proto` et `X-Forwarded-Host`
|
|
- **Frameworks Supportés** : Django/Flask, Rails, Express, Spring, Go frameworks, etc.
|
|
- **Redirection Réflexe** : Condition nécessaire pour éviter les boucles de redirection
|
|
|
|
#### Sécurité
|
|
- **HSTS** : Ne pas activer sur les ports internes 8081/8082
|
|
- **HSTS Externe** : Réserver aux vhosts externes en 443 si tout le domaine est en HTTPS
|
|
- **CDN/Proxy Amont** : Compléter avec `real_ip_header`/`set_real_ip_from` pour fiabiliser `$remote_addr`
|
|
|
|
### 🧪 Tests de Non-Régression
|
|
|
|
#### Tests Externes
|
|
```bash
|
|
# Redirection HTTP → HTTPS
|
|
curl -I http://app1.exemple.tld/
|
|
# Attendu: 301 Location: https://app1.exemple.tld/...
|
|
|
|
# Accès HTTPS direct
|
|
curl -I https://app1.exemple.tld/
|
|
# Attendu: 200 (pas de 3xx)
|
|
```
|
|
|
|
#### Tests Internes
|
|
```bash
|
|
# Depuis un conteneur sur app_net
|
|
curl -I http://nginx:8081/
|
|
curl -I http://nginx:8082/
|
|
# Attendu: 200 (pas de 3xx)
|
|
```
|
|
|
|
### 📋 Conclusion
|
|
|
|
La **Variante A intra-Docker** fournit un schéma propre :
|
|
- **Externe** : HTTPS avec redirection unique depuis le port 80
|
|
- **Interne** : Nginx sur ports 8081/8082 sans exposition vers l'hôte
|
|
- **En-têtes standardisés** : Traçabilité et robustesse garanties
|
|
- **Anti-boucles** : `proxy_redirect off` et headers de debug
|
|
- **WebSocket** : Support natif avec timeouts étendus
|
|
|
|
Cette base est prête pour la production et extensible à d'autres services.
|
|
|
|
Voir : [`4NK_env/CODE_OF_CONDUCT.md`](../../CODE_OF_CONDUCT.md), [`4NK_env/CODEOWNERS`](../../CODEOWNERS), [`4NK_env/CONTRIBUTING.md`](../../CONTRIBUTING.md), [`4NK_env/LICENSE`](../../LICENSE)
|