Facilitator Guide — API Security Workshop

Dieses Dokument ist für Workshop-Leiter. Auf Deutsch.


Übersicht Workshop-Umgebung

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

Credentials

Teilnehmer (30 Accounts)

Facilitatoren (10 Accounts)

APISec Login


Vor dem Workshop: Checkliste

Am Vortag

Morgens vor Workshop-Start


BOLA-Demo Setup

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

  1. UUID an alle Teilnehmer mitteilen (ins Chat / auf Whiteboard)
  2. Alle anderen (participant02–30) setzen OTHER_UUID = cfc047d1-6ea8-4c87-aa8d-a8938d2354f9

UUID live ermitteln (falls nötig):

TOKEN=$(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

APISec Checks

POC-Mode überprüfen

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"

Learning-Status überprüfen

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 = '';\""

BOLA manuell triggern (falls keine Findings erscheinen)

python3 /tmp/bola_attack.py

Häufige Probleme

"Login schlägt fehl" (Teilnehmer)

"Kein Vehicle UUID" (Teilnehmer)

"BOLA zeigt 401 statt 200"

"Kein BOLA-Finding in APISec nach 5 Minuten"

"AI API nicht erreichbar"

"Server-Load zu hoch"

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"


Reset zwischen Workshop-Runden

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.

Option A — Web-Reset (am einfachsten, passwortgeschützt)

Im Portal gibt es im Workshop-Kasten die Karte „⚠ Reset Workshop" → https://portal.security-lab.cloud/workshop/reset

Option B — CLI (volle Kontrolle, mit Account-Verify)

1. Dry-Run — zeigt nur, was passieren würde (schreibt nichts)

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).

2. Reset anwenden

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.

3. Accounts verifizieren / fehlende neu anlegen

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

4. APISec Findings bereinigen

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%'\""

5. Onboarding gegenchecken


Accounts-Tabelle

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-Zugang zum Server

ssh root@100.86.110.7
# Nur via Tailscale (100.64.0.0/10) — kein direkter Public-IP-Zugriff auf Port 22

Nützliche Befehle

# 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