Aller au contenu

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é :

  1. Capture l'identité de l'opérateur à partir du jeton JWT (ID utilisateur, e-mail, rôle)
  2. Enregistre la méthode HTTP et le chemin en tant qu'« action » (par exemple, POST /api/v1/cockpit/beacons/:id/shell)
  3. Extrait le type de cible et l'ID de cible des paramètres d'itinéraire
  4. Enrichit les opérations sensibles avec des beacons d'opération (voir ci-dessous)
  5. É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

GET /api/v1/audit/events

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

curl -s "https://stentor.app/api/v1/audit/events?limit=10" \
  -H "Authorization: Bearer $TOKEN" | jq
curl -s "https://stentor.app/api/v1/audit/events?operator_id=OPERATOR_UUID&limit=50" \
  -H "Authorization: Bearer $TOKEN" | jq
curl -s "https://stentor.app/api/v1/audit/events?action=POST+/api/v1/c2/beacons/:id/hashdump" \
  -H "Authorization: Bearer $TOKEN" | jq
curl -s "https://stentor.app/api/v1/audit/events?since=2026-02-19T00:00:00Z&until=2026-02-19T23:59:59Z" \
  -H "Authorization: Bearer $TOKEN" | jq

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.