Analyser un journal d'audit à la recherche d'activité suspecte avec l'IA, en rétention zéro des données
Un agent lit une journée d'événements d'administration et signale la séquence suspecte avec les identifiants d'événements et une réponse recommandée.
- Connexion en lecture seule
- Rétention zéro des données
- Plafond de budget
Regardez une vraie exécution
Une vraie exécution du 7 oct. 2026, rejouée. Modèle : openai/gpt-6-luna.
- En file d'attentebudget de $0.03 réservé
- MicroVMmicroVM ready
- MicroVMworker started · shell off · web off
- Connexionops GET /audit-log
- Résultat
ops GET → 200 - MicroVMmicroVM destroyed
- Réussie2 appels au modèle, 3,902 jetonsSortie enregistrée (en anglais)
Verdict: High-severity suspicious activity: [email protected]’s account had a linked off-hours access and privilege/data-access sequence from an IP not seen in its earlier events.
Severity Event IDs Why unusual Recommended response high ev013–ev020 Three failed logins were followed by a successful login using a recovery code at 23:14 UTC, outside the stated 08:00–19:00 UTC business hours. From the same IP, the account then granted admin access to an external address, exported 48,210 rows, created an API key, and that address logged in. Contain the account and review its sessions, recovery-code use, role change, export, and API key; revoke access or credentials as appropriate. No finding for the rest of the log.
- Worker détruit$0.003879 facturé, $0.026121 libéré
La rétention zéro des données était activée pour cette exécution.
Lancez-le vous-même
Ouvrez l'exemple dans le playground avec toute la requête déjà remplie. Il s'exécute sur votre propre compte, dans le budget indiqué, sur les mêmes systèmes d'exemple en lecture seule.
Budget pour cet exemple : $0.03
Fonctionnement
Les journaux d'audit sont sensibles : l'exécution utilise donc la rétention zéro des données et une connexion en lecture seule. L'agent désigne les identifiants d'événements exacts, explique pourquoi la séquence est inhabituelle (hors horaires, authentification multifacteur contournée, changement de privilèges, export en masse) et n'accuse aucune personne.
Ce que l'agent peut et ne peut pas faire
Les permissions font partie de la requête. Tout ce qui n'est pas listé ici n'est pas disponible pour l'exécution.
| Paramètre | Autorisé |
|---|---|
| Connexions | ops : GET uniquement, sur ephemer.al/api/samples/ops-api |
| Web | Désactivé |
| Shell | Désactivé |
| Fichiers | Aucune |
| Rétention zéro des données | Activée : aucune trace n'est enregistrée et la sortie n'est renvoyée qu'une fois |
| Budget | $0.03, un plafond strict |
| Délai | 60 secondes |
Les identifiants n'entrent jamais dans la machine : un broker les ajoute à chaque appel et impose les méthodes ci-dessus.
Le code
Voici la requête exacte envoyée par l'exemple. Définissez EPHEMERAL_API_KEY avec une clé de membre de votre organisation.
curl -X POST $EPHEMERAL_URL/v1/runs \
-H "Authorization: Bearer $EPHEMERAL_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d @request.jsonCorps complet de la requête request.json
Le même corps, avec les fichiers en ligne.
{
"prompt": "Review the audit log from GET /audit-log on the ops connection and the business hours it states. Reply in Markdown, at most 200 words: a one-line verdict, then a table of suspicious findings with severity (high, medium, low), the event IDs, why they are unusual, and a recommended response. Treat patterns, not single events, as findings: an off-hours login alone is low. Say 'no finding' for the rest of the log in one line. Describe behavior of accounts, never accuse a person. Use only what the data returns and never guess; if a call fails or a field is missing, say so.",
"connections": {
"ops": {
"type": "http",
"url": "https://ephemer.al/api/samples/ops-api",
"auth": {
"type": "bearer",
"token": "sample_read_key"
},
"allowed_methods": [
"GET"
],
"instructions": "GET /audit-log returns the date, a note on business hours, and events with id, at (UTC), actor, action, target, ip, result and sometimes reason, mfa, rows or role."
}
},
"shell": false,
"timeout_seconds": 60,
"max_cost_micros": 30000,
"zero_data_retention": true
}