Dieses Dokument ist für Workshop-Leiter. Auf Deutsch.
| Service | URL | Zweck |
|---|---|---|
| crAPI | https://crapi.security-lab.cloud | Haupt-Angriffsziel |
| MailHog | https://mailhog.security-lab.cloud | Fake-E-Mail (für Registrierungen) |
| Hoppscotch | https://hoppscotch.security-lab.cloud | API Client für Teilnehmer |
| APISec Console | https://apisec.security-lab.cloud | Akamai API Security (Findings anzeigen) |
| AI API | https://ai.security-lab.cloud | Mock LLM API mit Schwachstellen |
| Portal | https://portal.security-lab.cloud/workshop | Dokumentation für Teilnehmer |
participant01@workshop.lab bis participant30@workshop.labWorkshop@2026 (alle gleich)facilitator01@workshop.lab bis facilitator10@workshop.labTrainer@2026 (alle gleich)michael@michael-jung.comcd workshop && python3 create-accounts.py --checkcurl https://ai.security-lab.cloud/v1/models/portal/workshop/collection.json erreichbarssh root@100.86.110.7 "uptime && free -h"ssh root@100.86.110.7 "docker ps | grep crapi"ssh root@100.86.110.7 "docker service ls | grep engine"Für die BOLA-Demo brauchen alle Teilnehmer die UUID eines "Opfer-Fahrzeugs".
Empfehlung: Nutze participant01@workshop.lab als festes Opfer:
Bekannte UUID (vorab ermittelt):
cfc047d1-6ea8-4c87-aa8d-a8938d2354f9
OTHER_UUID = cfc047d1-6ea8-4c87-aa8d-a8938d2354f9TOKEN=$(curl -s -X POST https://crapi.security-lab.cloud/identity/api/auth/login \
-H 'Content-Type: application/json' \
-d '{"email":"participant01@workshop.lab","password":"Workshop@2026"}' \
| python3 -c 'import sys,json; print(json.load(sys.stdin)["token"])')
curl -s https://crapi.security-lab.cloud/identity/api/v2/vehicle/vehicles \
-H "Authorization: Bearer $TOKEN" | python3 -m json.tool
ssh root@100.86.110.7 "docker exec \$(docker ps | grep postgres | awk '{print \$1}' | head -1) \
psql -U postgres -d noname -t -c \"SELECT key, value FROM engine_configs WHERE key LIKE 'POC%'\""
Erwartet: POC.IS_POC = true
Falls nicht: UPDATE engine_configs SET value = 'true' WHERE key = 'POC.IS_POC';
Dann Engine neu starten:
ssh root@100.86.110.7 "docker service update --force noname_engine && docker service update --force noname_light-engine"
ssh root@100.86.110.7 "docker exec \$(docker ps | grep postgres | awk '{print \$1}' | head -1) \
psql -U postgres -d noname -t -c \
\"SELECT COUNT(*) FROM apis_computed_data WHERE learning_status = '11'\""
Erwartet: 500+ Endpoints auf Learned. Falls <100:
ssh root@100.86.110.7 "docker exec \$(docker ps | grep postgres | awk '{print \$1}' | head -1) \
psql -U postgres -d noname -c \
\"UPDATE apis_computed_data SET learning_status = '11' WHERE learning_status IS NULL OR learning_status = '';\""
python3 /tmp/bola_attack.py
Workshop@2026 (kein Leerzeichen, kein Zeilenumbruch)?bash
ssh root@100.86.110.7 "docker compose -f /opt/crapi/deploy/docker/docker-compose.yml restart crapi-identity"ssh root@100.86.110.7 "docker service logs noname_engine --tail 50"ssh root@100.86.110.7 "systemctl status mock-llm-api"ssh root@100.86.110.7 "journalctl -u mock-llm-api -n 50"ssh root@100.86.110.7 "systemctl restart mock-llm-api"ssh root@100.86.110.7 "uptime && free -h && docker stats --no-stream --format 'table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}' | head -15"
Bei hohem Swap: ssh root@100.86.110.7 "swapoff -a && swapon -a"
Das Reset-Skript läuft auf dem Server (/opt/workshop/), weil es die crAPI-Datenbanken
über docker exec bereinigt. Es ist strikt auf die Teilnehmer-Accounts begrenzt
(participantNN@workshop.lab) — die ~543k Baseline-User/-Fahrzeuge und ~63k Baseline-Posts
bleiben unangetastet. Es gibt kein ungescoptes DELETE/UPDATE.
Im Portal gibt es im Workshop-Kasten die Karte „⚠ Reset Workshop" → https://portal.security-lab.cloud/workshop/reset
reset-workshop.py --reset [--apply] --no-verify (schnell, ohne die 20 Logins).ssh root@100.86.110.7 "cd /opt/workshop && python3 reset-workshop.py --reset"
Counts prüfen: betroffene Posts / Profile / Locations müssen klein und teilnehmer-scoped sein (bei einem frischen Lauf typ. Posts=0, Profile=20, Locations≈5).
ssh root@100.86.110.7 "cd /opt/workshop && python3 reset-workshop.py --reset --apply"
# zusätzlich Orders/Coupons/Service-Requests der Teilnehmer löschen:
ssh root@100.86.110.7 "cd /opt/workshop && python3 reset-workshop.py --reset --apply --purge-extras"
Was pro Teilnehmer-Account bereinigt wird (gescopt):
- Community-Posts (Mongo, author.email = Teilnehmer)
- Profil (Name + available_credit auf Default)
- Fahrzeug-Standort auf Default
- Hoppscotch environment.json im Portal (TOKEN/MY_UUID/ENUM_IDX geleert)
Audit-Log: /opt/workshop/reset.log. Standardmäßig nur Teilnehmer 01–20; --all für alle 30+10.
ssh root@100.86.110.7 "cd /opt/workshop && python3 reset-workshop.py" # Status-Check
ssh root@100.86.110.7 "cd /opt/workshop && python3 reset-workshop.py --recreate" # fehlende neu anlegen
In APISec Console: Issues → alle Workshop-Findings auf "Resolved" setzen
Oder per SQL (vorsicht!):
ssh root@100.86.110.7 "docker exec \$(docker ps | grep postgres | awk '{print \$1}' | head -1) \
psql -U postgres -d noname -c \
\"UPDATE issues SET status = 'RESOLVED_BY_API_SECURITY' WHERE displayable_user LIKE '%workshop.lab%'\""
sub_filter injiziert (Datei
/etc/nginx/sites-available/hoppscotch.security-lab.cloud, Repo-Kopie unter
workshop/nginx/) und überlebt Hoppscotch-Container-Updates, da er außerhalb des
Containers liegt. Nach einem Hoppscotch-Update einmal kurz prüfen, dass er noch erscheint.Die vollständige Account-Tabelle (mit VINs und UUIDs) befindet sich in:
/Users/michael/Claude/Server/APISec-Demo/workshop/accounts.csv
Generiert durch: python3 create-accounts.py
ssh root@100.86.110.7
# Nur via Tailscale (100.64.0.0/10) — kein direkter Public-IP-Zugriff auf Port 22
# Container-Status
ssh root@100.86.110.7 "docker ps --format 'table {{.Names}}\t{{.Status}}'"
# crAPI Logs
ssh root@100.86.110.7 "docker compose -f /opt/crapi/deploy/docker/docker-compose.yml logs --tail 50"
# APISec Engine Status
ssh root@100.86.110.7 "docker service ls | grep -E 'engine|replicas'"
# Traffic-Dashboard live
# https://traffic.security-lab.cloud
# MailHog (alle Workshop-Mails)
# https://mailhog.security-lab.cloud
Facilitator Guide — Akamai API Security Workshop | security-lab.cloud