Journal d'audit¶
Stentor enregistre automatiquement toutes les actions de l'opérateur dans une piste d'audit persistante. Chaque demande d'API authentifiée qui réussit (état HTTP < 400) est enregistrée avec l'identité de l'opérateur, l'action, la cible et l'adresse IP du client. Les opérations sensibles (accès aux identifiants, commandes shell, transferts de fichiers) sont enrichies de beacons spécifiques à l'opération.
Comment ça marche¶
Le middleware d'audit intercepte toutes les requêtes API authentifiées une fois que le gestionnaire a terminé :
- Capture l'identité de l'opérateur à partir du jeton JWT (ID utilisateur, e-mail, rôle)
- Enregistre la méthode HTTP et le chemin en tant qu'« action » (par exemple,
POST /api/v1/cockpit/beacons/:id/shell) - Extrait le type de cible et l'ID de cible des paramètres d'itinéraire
- Enrichit les opérations sensibles avec des beacons d'opération (voir ci-dessous)
- Écrit l'événement de manière asynchrone (tirer et oublier, ne bloque jamais la demande)
Ce qui n'est PAS enregistré
- Les requêtes ayant échoué (statut HTTP >= 400) sont exclues
- Les contrôles de santé (
/health) sont exclus - Les requêtes non authentifiées (pas de JWT) sont exclues
Interrogation des événements d'audit¶
Point de terminaison de l'API¶
Paramètres de requête¶
| Paramètre | Type | Description |
|---|---|---|
operator_id | UUID | Filtrer par opérateur |
action | chaîne | Filtrer par action (par exemple, POST /api/v1/cockpit/beacons/:id/shell) |
target_type | chaîne | Filtrer par type de cible (par exemple, beacons, listeners) |
target_id | chaîne | Filtrer par ID de ressource cible |
since | RFC3339 | Limite de temps inférieure |
until | RFC3339 | Limite de temps supérieure |
limit | int | Résultats maximum (20 par défaut, 100 maximum) |
offset | int | Décalage de pagination |
Exemples¶
Format de réponse¶
{
"events": [
{
"id": "a1b2c3d4-...",
"operator_id": "e5f6a7b8-...",
"operator_email": "[email protected]",
"action": "POST /api/v1/cockpit/beacons/:id/shell",
"target_type": "beacons",
"target_id": "beacon-uuid",
"details": {
"status": 200,
"query": "",
"operation": "shell_command"
},
"source_ip": "10.10.10.1",
"created_at": "2026-02-19T14:30:22Z"
}
],
"total": 245,
"limit": 20,
"offset": 0
}
Opérations enrichies¶
Le middleware d'audit marque les opérations sensibles avec un contexte supplémentaire dans les champs details.operation ou details.credential_op :
| Catégorie | Beacon d'opération | Déclencheur |
|---|---|---|
| Coquille | shell_command | Toute exécution de commande shell |
| Fichiers | file_download, file_upload | Opérations de transfert de fichiers |
| SSH | ssh_connect, ssh_inject, ssh_download, ssh_upload | Opérations de session SSH |
| Identifiants | hashdump, logonpasswords, mimikatz, chromedump, dcsync, keylogger | Commandes de collecte d'informations d'identification |
| Identifiants | pkinit, unpac, shadow_creds, esc_attack, acl_attack, rbcd_attack | Attaques d’identifiants AD |
| Identifiants | gpo_attack, dcshadow, ticket_attack, laps_dump, gmsa_dump | Attaques de privilèges de domaine |
Schéma de base de données¶
CREATE TABLE IF NOT EXISTS audit_events (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
operator_id UUID REFERENCES users(id) ON DELETE SET NULL,
operator_email VARCHAR(255) NOT NULL DEFAULT '',
action TEXT NOT NULL,
target_type TEXT NOT NULL DEFAULT '',
target_id TEXT NOT NULL DEFAULT '',
details JSONB NOT NULL DEFAULT '{}',
source_ip VARCHAR(45) NOT NULL DEFAULT '',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
Indexé pour des requêtes efficaces sur l'opérateur, l'action, la cible et l'horodatage.