API-Security erfordert einen systematischen Ansatz - von Design über Development bis Operations. Ein ungesicherter Endpoint kann die gesamte Anwendung kompromittieren. OWASP API Top 10 ist ein guter Ausgangspunkt, aber nicht alles - jede API hat eine einzigartige Angriffsfläche.”
Freitagabend. Security-Team bekommt einen Alert: ungewöhnliches Traffic-Muster auf API. Analyse zeigt: Angreifer hat Endpoint /api/users/{id} gefunden, der Daten für jeden Nutzer per ID zurückgibt. Iteriert durch Millionen IDs, scrapt die gesamte Nutzerdatenbank. BOLA (Broken Object Level Authorization) - Endpoint prüft nicht, ob der anfragende Nutzer das Recht hat, die Daten dieses spezifischen Nutzers zu sehen.
Lesen Sie auch: Phishing im KI-Zeitalter 2026: Wie erkennt und verteidigt ma
Daten von 3 Millionen Nutzern geleakt. DSGVO-Breach-Meldung. Strafe, Reputation, Klagen. Und alles, was es brauchte, war eine Prüfung: “Hat User X das Recht auf Objekt Y?”
API ist überall. Mobile Apps kommunizieren mit Backend über API. Single Page Applications - über API. Microservices - API. Third-Party-Integrationen - API. IoT-Geräte - API. API ist die Hauptangriffsfläche moderner Anwendungen. Und oft am wenigsten geschützt.
Warum ist API-Security schwieriger als traditionelle Web-Security?
APIs haben keine “Login-Seite”. Traditionelle Web-App: Es gibt Login-Formular, es gibt Session, es gibt Cookies. API: Bearer Token, API Key, JWT - verschiedene Mechanismen, verschiedene Schwachstellen.
Machine-to-Machine-Kommunikation. APIs dienen oft anderen Systemen, nicht Menschen. Schwieriger, traditionelle Anti-Automatisierungs-Maßnahmen (CAPTCHA) anzuwenden.
Scale und Velocity. API verarbeitet tausende Requests pro Sekunde. Angriffe können subtil sein - nicht DDoS, sondern langsame Datenextraktion über Monate.
Dokumentation als Angriffsfläche. OpenAPI/Swagger-Specs sind öffentlich. Angreifer weiß genau, welche Endpoints existieren, welche Parameter sie akzeptieren.
Business-Logic-Exposition. API exponiert Business-Logic direkt. Web-App kann Logik hinter UI verstecken - API hat keine solche Schicht.
Mehrere Consumer. Eine API bedient: Mobile App, Web App, Third-Party-Integrationen, interne Services. Jeder hat andere Sicherheitsbedürfnisse.
Was sind die wichtigsten Bedrohungen laut OWASP API Top 10?
API1: Broken Object Level Authorization (BOLA) - API prüft nicht, ob Nutzer das Recht auf ein spezifisches Objekt hat. /api/orders/123 - kann Nutzer Order 123 sehen, oder nur seine eigenen?
API2: Broken Authentication - schwache Authentifizierungsmechanismen: schwache Tokens, kein Ablauf, Credential-Stuffing-Anfälligkeit.
API3: Broken Object Property Level Authorization - Nutzer kann Objekt sehen, aber nicht alle Felder, oder kann Felder modifizieren, die er nicht sollte.
API4: Unrestricted Resource Consumption - keine Limits: Rate Limiting, Payload-Größe, Query-Komplexität. Führt zu DoS, exzessiven Kosten.
API5: Broken Function Level Authorization - Nutzer ruft Admin-Funktionen (/api/admin/delete-user) auf, die nicht für ihn bestimmt sind.
API6: Unrestricted Access to Sensitive Business Flows - Automatisierung von Geschäftsoperationen (Massen-Ticketkauf, Credential Stuffing, Scraping).
API7: Server Side Request Forgery (SSRF) - API akzeptiert URL vom Nutzer und macht Request - Angreifer kann internes Netzwerk scannen.
API8: Security Misconfiguration - Standard-Configs, verbose Errors, unnötige HTTP-Methoden, fehlende Security-Header.
API9: Improper Inventory Management - alte API-Versionen noch zugänglich, undokumentierte Endpoints, veraltete Features nicht deaktiviert.
API10: Unsafe Consumption of APIs - Ihre API konsumiert Third-Party-APIs ohne ordentliche Validierung - Supply-Chain-Risiko.
Wie implementiert man ordentliche Authentication für API?
OAuth 2.0 + OpenID Connect. Standard für delegierte Authorization und Authentication. Nutzen Sie bewährte Implementierungen (Auth0, Okta, Keycloak), nicht selbst bauen.
JWT (JSON Web Tokens) Best Practices:
- Starken Signaturalgorithmus verwenden (RS256 > HS256 für öffentliche Clients)
- Kurze Ablaufzeiten (15 Min Access Token + Refresh Token Flow)
- Signatur, Ablauf, Issuer, Audience validieren
- Signing Keys sicher speichern (HSM, KMS)
- Token Binding / Proof of Possession erwägen
API Keys - wann verwenden:
- Service-to-Service-Authentication (nur serverseitig)
- Aufrufende Anwendung identifizieren (nicht Nutzer)
- Immer über HTTPS
- Regelmäßig rotieren
- Scope und Rate Limit pro Key
Nicht tun:
- Basic Auth (außer über HTTPS und für Legacy-Support)
- Custom Token-Schemata ohne Krypto-Expertise
- Langlebige Tokens ohne Refresh-Mechanismus
- Tokens in URLs (werden geloggt, gecacht, in Referrern geleakt)
Multi-Faktor für sensitive Operationen. Token gibt Zugang, aber für DELETE /api/account zusätzliche Verifizierung verlangen.
Wie implementiert man Authorization auf Objekt- und Funktionsebene?
Object Level Authorization (vs. BOLA):
# Schlecht - gibt jede Order per ID zurück
def get_order(order_id):
return Order.find(order_id)
# Gut - prüft Ownership
def get_order(order_id, current_user):
order = Order.find(order_id)
if order.user_id != current_user.id:
raise AuthorizationError("Not your order")
return order
Function Level Authorization (vs. BFLA):
# Schlecht - jeder kann aufrufen
@app.route('/api/admin/users', methods=['DELETE'])
def delete_user(user_id):
User.delete(user_id)
# Gut - prüft Rolle
@app.route('/api/admin/users', methods=['DELETE'])
@require_role('admin')
def delete_user(user_id):
User.delete(user_id)
Property Level Authorization:
# Verschiedene Felder basierend auf Rolle zurückgeben
def serialize_user(user, requester):
data = {'id': user.id, 'name': user.name}
if requester.is_admin:
data['email'] = user.email
data['last_login'] = user.last_login
return data
Policy Engines verwenden. OPA (Open Policy Agent), Casbin - Authorization-Logik externalisieren. Zentralisiert, testbar, auditierbar.
Wie implementiert man Rate Limiting und Throttling?
Rate-Limiting-Strategien:
- Pro Nutzer/API Key (authentifizierte Requests)
- Pro IP (unauthentifiziert / als Fallback)
- Pro Endpoint (sensitive Endpoints strenger)
- Sliding Window vs. Fixed Window
Beispiel-Tiers:
- Anonym: 100 Requests/Stunde
- Basic-Nutzer: 1000 Requests/Stunde
- Premium: 10000 Requests/Stunde
- Interner Service: höhere Limits mit Monitoring
Implementierungsoptionen:
- API Gateway (Kong, Apigee, AWS API Gateway)
- Reverse Proxy (nginx, HAProxy)
- Application-Level (redis-basierte Counter)
- Cloud-native (AWS WAF, Cloudflare)
Response-Handling:
- 429 Too Many Requests zurückgeben
Retry-AfterHeader einschließen- Limit im Response Body erklären
- Exponential Backoff in Clients erwägen
Über Request Rate hinaus:
- Payload-Größen-Limits
- Query-Komplexitäts-Limits (GraphQL)
- Concurrent Connections Limit
- Kostenbasiertes Limiting (teure Operationen)
Wie validiert man Input und schützt vor Injection?
Alles validieren:
- Schema-Validierung (JSON Schema, OpenAPI-Validierung)
- Typprüfung (String, Integer, Email, UUID)
- Längenlimits
- Erlaubte Werte (Enums)
- Format-Validierung (Regex mit Vorsicht)
Output sanitizen/escapen, nicht Input. Prinzip: Input strikt validieren, Output für Kontext encodieren (HTML, SQL, Shell).
SQL Injection via API:
# Schlecht - String-Konkatenation
query = f"SELECT * FROM users WHERE name = '{name}'"
# Gut - parametrisierte Queries
query = "SELECT * FROM users WHERE name = %s"
cursor.execute(query, (name,))
NoSQL Injection (MongoDB):
# Schlecht - akzeptiert Objekt vom Nutzer
db.users.find(request.json) # Nutzer sendet {"$gt": ""}
# Gut - erwartete Struktur validieren
name = request.json.get('name')
if not isinstance(name, str):
raise ValidationError()
db.users.find({'name': name})
Command Injection:
# Schlecht - Nutzereingabe in Shell
os.system(f"ping {user_input}")
# Gut - Libraries verwenden, nicht Shell
import subprocess
subprocess.run(['ping', '-c', '1', validated_hostname], check=True)
Wie schützt man API vor SSRF?
SSRF-Szenario: API akzeptiert URL-Parameter, fetcht Resource:
# Verwundbar
@app.route('/api/fetch')
def fetch_url():
url = request.args.get('url')
return requests.get(url).content # Angreifer: url=http://169.254.169.254/
Mitigationen:
- Erlaubte Domains/IPs whitelisten
- Private IP-Ranges blockieren (10.x, 192.168.x, 169.254.x, 127.x)
- Cloud-Metadata-Endpoints blockieren (169.254.169.254)
- DNS-Auflösung verwenden und aufgelöste IP vor Verbindung prüfen
- Redirects deaktivieren oder Redirect-Ziele validieren
- Egress-Proxy mit Einschränkungen verwenden
# Besser
ALLOWED_HOSTS = ['api.trusted.com', 'cdn.trusted.com']
def fetch_url(url):
parsed = urlparse(url)
if parsed.hostname not in ALLOWED_HOSTS:
raise SecurityError("Host not allowed")
# Zusätzlich: DNS auflösen, IP prüfen
return requests.get(url, allow_redirects=False).content
Wie überwacht und erkennt man Angriffe auf API?
Logging-Essentials:
- Alle Authentifizierungsversuche (Erfolg/Fehlschlag)
- Authorization-Fehlschläge
- Rate-Limit-Treffer
- Error-Responses (4xx, 5xx-Muster)
- Ungewöhnliche Muster (außerhalb Geschäftszeiten, ungewöhnliche Geolocations)
NICHT loggen:
- Vollständige Credentials/Tokens
- PII unnötigerweise
- Sensitive Geschäftsdaten
Anomalie-Erkennung:
- Baseline normaler Traffic-Muster
- Bei Abweichungen alertieren (Volumen, Endpoints, User Agents)
- Sequenzanalyse (ungewöhnliche API-Call-Sequenzen)
API-spezifisches Monitoring:
- Authentication-Failure-Spikes (Credential Stuffing)
- Sequentieller ID-Zugriff (BOLA-Exploitation)
- Ungewöhnliches Datenvolumen pro Nutzer (Datenexfiltration)
- Zugriff auf veraltete Endpoints
Tools:
- API Gateways mit Analytics (Kong, Apigee)
- SIEM-Integration (Splunk, ELK, Datadog)
- Spezialisierte API-Security (Salt Security, Traceable, Noname Security)
Wie testet man API-Security?
DAST (Dynamic Application Security Testing):
- OWASP ZAP (kostenlos, skriptfähig)
- Burp Suite (professioneller Standard)
- Postman Security Tests
- API-spezifische Scanner (Astra, APIsec)
SAST für API-Code:
- SonarQube-Regeln für API-Security
- Semgrep Custom Rules
- CodeQL-Queries
Manuelle Test-Checkliste:
- Authorization-Testing (auf Ressourcen anderer Nutzer zugreifen)
- Authentication-Bypass-Versuche
- Injection-Testing (SQL, NoSQL, Command)
- Rate-Limiting-Validierung
- Error-Message-Information-Disclosure
- Deprecated-Endpoint-Discovery
- IDOR (Insecure Direct Object Reference) Testing
Fuzzing:
- Ungültige Input-Typen
- Grenzwerte
- Malformed JSON/XML
- Unicode-Grenzfälle
Penetration Testing:
- Regelmäßige professionelle Pentests
- Bug-Bounty-Programme für APIs
- Red-Team-Übungen
Wie baut man einen sicheren API-Development-Lifecycle?
Design-Phase:
- Threat Modeling für API
- Authentication/Authorization-Anforderungen definieren
- Rate-Limiting-Strategie planen
- Für minimale Datenexposition designen
Development:
- Secure-Coding-Richtlinien für API
- Code Review mit Security-Fokus
- Pre-Commit-Hooks für Secrets-Erkennung
- Dependency-Scanning
Testing:
- Security-Unit-Tests (Authorization-Logik)
- Integration-Security-Tests
- DAST in CI/CD-Pipeline
- Manuelle Security-Review für sensitive Endpoints
Deployment:
- Security-Configuration-Review
- Secrets-Management (nicht im Code)
- Nur HTTPS, ordentliche TLS-Config
- API-Gateway-Security-Features aktiviert
Operations:
- Continuous Monitoring
- Incident-Response-Plan für API-Breaches
- Regelmäßige Security-Assessments
- Deprecation-Prozess für alte Versionen
Tabelle: API-Security-Checkliste
| Kategorie | Kontrolle | Priorität | Wie prüfen | Tools |
|---|---|---|---|---|
| Authentication | OAuth 2.0 / OIDC-Implementierung | Kritisch | Code Review, Pentest | Auth0, Keycloak |
| Authentication | JWT ordentliche Validierung | Kritisch | Unit Tests, DAST | jwt.io, Burp |
| Authentication | Token-Ablauf < 15 Min | Hoch | Config Review | - |
| Authorization | Object-Level-Access-Checks | Kritisch | Code Review, Pentest | OPA, Casbin |
| Authorization | Function-Level-Access-Checks | Kritisch | Code Review, Pentest | Rollenbasierte Tests |
| Authorization | Property-Level-Filterung | Hoch | Code Review | Custom Tests |
| Input-Validierung | Schema-Validierung | Hoch | Unit Tests, Fuzzing | JSON Schema, AJV |
| Input-Validierung | SQL-Injection-Prävention | Kritisch | DAST, Code Review | SQLMap, Burp |
| Rate Limiting | Pro-User/IP-Limits | Hoch | Load Testing | API Gateway, Redis |
| Rate Limiting | Payload-Größen-Limits | Mittel | Config Review | nginx, API Gateway |
| Verschlüsselung | Nur HTTPS | Kritisch | SSL Labs Test | SSL Labs, testssl.sh |
| Verschlüsselung | Nur TLS 1.2+ | Hoch | Config Scan | nmap, SSL Labs |
| Logging | Auth-Events geloggt | Hoch | Log Review | SIEM, ELK |
| Logging | Keine Secrets in Logs | Kritisch | Log Audit | grep, Log-Analyse |
| Monitoring | Anomalie-Erkennung | Mittel | Alert Review | Datadog, spezialisierte Tools |
| Inventory | Alle Endpoints dokumentiert | Hoch | API Discovery | Swagger, API-Katalog |
| Inventory | Alte Versionen deprecated | Mittel | Traffic-Analyse | API Gateway Analytics |
API-Security erfordert einen systematischen Ansatz - von Design über Development bis Operations. Ein ungesicherter Endpoint kann die gesamte Anwendung kompromittieren. OWASP API Top 10 ist ein guter Ausgangspunkt, aber nicht alles - jede API hat eine einzigartige Angriffsfläche.
Wichtige Erkenntnisse:
- BOLA (Broken Object Level Authorization) ist die häufigste Schwachstelle - immer Ownership prüfen
- Authentication ist nicht Authorization - Token haben ≠ Recht auf Resource haben
- Rate Limiting schützt vor Abuse und DoS - auf mehreren Ebenen implementieren
- Input-Validierung muss strikt sein - nichts von außen vertrauen
- Monitoring ist entscheidend - Sie wissen nicht, dass Sie angegriffen werden, wenn Sie nicht schauen
- API-Inventar - Sie müssen wissen, was Sie haben, um es zu schützen
- Regelmäßig testen - automatisiert + manuell + Pentest
API-Security ist ein kontinuierlicher Prozess, kein einmaliges Projekt. Jeder neue Endpoint ist eine neue Angriffsfläche. Jede Änderung erfordert Security Review.
ARDURA Consulting stellt Security- und DevSecOps-Spezialisten über Body Leasing mit Erfahrung in der Absicherung von APIs für Enterprise-Anwendungen bereit. Unsere Experten helfen beim Design, der Implementierung und dem Testen sicherer APIs. Sprechen wir über die Absicherung Ihrer Schnittstellen.