Installation et configuration¶
Faites fonctionner Stentor localement en moins de cinq minutes. Ce guide couvre la configuration système requise, le déploiement basé sur Docker, la configuration de l'environnement et votre première connexion.
Configuration système requise¶
Avant de commencer, assurez-vous que votre machine répond à ces conditions :
| Composant | Minimum | Recommandé |
|---|---|---|
| Docker Engine | 24+ | Dernière version stable |
| Docker Compose | v2+ (docker compose intégré) | Dernière version stable |
| Git | 2.x | Dernière version stable |
| RAM | 4 Go | 8 Go |
| Disque | 2 Go gratuits | 5 Go gratuits |
Disponibilité des ports : les ports suivants doivent être libres :
| Port | Service | Description |
|---|---|---|
5433 | PostgreSQL | Base de données (mappée à partir du port de conteneur 5432) |
8082 | API backend | API REST Go/Gin et serveur WebSocket |
3001 | Frontend | React UI (serveur de développement Vite ou nginx dans Docker) |
1080 | Proxy SOCKS | Point de terminaison du tunnel Beacon SOCKS5 |
8083 | Administrateur | Panneau d'administration de la base de données (facultatif) |
Systèmes d'exploitation pris en charge :
- Linux - recommandé pour les déploiements de production
- macOS -- recommandé pour le développement
- Windows (WSL2) – nécessite Docker Desktop avec le backend WSL2
Démarrage rapide¶
Suivez ces étapes pour passer de zéro à une instance Stentor en cours d'exécution.
1. Clonez le référentiel¶
2. Configurer les variables d'environnement¶
Les valeurs par défaut fonctionnent pour le développement local. Voir Configuration de l'environnement ci-dessous pour plus de détails sur chaque variable.
Modifiez JWT_SECRET avant l'utilisation en production
Le .env.example par défaut est livré avec JWT_SECRET=change-me-to-a-random-secret. Générez un véritable secret avant de déployer n'importe où au-delà de votre machine locale :
Collez le résultat en tant que valeur JWT_SECRET dans .env.
3. Démarrez tous les services¶
Docker Compose crée et démarre les quatre services : PostgreSQL, l'API backend, l'interface utilisateur frontend et Adminer. La première construction prend 2 à 3 minutes ; les démarrages suivants sont presque instantanés.
Regardez les journaux
Surveillez la progression du démarrage en temps réel :
Attendez Backend ready on :8080 avant de continuer.
4. Ouvrez l'interface utilisateur¶
Une fois tous les services exécutés :
- Interface utilisateur frontale : http://localhost:3001
- API backend : http://localhost:8082/api/v1
- Administrateur de base de données (administrateur) : http://localhost:8083
5. Connectez-vous¶
Utilisez le compte opérateur seed :
| Champ | Valeur |
|---|---|
[email protected] | |
| Mot de passe | your-password |
Ces informations d'identification proviennent de database/seed.sql, qui est automatiquement chargé lors de la première initialisation de la base de données.
Détails du compte d'amorçage
Le compte de départ a le rôle operator, qui accorde un accès complet à toutes les fonctionnalités de Stentor. Dans un déploiement de production, créez des comptes d’opérateur dédiés et supprimez le compte de départ.
Configuration de l'environnement¶
Le fichier .env contrôle tous les paramètres d'exécution. Copiez .env.example et personnalisez-le selon vos besoins.
Base de données¶
| Variable | Obligatoire | Par défaut | Description |
|---|---|---|---|
POSTGRES_USER | Oui | postgres | Nom d'utilisateur PostgreSQL |
POSTGRES_PASSWORD | Oui | postgres | Mot de passe PostgreSQL |
POSTGRES_DB | Oui | stentor | Nom de la base de données |
DATABASE_URL | Oui | postgres://postgres:postgres@postgres:5432/stentor?sslmode=disable | Chaîne de connexion complète utilisée par le backend |
DB_MAX_CONNS | Non | 25 | Taille maximale du pool de connexions |
DB_MIN_CONNS | Non | 5 | Connexions inactives minimales |
DB_MAX_CONN_LIFETIME_MINUTES | Non | 60 | Durée de vie maximale de la connexion |
Ports internes ou externes
Le DATABASE_URL utilise le port 5432 (le port interne du conteneur). Le port mappé par l'hôte est 5433. Lors de la connexion depuis votre machine hôte (par exemple, via psql), utilisez le port 5433.
Authentification¶
| Variable | Obligatoire | Par défaut | Description |
|---|---|---|---|
JWT_SECRET | Oui | change-me-to-a-random-secret | Clé secrète pour signer les jetons JWT. Doit être modifié pour la production. |
ACCESS_TOKEN_EXPIRY_MINUTES | Non | 15 | Durée de vie du jeton d'accès |
REFRESH_TOKEN_EXPIRY_DAYS | Non | 7 | Actualiser la durée de vie du jeton |
JWT_SECRET est critique
Toute personne possédant votre JWT_SECRET peut falsifier des jetons d'authentification et obtenir un accès complet à Stentor. Utilisez une valeur aléatoire forte et unique et ne la confiez jamais au contrôle de version.
Serveur¶
| Variable | Obligatoire | Par défaut | Description |
|---|---|---|---|
PORT | Non | 8080 | Port d'écoute backend (à l'intérieur du conteneur) |
ENVIRONMENT | Non | development | Défini sur production pour les déploiements de production |
STENTOR_VERSION | Non | dev | Chaîne de version affichée dans l'interface utilisateur |
ALLOWED_ORIGINS | Non | http://localhost:3001 | Origines autorisées CORS |
Relais (facultatif)¶
Ces variables ne sont nécessaires que si vous connectez un agent relais.
| Variable | Obligatoire | Par défaut | Description |
|---|---|---|---|
RELAY_WS_URL | Non | -- | URL WebSocket à laquelle le relais se connecte (par exemple, ws://localhost:8082/ws/relay) |
RELAY_SECRET | Non | -- | Secret partagé pour l'authentification par relais |
C2 (facultatif)¶
Ces variables configurent le sous-système Commande & Contrôle.
| Variable | Obligatoire | Par défaut | Description |
|---|---|---|---|
C2_IMPLANT_PATH | Non | -- | Chemin d'accès au binaire d'implant compilé pour la génération de payload |
C2_RSA_KEY_PATH | Non | c2_private.pem | Clé privée RSA pour le cryptage des beacons |
C2_TASK_TTL_HOURS | Non | 24 | Combien de temps les tâches en attente restent valides |
C2_BEACON_STALE_MINUTES | Non | 5 | Beacon considéré comme obsolète après autant de minutes sans enregistrement |
C2_CLEANUP_INTERVAL_SECONDS | Non | 30 | Intervalle de nettoyage des beacons obsolètes |
C2_MAX_RETRIES | Non | 3 | Nombre de nouvelles tentatives de livraison de tâches |
C2_RETRY_BASE_DELAY_SECONDS | Non | 1 | Interruption de la nouvelle tentative initiale |
C2_RETRY_MAX_DELAY_SECONDS | Non | 30 | Intervalle maximal entre les tentatives |
Services Dockers¶
Stentor fonctionne comme quatre conteneurs Docker orchestrés par Docker Compose.
graph LR
FE["Frontend<br/>(React + nginx)<br/>:3001"] -->|REST / WebSocket| BE["Backend<br/>(Go + Gin)<br/>:8082"]
BE -->|SQL| DB["PostgreSQL 16<br/>:5433"]
ADM["Adminer<br/>:8083"] -->|SQL| DB
BE -->|SOCKS5| SOCKS[":1080"] postgres (stentor-c2-db)¶
- Image :
postgres:16-alpine - Port hôte :
5433(mappé à partir du port de conteneur5432) - Volume de données :
stentor-c2-postgres-data(persistant après les redémarrages) - Schéma :
database/schema.sqlest monté sur/docker-entrypoint-initdb.d/001_schema.sqlet s'exécute automatiquement au premier démarrage. - Données de départ :
database/seed.sqlcrée le compte d'opérateur par défaut - Health check :
pg_isreadytoutes les 5 secondes avec 5 tentatives
serveur (stentor-c2-backend)¶
- Contexte de construction :
server/Dockerfile - Port hôte :
8082(mappé à partir du port de conteneur8080) - Dépend de :
postgres(attend la réussite du contrôle de santé) - Volumes :
./binariesmonté en lecture seule sur/app/binariespour la génération de payload - Port supplémentaire :
1080pour les tunnels proxy SOCKS5
interface (stentor-c2-frontend)¶
- Contexte de construction :
ui/Dockerfile - Port hôte :
3001(mappé à partir du port de conteneur80) - Dépend de :
backend - Sert : Application React conçue pour la production via nginx
administrateur (stentor-c2-adminer)¶
- Image :
adminer:latest - Port hôte :
8083 - Objectif : Navigateur de base de données Web pour le débogage et l'inspection
Première connexion¶
1. Accédez à la page de connexion¶
Ouvrez http://localhost:3001 dans votre navigateur. Vous serez redirigé vers la page de connexion.
2. Entrez les informations d'identification¶
Utilisez le compte opérateur seed :
- E-mail :
[email protected] - Mot de passe :
your-password
3. Flux d'authentification¶
Lorsque vous vous connectez, le backend émet deux jetons JWT :
- Jeton d'accès - de courte durée (15 minutes par défaut), envoyé avec chaque requête API dans l'en-tête
Authorization - Jeton d'actualisation – longue durée de vie (7 jours par défaut), utilisé pour obtenir de nouveaux jetons d'accès sans avoir à saisir à nouveau les informations d'identification.
L’interface utilisateur gère automatiquement l’actualisation des jetons. Vous restez connecté jusqu'à l'expiration du jeton d'actualisation.
4. Prochaines étapes¶
Après vous être connecté, vous atterrirez sur le tableau de bord de l'opérateur. Pour une visite guidée de l'interface, continuez vers la page UI Walkthrough.
Gestion de base de données¶
Stentor fournit plusieurs cibles Make pour les opérations de base de données courantes.
Accéder au shell de la base de données¶
Cela ouvre une session psql connectée à la base de données Stentor à l'intérieur du conteneur Docker.
Réinitialiser la base de données¶
# Drop and recreate (preserves the Docker volume)
make db-reset
# Fresh start from schema.sql (drops volume, reseeds)
make db-fresh
Quand utiliser db-fresh
Utilisez make db-fresh si la connexion échoue avec les informations d'identification par défaut ou si vous souhaitez une base de données complètement propre. Cela recharge schema.sql et seed.sql à partir de zéro.
Comment le schéma se charge¶
Le docker-compose.yml monte database/schema.sql dans le conteneur PostgreSQL à /docker-entrypoint-initdb.d/001_schema.sql. PostgreSQL exécute automatiquement tous les scripts de ce répertoire à la première initialisation uniquement (lorsque le volume de données est vide). Pour forcer la réinitialisation, supprimez le volume :
Mode développement¶
Pour un développement actif, exécutez le backend et le frontend en dehors de Docker avec la prise en charge du rechargement à chaud.
Backend (Go + Air)¶
Démarre le backend Go avec Air pour une recompilation automatique lors des modifications de fichiers. L'API s'exécute sur http://localhost:8082.
La base de données fonctionne toujours dans Docker
make dev exécute uniquement le backend de manière native. Le conteneur PostgreSQL doit toujours être en cours d'exécution. Commencez-le avec docker compose up -d postgres.
Frontend (Vite HMR)¶
Démarre le serveur de développement Vite sur http://localhost:3001 avec remplacement du module à chaud. Les modifications apportées aux composants et aux styles React sont reflétées instantanément dans le navigateur.
Les deux à la fois¶
Démarre le backend (Air) et le frontend (Vite) en parallèle.
Configuration du proxy Vite¶
En mode développement, le serveur de développement Vite transmet les requêtes API au backend :
- Les demandes
/api/*sont transmises àhttp://localhost:8082 /ws/*Les connexions WebSocket sont transférées vershttp://localhost:8082
Cela élimine les problèmes CORS lors du développement local : vous accédez à tout via http://localhost:3001.
Dépannage¶
Port déjà utilisé¶
Symptôme : docker compose up échoue avec "le port est déjà alloué".
Correction : Vérifiez ce qui utilise le port et arrêtez-le :
Conflits de ports courants :
| Port | Conflit probable |
|---|---|
5433 | Une autre instance PostgreSQL |
8082 | Un autre serveur API |
3001 | Un autre serveur de développement Vite/Node |
La base de données n'est pas prête¶
Symptôme : Les journaux backend affichent des erreurs connection refused dans PostgreSQL.
Correction : Le backend dépend de la vérification de l'état de PostgreSQL, mais si vous avez démarré les services manuellement, la base de données n'est peut-être pas encore prête. Attendez 10 à 15 secondes et vérifiez :
Assurez-vous que le service postgres affiche l'état healthy. S'il reste unhealthy :
La connexion échoue avec les informations d'identification par défaut¶
Symptôme : [email protected] / your-password renvoie des « informations d'identification non valides ».
Correction : Les données de départ n'ont peut-être pas été chargées. Reconstruisez la base de données :
Cela supprime le volume de la base de données, réinitialise à partir de schema.sql et recharge seed.sql.
Incompatibilité de version de Docker Compose¶
Symptôme : Commande docker-compose introuvable ou erreurs de syntaxe dans docker-compose.yml.
Correction : Stentor nécessite Docker Compose v2, qui utilise la commande docker compose (sans le trait d'union) :
# Check your version
docker compose version
# If you get "command not found", install the Compose plugin:
# https://docs.docker.com/compose/install/
Héritage docker-compose (v1)
La commande docker-compose avec trait d’union est obsolète. Si seule la v1 est installée, effectuez une mise à niveau vers Docker Compose v2 ou Docker Desktop, qui l'inclut par défaut.
La création du conteneur échoue¶
Symptôme : docker compose up --build échoue lors de l'étape de génération Go ou Node.
Correction : Assurez-vous de disposer de suffisamment d'espace disque et de mémoire. Les versions Docker peuvent être gourmandes en ressources :
# Clean up unused Docker resources
docker system prune -f
# Retry the build
docker compose up -d --build
Problèmes de connexion WebSocket¶
Symptôme : L'interface utilisateur affiche « Déconnecté » ou le cockpit ne reçoit pas de mises à jour en temps réel.
Correction : Assurez-vous que le backend est en cours d'exécution et accessible sur le port 8082. En mode développement, le proxy Vite gère automatiquement le transfert WebSocket. En mode Docker, nginx à l'intérieur du conteneur frontend gère le proxy.