4NK_vault/docs/api-specification-openapi.yaml
4NK Dev c9f97b6755 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
2025-09-30 14:20:48 +00:00

436 lines
14 KiB
YAML

openapi: 3.0.3
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`)
- **Clés individuelles par utilisateur ET par environnement**
- **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
contact:
name: 4NK Vault API Support
email: support@4nkweb.com
license:
name: Proprietary
servers:
- url: https://vault.4nkweb.com:6666
description: Serveur de production
- url: https://127.0.0.1:6666
description: Serveur de développement local
security:
- UserKeyAuth: []
paths:
/health:
get:
summary: Contrôle de santé de l'API
description: |
Endpoint de monitoring pour vérifier l'état de santé de l'API.
Nécessite une authentification utilisateur.
operationId: getHealth
tags:
- Monitoring
responses:
'200':
description: API en bonne santé
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "healthy"
service:
type: string
example: "vault-api-secure"
encryption:
type: string
example: "quantum-resistant"
algorithm:
type: string
example: "X25519-ChaCha20-Poly1305"
authentication:
type: string
example: "user-key-based"
key_rotation:
type: string
example: "automatic"
user_id:
type: string
example: "demo_user_001"
timestamp:
type: string
format: date-time
example: "2024-01-01T12:00:00"
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'500':
$ref: '#/components/responses/InternalServerError'
/info:
get:
summary: Informations détaillées sur l'API
description: |
Retourne des informations détaillées sur l'API, ses endpoints disponibles
et ses capacités. Nécessite une authentification utilisateur.
operationId: getInfo
tags:
- Monitoring
responses:
'200':
description: Informations sur l'API
content:
application/json:
schema:
type: object
properties:
name:
type: string
example: "4NK Vault API Secure"
version:
type: string
example: "2.0.0"
domain:
type: string
example: "vault.4nkweb.com"
port:
type: integer
example: 6666
protocol:
type: string
example: "HTTPS"
encryption:
type: string
example: "quantum-resistant"
authentication:
type: string
example: "user-key-based"
key_rotation:
type: string
example: "automatic"
user_id:
type: string
example: "demo_user_001"
endpoints:
type: object
properties:
"GET /<env>/<file>":
type: string
example: "Sert un fichier chiffré avec authentification utilisateur"
"GET /health":
type: string
example: "Contrôle de santé (authentification requise)"
"GET /info":
type: string
example: "Informations sur l'API (authentification requise)"
"GET /routes":
type: string
example: "Liste de toutes les routes disponibles (authentification requise)"
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'500':
$ref: '#/components/responses/InternalServerError'
/routes:
get:
summary: Liste toutes les routes disponibles
description: |
Retourne la liste complète de toutes les routes disponibles dans l'API,
incluant des exemples de fichiers accessibles. Nécessite une authentification utilisateur.
operationId: getRoutes
tags:
- Discovery
responses:
'200':
description: Liste des routes disponibles
content:
application/json:
schema:
type: object
properties:
routes:
type: array
items:
$ref: '#/components/schemas/Route'
file_examples:
type: array
items:
type: string
example:
- "/dev/bitcoin/bitcoin.conf"
- "/dev/tor/torrc"
- "/dev/grafana/grafana.ini"
total_routes:
type: integer
example: 4
authentication:
type: object
properties:
type:
type: string
example: "user-key-based"
header:
type: string
example: "X-User-ID"
description:
type: string
example: "ID utilisateur requis pour tous les accès"
user_id:
type: string
example: "demo_user_001"
timestamp:
type: string
format: date-time
example: "2024-01-01T12:00:00"
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'500':
$ref: '#/components/responses/InternalServerError'
/{env}/{file_path}:
get:
summary: Sert un fichier chiffré
description: |
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
- **Clé** : 32 bytes (256 bits) unique par utilisateur/environnement
- **Authentification** : Intégrée via Poly1305
operationId: getFile
tags:
- Files
parameters:
- name: env
in: path
required: true
description: Environnement (ex: dev, prod, staging)
schema:
type: string
example: "dev"
- name: file_path
in: path
required: true
description: Chemin du fichier dans l'environnement
schema:
type: string
example: "bitcoin/bitcoin.conf"
responses:
'200':
description: Fichier chiffré avec succès
content:
application/octet-stream:
schema:
type: string
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:
description: |
Clé suivante pour la rotation (base64).
Utilisée pour le déchiffrement des prochains fichiers.
schema:
type: string
format: base64
example: "JYyybYFXe9hghRI9d1mpoQ1uYYxpt/6lzYPOWrxruG0="
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalServerError'
components:
securitySchemes:
UserKeyAuth:
type: apiKey
in: header
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/`
- Rotation automatique des clés toutes les heures
schemas:
Route:
type: object
properties:
method:
type: string
example: "GET"
path:
type: string
example: "/health"
description:
type: string
example: "Contrôle de santé de l'API"
authentication:
type: string
example: "required"
headers_required:
type: array
items:
type: string
example: ["X-User-ID"]
response_type:
type: string
example: "application/json"
example:
type: string
example: "https://vault.4nkweb.com:6666/health"
Error:
type: object
properties:
error:
type: string
description: Message d'erreur détaillé
example: "Header X-User-ID requis pour l'authentification"
timestamp:
type: string
format: date-time
description: Timestamp de l'erreur
request_id:
type: string
description: ID unique de la requête pour le debugging
required:
- error
responses:
BadRequest:
description: Requête invalide (HTTP requis)
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
https_required:
summary: HTTPS requis
value:
error: "HTTPS OBLIGATOIRE - Cette API ne fonctionne qu'en HTTPS sur le port 6666"
Unauthorized:
description: Authentification requise ou invalide
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
missing_header:
summary: Header manquant
value:
error: "Header X-User-ID requis pour l'authentification"
invalid_user_id:
summary: ID utilisateur invalide
value:
error: "ID utilisateur invalide"
invalid_characters:
summary: Caractères non autorisés
value:
error: "ID utilisateur contient des caractères non autorisés"
Forbidden:
description: Accès non autorisé
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
unauthorized_access:
summary: Accès non autorisé
value:
error: "Accès non autorisé"
NotFound:
description: Fichier non trouvé
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
file_not_found:
summary: Fichier non trouvé
value:
error: "Fichier non trouvé: dev/bitcoin/bitcoin.conf"
InternalServerError:
description: Erreur interne du serveur
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
server_error:
summary: Erreur serveur
value:
error: "Erreur interne du serveur"
tags:
- name: Monitoring
description: |
Endpoints de monitoring et de santé de l'API.
Permettent de vérifier l'état de l'API et d'obtenir des informations détaillées.
- name: Discovery
description: |
Endpoints de découverte des ressources disponibles.
Permettent de lister les routes et fichiers accessibles.
- name: Files
description: |
Endpoints de gestion des fichiers sécurisés.
Permettent de récupérer des fichiers chiffrés avec authentification.
externalDocs:
description: Documentation complète du projet 4NK Vault
url: https://git.4nkweb.com:4nk/4NK_vault.git